マップビューの特定の場所に表示する要素が複数あるため、特定の MKPinAnnotationView が選択されているときに、MKMapView に WEPopoverController を表示したいと考えています。
テーブルビューであるコンテンツの表示は、これまでのところ正常に機能します。MKPinAnnotationView をサブクラス化し、注釈ビューがクリックされると、カスタム プレゼンテーション メソッドを呼び出します。
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view {
[view openCustomPopoverInFrame:self.view.frame];
[mapView deselectAnnotation:view.annotation animated:NO];
if (_lastAnnotationView != view) {
[_lastAnnotationView closeCustomPopover];
_lastAnnotationView = view;
}
}
- (void) openCustomPopoverInFrame:(CGRect) frame {
CGRect fromFrame = self.frame; //Pin Annotation View Frame
WEPopoverContentViewController *contentViewController = [[WEPopoverContentViewController alloc] initWithStyle:UITableViewStylePlain];
contentViewController.delegate = self;
WEPopoverController *viewController = [[WEPopoverController alloc] initWithContentViewController:contentViewController];
//[viewController setPassthroughViews:[NSArray arrayWithObjects:contentViewController.view, contentViewController.tableView, nil]];
viewController.delegate = self;
//set the displayed content
....
_myPopoverController = [viewController retain];
[viewController presentPopoverFromRect:fromFrame inView:self.superview permittedArrowDirections:UIPopoverArrowDirectionUp | UIPopoverArrowDirectionDown animated:YES];
[contentViewController release];
[viewController release];
}
また、テーブルビュー セルでボタンを選択すると検索が機能し、期待される応答が得られます (メソッドが呼び出され、popovercontroller がビュー階層の最上位に留まります)。
私の問題は、WEPopoverController コンテンツ (ボタンが配置されていない中央のテーブル ビュー セルの 1 つ) をクリックすると、タップ イベントがマップ ビューに渡され、ポップオーバー コントローラーが非表示になることです。パススルー タップ イベントを防ぐにはどうすればよいですか?
passThroughViews を設定し、WETouchableView で hitTest:withEvent: メソッドを操作して常に nil を返すなど、いくつかの解決策を試しましたが、それ以上は役に立ちません。
ベスト・ニック
編集
私は今、WETouchableView の hitTest:withEvent: メソッドをもう少し詳細にデバッグしましたが、常に UITableViewCellContentView のインスタンスを返すようです。これは今のところ正しいはずです。
編集
もう少し明確にするために、ポップオーバーコントローラーを表示したいのですが、それがタップされると、通常の注釈の動作のように消えてしまい、基になるビューが呼び出されないようにする必要があります。それはビューの上にとどまる必要があり、タップ イベントはテーブル ビューによってキャッチされ、特定のメソッド (tableView:didSelectRowAtIndexpath:) を呼び出す必要があります。
私もこのソリューションを見てきましたが、うまくいかないようで、基礎となるビュー(マップビュー)が呼び出されます。