Iphone 带有UIGestureRecognitors的MKMapview
所以我在iPad上有一个UIView作为我的根视图。我在其中添加了一些子视图,其中还有一个MKMapView 我试图实现的目标是检测3个手指在屏幕上的滑动,以便我能够做出反应。此外,我需要区分三个手指向左或向右滑动 在我添加mapview之前,我正在试验touchesMoved等。因为我发现这不准确,我转而使用UISweepGestureRecognitor,它工作得很好 不管怎样,一旦我添加了地图,它就吞噬了我所有的触摸。所以我一直在寻找答案 这一次似乎很有希望: 以及子类化UIWindow和拦截触摸 事实证明,这两种方法都不适用于我,因为在这两种情况下,我最终都会在Iphone 带有UIGestureRecognitors的MKMapview,iphone,ipad,mkmapview,uigesturerecognizer,touch-event,Iphone,Ipad,Mkmapview,Uigesturerecognizer,Touch Event,所以我在iPad上有一个UIView作为我的根视图。我在其中添加了一些子视图,其中还有一个MKMapView 我试图实现的目标是检测3个手指在屏幕上的滑动,以便我能够做出反应。此外,我需要区分三个手指向左或向右滑动 在我添加mapview之前,我正在试验touchesMoved等。因为我发现这不准确,我转而使用UISweepGestureRecognitor,它工作得很好 不管怎样,一旦我添加了地图,它就吞噬了我所有的触摸。所以我一直在寻找答案 这一次似乎很有希望: 以及子类化UIWindow
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
或在识别触摸类型等情况下。
这就是我最初想要做的
所以我的问题是:有没有一种方法可以像我上面描述的那样使用UIgestureRecognitors来维护我的控件,同时保持Mapview的功能
我是否已经足够准确地描述了我的问题
Greetz.从MkMapView中删除滑动手势识别器是否可以解决问题
UISwipeGestureRecognizer *leftSwipeGesture = [[UISwipeGestureRecognizer alloc] init];
UISwipeGestureRecognizer *rightSwipeGesture = [[UISwipeGestureRecognizer alloc] init];
leftSwipeGesture.direction = UISwipeGestureRecognizerDirectionLeft;
rightSwipeGesture.direction = UISwipeGestureRecognizerDirectionRight;
[YourMKMapView removeGestureRecognizer:leftSwipeGesture];
[YourMKMapView removeGestureRecognizer:rightSwipeGesture];
这样,MKMapView将不会响应刷卡手势,并将响应者让给MKMapView的容器视图控制器。描述了手势识别器的子类化,以确保它不会干扰其他识别器
您可以向MKMapView添加一个自定义识别器,该识别器拦截三个手指的滑动并做出适当的反应,但随后允许MKMapView正常处理所有其他手势
上面的链接给出了通过子类化UIgestureRecognitor添加简单手指按压的示例。对于三个手指的滑动,我会将UISweepGestureRecognitor子类化
我已经成功地使用此方法将两个手指旋转添加到MKMapView中,而不会弄乱平移和缩放等操作。地图不应该吃掉你所有的触摸。这有点不对劲-我已经成功地将长按和点击识别器添加到MKMapView中,并且它们按照预期工作 确保为控制器指定您创建的所有手势识别器的代理,并确保实现以下方法:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer :(UIGestureRecognizer *)otherGestureRecognizer;
您可以通过实现
-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;
在那之后,让手势识别器与地图视图一起工作就取决于实现的细节了。根据我的经验,您可以添加自己的,它不应该干扰您的识别器
其他一些想法:
-在MKMapView上覆盖一个不可见的启用用户交互的视图,以从中获取事件。根据您在地图视图上需要的交互量,您可以打开和关闭此功能,等等。
-除了父视图上的刷卡识别器之外,还向地图视图本身添加另一个刷卡识别器
你们也可以使用UIView hitTest方法,但对我来说,那个总是太低了 这个问题很老,但很实际。我的两分钱,特别是OSX 如果需要通过代码检测区域变化造成的夹点: 我设置了一个ivar来检测控制器代码的其他位置
func mapView(_ mapView: MKMapView, regionWillChangeAnimated animated: Bool) {
guard let view = mapView.subviews.first else{ return }
self.regionChangeIsFromUserInteraction = false
#if os(iOS)
guard let recognizers = view.gestureRecognizers else{ return }
#elseif os(OSX)
// on OSX they are in maps..
let recognizers = mapView.gestureRecognizers
#endif
for recognizer : AimGestureRecognizer in recognizers{
let state = recognizer.state
if state == .began || state == .ended {
self.regionChangeIsFromUserInteraction = true
break
}
}
#if DEBUG
print("regionChangeIsFromUserInteraction ", self.regionChangeIsFromUserInteraction)
#endif
}
您是否实现了所有UIgestureRecognitzerDelegate方法,以便您的方法可以与地图一起识别,或者如果您愿意,可以相互阻止?听起来很有趣,我们将尝试反馈,但实际上没有帮助。我没有错过任何东西,是吗?因为地图的识别器不直接在MKMapView上,所以无法工作。将MKMapView视为一组分层视图、手势识别器和识别器代理。它与iOS 5到iOS 6有很大的不同,在iOS 7中可能会再次发生变化,因为没有任何内部内容通过API公开。我遇到了一个问题,我的地图视图中的手势识别器会调用我的动作方法,直到我开始显示用户的位置。这就解决了问题。非常感谢。