在不移动 MKMapView 的情况下使用 UIScreenEdgePanGestureRecognizer

Posted

技术标签:

【中文标题】在不移动 MKMapView 的情况下使用 UIScreenEdgePanGestureRecognizer【英文标题】:Use UIScreenEdgePanGestureRecognizer without moving MKMapView 【发布时间】:2014-07-18 20:41:55 【问题描述】:

我有一个包含 MKMapView 的 UIViewController(实际上,它包含一个包含 MKMapView 的全屏容器,但它应该没有任何影响)

我实现了一个 UIScreenEdgePanGestureRecognizer(显示抽屉),如下所示:

self.swipeRight = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(handleEdgeGesture:)];
[self.swipeRight setEdges:UIRectEdgeLeft];
[self.swipeRight setDelegate:self];
[self.view addGestureRecognizer:self.swipeRight];

为了让它工作,我必须添加以下方法(返回 YES):

(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;

但是地图在抽屉出现的同时也在移动! 我尝试了各种技巧来阻止它,但无法...(例如,我尝试了shouldBeRequiredToFailByGestureRecognizerrequireGestureRecognizerToFail

知道当手势是来自 LeftEdge 的 ScreenEdgePan 时如何防止 MapView 移动吗?

【问题讨论】:

我相信这应该回答你的问题:***.com/a/11954355/1244184 您是否尝试将手势识别器添加到地图视图而不是容器? - 只是预感 @JonathonHibbard:我看到了,但是没有......这意味着我自己移动地图而不是让 mapview 来做,而且它的性能很糟糕 @WarrenBurton:这不是一个选项......但我尝试了测试,结果是一样的 该死的太糟糕了——我会在今晚晚些时候检查一下,如果我能找到其他东西给你。我知道我以前见过这个问题 【参考方案1】:

我在我的应用中做了以下事情:

UIScreenEdgePanGestureRecognizer *popRecognizer = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePopRecognizer:)];
popRecognizer.edges = UIRectEdgeLeft;
popRecognizer.delegate = self;

然后按照你说的将delegate设置为YES

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

    return YES;

并像这样启用/禁用地图视图的滚动

- (void)handlePopRecognizer:(UIScreenEdgePanGestureRecognizer*)recognizer

    if(recognizer.state == UIGestureRecognizerStateBegan)
        _mapView.scrollEnabled = NO;
     else if(recognizer.state == UIGestureRecognizerStateEnded || recognizer.state == UIGestureRecognizerStateCancelled)
        _mapView.scrollEnabled = YES;

    

希望对你有帮助。

【讨论】:

嗨,谢谢,我没有这个想法,我要试试...唯一的问题是我无法访问 mapView,因为它在容器视图中,所以我将不得不使用通知。我会试着告诉你!【参考方案2】:

地图上的平移手势需要在UIScreenEdgePanGestureRecognizer 开始识别后立即取消。为了达到这个目的,将scrollEnabled 设置为NO 就足够了。这将取消其他手势识别器。

- (void) handleEdgeGesture:(UIScreenEdgePanGestureRecognizer*)recognizer

    if(recognizer.state == UIGestureRecognizerStateBegan) 
        // cancel simultaneous gesture on map view
        _mapView.scrollEnabled = NO;
        _mapView.scrollEnabled = YES;
    

【讨论】:

感谢 @phix23,正如我对 Cedrick 所说,这是一个非常酷的想法,即使我无法直接访问 mapView,我也会尽快对其进行测试 为什么不能直接从容器中暴露地图视图? 容器让用户在地图视图和列表视图之间切换,所以我有一个带有 2 个自定义 segue 的容器转发到 2 个控制器视图(我不能有 2 个嵌入 segue):所以我可以t 直接将 mapview 暴露给容器(我只能在 performSegue 方法中访问 mapview)。我只需要完成我的实际 git 分支来测试你的解决方案! 感谢你们两位,它成功了!正如塞德里克首先回答的那样,我将赏金给他 这非常有效!非常感谢。我添加了一个检查以查看是否先启用滚动,然后暂时禁用它并再次启用。这样,如果它已经被禁用,你就不会冒险在你不打算的时候启用滚动。【参考方案3】:

以下组合对我有用,而无需触及地图视图。

// This is to ensure UIScreenEdgePanGestureRecognizer won't be blocked by other gestures. 
// You may need to do some logic checking before returning YES.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

  return YES;

// This is to prevent other recognisers when UIScreenEdgePanGestureRecognizer
// is recognising the gesture. Again, you may want to do some logic checking
// before returning to YES.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

  return YES;

【讨论】:

【参考方案4】:
- (void) handleEdgeGesture:(UIScreenEdgePanGestureRecognizer*)recognizer : (id)sender

    if(recognizer.state == UIGestureRecognizerStateBegan && sender == GMSMapView) 
        // cancel simultaneous gesture on map view
        _mapView.isUserInteractionEnabled = NO;
    

【讨论】:

这几乎是相同的解决方案,btw 'isUserInteractionEnabled' 不能设置,那就是 getter。您应该使用“userInteractionEnabled”。【参考方案5】:

我认为最快的解决方案是在 mapView 之上制作一个薄视图(具有透明背景颜色),您的手势不应该在 mapView 上起作用。 IE。

【讨论】:

你好@arturdev!好吧,这就是我在问这里之前所做的:)而且我一点也不喜欢它......因为我确实需要有足够的宽度才能让它工作,然后这很烦人,因为有时我只想拖动地图和它打开抽屉......感觉更像是一个黑客

以上是关于在不移动 MKMapView 的情况下使用 UIScreenEdgePanGestureRecognizer的主要内容,如果未能解决你的问题,请参考以下文章

分享一个 mkmapview 截图

MKMapView 用户位置 - 授权

如何在不连接它们的情况下在 MapView 上绘制两个 MKPolygons?

如何在不使用重力属性的情况下移动右侧的第一列?

在不使用 SKAction followPath 的情况下逐步围绕路径移动节点

如何在不使用 TeraWurfl 的情况下检测网站是不是正在通过移动设备或计算机使用 [重复]