iOS:MKMapView中的WEPopoverController

时间:2013-04-17 12:28:24

标签: ios mkmapview hittest

因为我要在mapview中的给定位置显示多个元素,所以当选择了给定的MKPinAnnotationView时,我想在MKMapView中显示WEPopoverController。

呈现内容,这是一个tableview工作到目前为止工作正常。我已经将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];
}

同样选择tableview单元格中的按钮可以找到并获得预期的响应(调用该方法并且popovercontroller保持在视图层次结构的顶部)。

我的问题是,当我点击WEPopoverController内容(其中一个表格视图单元格,位于中心,没有按钮所在的位置)时,点击事件会传递到地图视图,因此会隐藏弹出控制器。我该怎么办,以防止通过点击事件?

我尝试了几种解决方案,例如设置passThroughViews并操作WETouchableView中的hitTest:withEvent:方法并始终返回nil,但这对我没有任何帮助。

最佳

NIC

修改

我现在已经调试了WETouchableView中的hitTest:withEvent:方法,而且看起来它总是返回一个UITableViewCellContentView的实例,我认为到目前为止应该是正确的。

修改

所以为了更清楚一点,我想显示一个弹出控制器,当它被点击时,它应该更新消失,就像它是通常的注释行为,也不应该调用底层视图。它应该保持在视图的顶部,并且tap事件应该被表视图捕获并调用特定的方法(tableView:didSelectRowAtIndexpath :)。

我也看过this解决方案,但它似乎不适用于我,并且底层视图(即地图视图)被调用。

1 个答案:

答案 0 :(得分:0)

好的,对我有用的是添加一个透明背景颜色的UIButton作为表格视图单元格的第一个子视图。现在,单元格上的所有Tap事件都被UIButton捕获。顺便说一下,所有滑动事件都会被表视图捕获,所以至少可以正常工作。

说实话,这不是一个非常好的解决方案,但它对我有用。我真的很感激任何进一步的建议!

最佳

NIC