この画像に示すように、カスタムMKAnnotationViewコールアウトを作成します。私はいくつかのソリューションをテストしましたが、それらは左/右の画像とタイトル/サブタイトルのカスタマイズのみを許可します。誰かがソースコードやチュートリアルのリンクを教えてもらえますか?
現在、私は無知です。助けてください。
カスタムコールアウト付きのピンが欲しいとのことでした。
カスタムコールアウトは作成できませんが、完全にカスタマイズされたビューで注釈を作成できます。したがって、コツは、最初の注釈が選択されたときに2番目の注釈を追加し、2番目の注釈ビューを吹き出しの吹き出しのようにすることです。
これは、ユーザーが投稿したソリューションです djibouti および jacob-jennings 回答: MKAnnotationView-カスタムの注釈ビューをロックして、位置の更新をピン留めします 同様に、非同期ソリューションの ブログ投稿 に基づいています。説明のために、ここにフォークしたプロジェクトのUMLをいくつか示します。
これは大きなハックですが、カスタムアノテーションを実装するための最もクリーンな方法でもあります。
座標のあるNSObject "Content"クラス、使用するコールアウトビューのクラス(UMLではAnnotationViewですが、追加で作成してここで設定できます)、ランダムな値の辞書(タイトル、写真)から始めますURLなど。このクラスを使用して、MKAnnotationの「Annotation」オブジェクトを初期化します。
#import <MapKit/MapKit.h>
@interface Content : NSObject
@property (nonatomic,assign) CLLocationCoordinate2D coordinate;
// ...
@interface Annotation : NSObject <MKAnnotation, AnnotationProtocol>
-(id) initWithContent:(Content*)content;
// ...
Annotationは、AnnotationProtocolを実装して、独自のMKAnnotationViewの作成を処理することを通知します。つまり、MKMapViewDelegateには次のようなコードが必要です。
- (MKAnnotationView *)mapView:(MKMapView *)aMapView viewForAnnotation:(id<MKAnnotation>)annotation
{
// if this is a custom annotation, delegate the implementation of the view
if ([annotation conformsToProtocol:@protocol(AnnotationProtocol)]) {
return [((NSObject<AnnotationProtocol>*)annotation) annotationViewInMap:mapView];
} else {
// else, return a standard annotation view
// ...
}
}
返されるビューはタイプAnnotationViewになります。これは、AnnotationViewProtocolを実装して、選択/選択解除を処理する必要があることを通知します。したがって、マップビューコントローラーでは、メソッドmapView:didSelectAnnotationView:およびmapView:didDeselectAnnotationView:は、以前と同じようにデリゲートする必要があります。
アノテーションが選択されると、同じ動作に従う2番目のアノテーション(CalloutAnnotation)が追加されますが、今回は返されたビュー(CalloutView)がXIBから初期化され、(BaseCalloutViewに)コアグラフィックスコードを含み、叫ぶ。
CalloutViewクラスの初期化子:
- (id)initWithAnnotation:(CalloutAnnotation*)annotation
{
NSString *identifier = NSStringFromClass([self class]);
self = [super initWithAnnotation:annotation reuseIdentifier:identifier];
if (self!=nil){
[[NSBundle mainBundle] loadNibNamed:identifier owner:self options:nil];
// prevent the tap and double tap from reaching views underneath
UITapGestureRecognizer *tapGestureRecognizer = ...
}
return self;
}
コールアウトビューから別のビューコントローラーをプッシュできるようにするには、通知を使用しました。
SO私が上部でリンクした回答には、このコードを実装する2つの完全なプロジェクトが含まれています(クラス名は異なる場合があります)。上記のUMLを使用する別のプロジェクトがあります https:// github。 com/j4n0/callout 。
私はこの質問が2011年からであることを知っていますが、それでも検索でそれを見つけた人のために:iOS 9ではMKAnnotationView.detailCalloutAccessoryView
これは、標準のコールアウトを完全に置き換えます。
MKAnnotationViewにカスタムUIButtonを追加しました。そして、そのボタンをクリックすると、上記で示したのと同じようなビューを持つrootViewControllerを使用してpopOverが表示されます。