web-dev-qa-db-ja.com

MKAnnotationViewコールアウトをカスタマイズする

この画像に示すように、カスタムMKAnnotationViewコールアウトを作成します。私はいくつかのソリューションをテストしましたが、それらは左/右の画像とタイトル/サブタイトルのカスタマイズのみを許可します。誰かがソースコードやチュートリアルのリンクを教えてもらえますか?

現在、私は無知です。助けてください。

enter image description here

43
Janak Nirmal

カスタムコールアウト付きのピンが欲しいとのことでした。

カスタムコールアウトは作成できませんが、完全にカスタマイズされたビューで注釈を作成できます。したがって、コツは、最初の注釈が選択されたときに2番目の注釈を追加し、2番目の注釈ビューを吹き出しの吹き出しのようにすることです。

これは、ユーザーが投稿したソリューションです djibouti および jacob-jennings 回答: MKAnnotationView-カスタムの注釈ビューをロックして、位置の更新をピン留めします 同様に、非同期ソリューションの ブログ投稿 に基づいています。説明のために、ここにフォークしたプロジェクトのUMLをいくつか示します。 Annotation with custom XIB

これは大きなハックですが、カスタムアノテーションを実装するための最もクリーンな方法でもあります。

座標のある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

50
Jano

私はこの質問が2011年からであることを知っていますが、それでも検索でそれを見つけた人のために:iOS 9ではMKAnnotationView.detailCalloutAccessoryViewこれは、標準のコールアウトを完全に置き換えます。

1
bio

MKAnnotationViewにカスタムUIButtonを追加しました。そして、そのボタンをクリックすると、上記で示したのと同じようなビューを持つrootViewControllerを使用してpopOverが表示されます。

1
Mahesh