对子视图的手势& iOS中的MKMapView - 基本iOS

时间:2013-02-08 23:11:21

标签: ios objective-c uiview mkmapview subview

我有以下设置:

 mainViewController
    OverlayView - UIView
    mapView - MKMapView

My OverlayView显示在mapView上并响应UIPanGestureRecognizer

现在因为OverlayView高于MapView,我无法轻松实现MapView的缩放功能..

我需要做些什么才能让mapView对pinch做出反应,而OverLayView对Pan做出反应(就像现在一样)?

我现在的解决方案是在mainViewController中实现pinch2zoom功能,以便相应地缩放mapView,但它不如原始Apple的实现那么顺畅。

2 个答案:

答案 0 :(得分:0)

如果你有一个应该在MKMapView前面的视图,并且当地图在它下面移动时不在屏幕上移动,你应该如你所描述的那样实现它,作为一个单独的视图地图视图的前面(即顶部)。但是,不是让这个前视图处理手势并尝试以编程方式更改地图视图,您应该为此前视图设置userInteractionEnabledNO(您可以通过编程方式或通过Interface Builder执行此操作)。这将让它后面的地图视图接收到触摸。

如果您在该前视图上有一些需要接受用户交互的控件,那么请继续为这些少数控件启用用户交互,但请确保此前视图的大部分配置为不具有{{1} }。


如果您想要与地图一起移动的叠加层,则只需将叠加层添加到userInteractionEnabled本身,而不是单独的视图。请参阅位置感知编程指南中的Displaying Overlays on a Map如果使用MKMapView叠加而不是单独的视图,则不会丢失任何内置手势。

例如,如果您将MKMapView的{​​{1}}设置为视图控制器,则可以在iOS 7(或delegate方法中编写MKMapView早期版本):

rendererForOverlay

这可以处理多边形,圆形和线条。很明显,如果你只是绘制多边形,你可以相应地简化上面的代码。

完成后,您现在可以直接在地图上添加叠加层。例如,这会在特定坐标周围添加一个特定大小的矩形:

viewForOverlay

答案 1 :(得分:0)

我现在实际上并不知道我要提出的建议是否有效,或者是否是一个好的解决方案,无论如何这就是想法

将MainViewController设置为手势识别器的委托

-(BOOL)gestureRecognizer:(UIGestureRecognizer*)gr shouldReceiveTouch:(UITouch*)touch{
    if([gr isKindOfClass:[UIPanGestureRecognizer class]])
        [mapView setUserInteractionEnabled:NO];
    else if([gr isKindOfClass:[UIPinchGestureRecognizer class]])
        [overlayView setUserInteractionEnabled:YES];
    return YES;
}