2011-11-05 6 views
41

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

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

enter image description here

+0

これはカスタムピンのカスタムビューに過ぎないと思いますが、本当の問題は何ですか? – Mat

+1

非常に良い質問..それはまた私に役立ちます..たくさんのJennis ..ありがとう –

+0

サンプルデモ - http://stackoverflow.com/questions/27519517/button-action-in-mkannotation-view-not-working/27519673#27519673 – Kampai

答えて

49

私は、カスタムコールアウトでピンをしたい理解しています。

カスタム吹き出しを作成することはできませんが、完全にカスタマイズされたビューで注釈を作成できます。つまり、最初のものが選択されたときに2番目の注釈を追加し、2番目の注釈ビューを吹き出しのように見せかけることです。

これが答えのユーザーdjibouti33jacob-jenningsにより投稿ソリューションです:MKAnnotationView - Lock custom annotation view to pin on location updates、今度は非同期ソリューションからblog postに基づいています。説明のために、フォークされたプロジェクトの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; 
// ... 

注釈はそれ自身MKAnnotationViewの作成を処理したいアナウンスするAnnotationProtocolを実装しています。つまり、あなたの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 
     // ... 
    } 
} 

返されるビューは、それが選択/選択解除を処理するために望んでいることを発表するAnnotationViewProtocolを実装型AnnotationView、となります。したがって、マップビューコントローラでは、mapView:didSelectAnnotationView:メソッドとmapView:didDeselectAnnotationViewメソッドは以前と同じように委譲する必要があります。

注釈が選択されると、同じ動作に続く2番目の注釈(CalloutAnnotation)が追加されますが、この時点で返されたビュー(CalloutView)はXIBから初期化され、Core Graphicsコード(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; 
} 

I通知を使用吹き出しビューから別のビューコントローラをプッシュすることができるようにします。

トップにリンクされているSOの回答には、このコードを実装する2つの完全なプロジェクトが含まれています(クラス名は異なる場合があります)。私は上記のUMLをhttps://github.com/j4n0/calloutに使った別のプロジェクトを持っています。

+0

こんにちは、 素晴らしい仕事をしていただきありがとうございます。 私は注釈を作成しようとしていますが、その中に2つのボタンがあります。 ボタンをクリックすると、私のCalloutViewサブクラスのメソッドhandleTouchが呼び出されます。しかし、送信者は、ビュープロパティの注釈を持つUITapGestureRecognizerです。私はsender.viewに自分のボタンがあると予想されていましたか? よく知られている問題ですか?または私は何か間違っている? –

+0

はい、解決方法はhttps://github.com/j4n0/callout/issues/1で確認してください。 – Jano

+0

私は誰も私を助けることができるこのコードを実装する問題に直面している.. –

0

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

関連する問題