我有以下设置:
mainViewController
OverlayView - UIView
mapView - MKMapView
My OverlayView显示在mapView上并响应UIPanGestureRecognizer
现在因为OverlayView高于MapView,我无法轻松实现MapView的缩放功能..
我需要做些什么才能让mapView对pinch做出反应,而OverLayView对Pan做出反应(就像现在一样)?
我现在的解决方案是在mainViewController中实现pinch2zoom功能,以便相应地缩放mapView,但它不如原始Apple的实现那么顺畅。
答案 0 :(得分:0)
如果你有一个应该在MKMapView
前面的视图,并且当地图在它下面移动时不在屏幕上移动,你应该如你所描述的那样实现它,作为一个单独的视图地图视图的前面(即顶部)。但是,不是让这个前视图处理手势并尝试以编程方式更改地图视图,您应该为此前视图设置userInteractionEnabled
到NO
(您可以通过编程方式或通过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;
}