MKAnnotationView をクリックすると視覚化される iOS8 MapView Callout バブルをカスタマイズしたいと考えています。デフォルトの吹き出しは少し制限がある (タイトル、サブタイトル、および 2 つのアクセサリ ビューしかない) ため、別の解決策を見つけるのに苦労しています。ここに2つの可能な方法と私が直面している相対的な問題があります:
問題 1) カスタム吹き出しの作成
Appleのドキュメントを掘り下げると、これが見つかりました:
標準の吹き出しの代わりにカスタム ビューを使用する場合は、ユーザーが吹き出しを操作したときに吹き出しが適切に表示および非表示になるように、追加の作業を行う必要があります。次の手順は、ボタンを含むカスタム コールアウトを作成するプロセスの概要を示しています。
カスタム コールアウトを表す NSView または UIView サブクラスを設計します。カスタム コンテンツを描画するには、サブクラスで drawRect: メソッドを実装する必要がある可能性があります。吹き出しビューを初期化し、ボタンに関連するアクションを実行するビュー コントローラーを作成します。リスト 6-7 に示すように、アノテーション ビューで、hitTest: を実装して、アノテーション ビューの境界外でコールアウト ビューの境界内にあるヒットに応答します。注釈ビューで setSelected:animated: を実装して、ユーザーがクリックまたはタップしたときに注釈ビューのサブビューとして吹き出しビューを追加します。ユーザーがコールアウト ビューを選択したときにコールアウト ビューがすでに表示されている場合、 setSelected: メソッドは注釈ビューからコールアウト サブビューを削除する必要があります (リスト 6-8 を参照)。注釈ビューの initWithAnnotation: メソッドで、canShowCallout プロパティを NO に設定して、ユーザーが注釈を選択したときにマップに標準の吹き出しが表示されないようにします。リスト 6-7 は、hitTest を実装する例を示しています。これは、注釈ビューの境界外にある可能性のあるコールアウト ビューでヒットを処理します。
Listing 6-7 Responding to hits within a custom callout
- (NSView *)hitTest:(NSPoint)point
{
NSView *hitView = [super hitTest:point];
if (hitView == nil && self.selected) {
NSPoint pointInAnnotationView = [self.superview convertPoint:point toView:self];
NSView *calloutView = self.calloutViewController.view;
hitView = [calloutView hitTest:pointInAnnotationView];
}
return hitView;
}
リスト 6-8 は、 setSelected:animated: を実装して、ユーザーが注釈ビューを選択したときにカスタム コールアウト ビューの到着と終了をアニメーション化する例を示しています。
Listing 6-8 Adding and removing a custom callout view
- (void)setSelected:(BOOL)selected
{
[super setSelected:selected];
// Get the custom callout view.
NSView *calloutView = self.calloutViewController.view;
if (selected) {
NSRect annotationViewBounds = self.bounds;
NSRect calloutViewFrame = calloutView.frame;
// Center the callout view above and to the right of the annotation view.
calloutViewFrame.origin.x = -(NSWidth(calloutViewFrame) - NSWidth(annotationViewBounds)) * 0.5;
calloutViewFrame.origin.y = -NSHeight(calloutViewFrame) + 15.0;
calloutView.frame = calloutViewFrame;
[self addSubview:calloutView];
} else {
[calloutView.animator removeFromSuperview];
}
}
さて、この Objective-C コードを Swift に変換しようとすると、次のプロパティが見つかりません。
NSView *calloutView = self.calloutViewController.view;
吹き出しの吹き出しビューにアクセスするにはどうすればよいですか?
問題 2) デフォルトの吹き出しの変更
前に述べたように、表示されるデフォルトのコールアウトには、タイトル、サブタイトル、および 2 つのアクセサリ ビューがあります。文字列のフォント スタイルやバブルの色をあまり変更できないことに気付きました。また、タイトルが 24 文字を超えると、アクセサリ ビューの位置がめちゃくちゃになります。この問題を回避するにはどうすればよいですか?