この画像に示すように、カスタムMKAnnotationViewコールアウトを作成します。いくつかのソリューションをテストしましたが、左右の画像とタイトル/サブタイトルのカスタマイズしかできません。誰も私にそれのためのいくつかのソースコードやチュートリアルのリンクを教えていただけますか?MKAnnotationViewコールアウトをカスタマイズする
現在、私は無知です。助けてください。
この画像に示すように、カスタムMKAnnotationViewコールアウトを作成します。いくつかのソリューションをテストしましたが、左右の画像とタイトル/サブタイトルのカスタマイズしかできません。誰も私にそれのためのいくつかのソースコードやチュートリアルのリンクを教えていただけますか?MKAnnotationViewコールアウトをカスタマイズする
現在、私は無知です。助けてください。
私は、カスタムコールアウトでピンをしたい理解しています。
カスタム吹き出しを作成することはできませんが、完全にカスタマイズされたビューで注釈を作成できます。つまり、最初のものが選択されたときに2番目の注釈を追加し、2番目の注釈ビューを吹き出しのように見せかけることです。
これが答えのユーザーdjibouti33とjacob-jenningsにより投稿ソリューションです:MKAnnotationView - Lock custom annotation view to pin on location updates、今度は非同期ソリューションからblog postに基づいています。説明のために、フォークされたプロジェクトの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;
// ...
注釈はそれ自身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に使った別のプロジェクトを持っています。
こんにちは、 素晴らしい仕事をしていただきありがとうございます。 私は注釈を作成しようとしていますが、その中に2つのボタンがあります。 ボタンをクリックすると、私のCalloutViewサブクラスのメソッドhandleTouchが呼び出されます。しかし、送信者は、ビュープロパティの注釈を持つUITapGestureRecognizerです。私はsender.viewに自分のボタンがあると予想されていましたか? よく知られている問題ですか?または私は何か間違っている? –
はい、解決方法はhttps://github.com/j4n0/callout/issues/1で確認してください。 – Jano
私は誰も私を助けることができるこのコードを実装する問題に直面している.. –
MKAnnotationViewでカスタムUIButtonを追加しました。そしてそのボタンをクリックすると、上に示したのと同じようなビューで、rootViewControllerのpopOverが表示されました。
これはカスタムピンのカスタムビューに過ぎないと思いますが、本当の問題は何ですか? – Mat
非常に良い質問..それはまた私に役立ちます..たくさんのJennis ..ありがとう –
サンプルデモ - http://stackoverflow.com/questions/27519517/button-action-in-mkannotation-view-not-working/27519673#27519673 – Kampai