Iphone 带有UIGestureRecognitors的MKMapview

Iphone 带有UIGestureRecognitors的MKMapview,iphone,ipad,mkmapview,uigesturerecognizer,touch-event,Iphone,Ipad,Mkmapview,Uigesturerecognizer,Touch Event,所以我在iPad上有一个UIView作为我的根视图。我在其中添加了一些子视图,其中还有一个MKMapView 我试图实现的目标是检测3个手指在屏幕上的滑动,以便我能够做出反应。此外,我需要区分三个手指向左或向右滑动 在我添加mapview之前,我正在试验touchesMoved等。因为我发现这不准确,我转而使用UISweepGestureRecognitor,它工作得很好 不管怎样,一旦我添加了地图,它就吞噬了我所有的触摸。所以我一直在寻找答案 这一次似乎很有希望: 以及子类化UIWindow

所以我在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公开。我遇到了一个问题,我的地图视图中的手势识别器会调用我的动作方法,直到我开始显示用户的位置。这就解决了问题。非常感谢。