1

マップビューの特定の場所に表示する要素が複数あるため、特定の 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:) を呼び出す必要があります。

私もこのソリューションを見てきましたが、うまくいかないようで、基礎となるビュー(マップビュー)が呼び出されます。

4

1 に答える 1

0

OK、私にとってうまくいったのは、テーブルビューセルの最初のサブビューとして透明な背景色を持つ UIButton を追加することでした。セルのすべてのタップ イベントが UIButton によってキャッチされるようになりました。ところで、すべてのスワイプ イベントはテーブル ビューによってキャッチされるため、少なくとも問題なく動作します。

正直なところ、これは本当に良い解決策ではありませんが、私にとってはうまくいきます。さらなる提案をいただければ幸いです。

ベスト・ニック

于 2013-04-17T14:02:44.240 に答える