将PanGesture传递给子视图

时间:2014-09-16 07:57:52

标签: ios objective-c uigesturerecognizer subview hittest

我正在构建一个iOS应用程序。我有一个UIWebView作为子视图添加到self.view,然后另一个视图,即mapView,添加为Web视图的子视图。但是mapView被发送到webView的后面。 webView的背景是透明的,以便人们可以看到地图。 看到代码:

[self.webView addSubview: self.mapView];
[self.webView sendSubviewToBack: self.mapView];

我想要做的就是将webView的手势传递给mapView,以便用户可以拖动地图。

我已将webView和mapView的cancelsTouchesInView属性标记为NO。

我为webView添加了一个手势识别器。选择器确实被调用。但是我接下来要做什么呢?

    self.webPanGesture = [[UIPanGestureRecognizer  alloc] initWithTarget:self action: @selector(handleWebPanGesture:)];

  [self.webView addGestureRecognizer: self.webPanGesture];

我在webView选择器中调用了gestureRecognizerShouldBegin方法,但它没有工作。

- ( void ) handleWebPanGesture: ( UIPanGestureRecognizer  *)gesture
{
  NSLog(@"WebPanGesture recognizer called!");
  [self.mapView gestureRecognizerShouldBegin: gesture];
  [self panAction: gesture];
  self.mapPanGesture = gesture; // the mapPanGesture property is the Gesture recognizer for the map
}

我也称这个功能为

- ( IBAction )panAction:(UIPanGestureRecognizer *)sender {
  NSLog(@"panAction called!");
  CGPoint move = [sender translationInView:self.webView];
  CGPoint newCenter = subViewCenter;
  newCenter.x += move.x; newCenter.y += move.y;
  self.myMapView.mapView.center = newCenter;
}

但它并没有使地图可以拖动,它只是移动它。

self.mapPanGesture = gesture //doesn't work as well.

如何将动作定位到mapView,以便在webView上拖动时拖动地图?

2 个答案:

答案 0 :(得分:0)

我确定你应该在mapView上使用叠加层( MKOverlay )来显示地图上的内容。因为这是实现您所需要的更简单的方法。

请阅读此Adding Annotations to a Map

答案 1 :(得分:0)

我在这里找到了解决方法,所以请查看此link可能会有所帮助。

简而言之,webView不处理touchBegan方法,所以你需要继承它,并且触摸开始方法你可以传递以下内容,

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
   NSLog(@"%@",event);
  [super touchesBegan:touches withEvent:event];

  [_mapView touchesBegan:touches withEvent:event];
}

或查看以下方法,

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
   UIView *hitView = [super hitTest:point withEvent:event];

  // If the hitView is THIS view, return the view that you want to receive the touch instead:
   if (hitView == self) {
    return otherView;
  }
  // Else return the hitView (as it could be one of this view's buttons):
  return hitView;
}

以上hitTest是参考此link

希望,这些信息对你有用。