Ios 使用UIScreenedGepangestureRecognitor而不移动MKMapView

Ios 使用UIScreenedGepangestureRecognitor而不移动MKMapView,ios,objective-c,mkmapview,uigesturerecognizer,Ios,Objective C,Mkmapview,Uigesturerecognizer,我有一个包含MKMapView的UIViewController(事实上,它包含一个包含MKMapView的全屏容器,但它不应该有任何影响) 我实现了一个UIScreenedGePangestureRecognitor(用于显示抽屉),如下所示: self.swipeRight = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(handleEdgeGesture:)]; [self.s

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

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

self.swipeRight = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(handleEdgeGesture:)];
[self.swipeRight setEdges:UIRectEdgeLeft];
[self.swipeRight setDelegate:self];
[self.view addGestureRecognizer:self.swipeRight];
为了使其有效,我必须添加以下方法(返回YES):

但是地图在抽屉出现的同时也在移动! 我尝试了各种各样的方法来阻止它,但没能。。。(例如,我尝试了
应要求使用人工智能识别器
要求检测识别器发送邮件)


当手势是来自LeftEdge的ScreenEdgePan时,你知道如何防止地图视图移动吗?

我在应用程序中所做的是:

UIScreenEdgePanGestureRecognizer *popRecognizer = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePopRecognizer:)];
popRecognizer.edges = UIRectEdgeLeft;
popRecognizer.delegate = self;
然后,如您所说,将代理设置为“是”

- (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;

    }
}

希望能有所帮助。

一旦
UIScreenedGePangestureRecognitor
开始识别,就需要取消地图上的平移手势。要实现这一点,只需立即将
滚动启用
设置为
。这将取消另一个手势识别器

- (void) handleEdgeGesture:(UIScreenEdgePanGestureRecognizer*)recognizer
{
    if(recognizer.state == UIGestureRecognizerStateBegan) {
        // cancel simultaneous gesture on map view
        _mapView.scrollEnabled = NO;
        _mapView.scrollEnabled = YES;
    }
}

我认为最快的解决方案是在mapView的顶部创建一个薄视图(背景颜色透明),您的手势不应该在mapView上工作。即

以下组合在不接触地图视图的情况下对我有效

// 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;
}

我相信这应该回答您的问题:您是否尝试将手势识别器添加到地图视图而不是容器中?-只是一个hunch@JonathonHibbard例如我看到了,但是没有。。这意味着要自己移动地图,而不是让mapview来做,这对用户来说很糟糕perf@WarrenBurton:这不是一个选项。。。但是我试过了,但最糟糕的是sameDang——如果我能为你找到其他东西,我今晚晚些时候再查。我知道我以前见过这个问题谢谢,我没有这个想法,我要试试。。。唯一的问题是我无法访问mapView,因为它位于容器视图中,所以我必须使用通知。我会告诉你的!谢谢@phix23,正如我对Cedrick说的,这是一个非常酷的主意,我会尽快测试它,即使我不能直接访问mapview为什么你不能从容器中公开mapview?容器允许用户在map view和listview之间切换,所以我有一个带有2个自定义段的容器转发到2个controllerView(我不能有2个嵌入segue):因此我不能直接向容器公开mapview(我只能在performsgue方法中访问mapview).我只需要完成我实际的git分支来测试你的解决方案!多亏了你们两个,它工作了!正如Cedrick首先回答的那样,我将给他奖金。这非常有效!非常感谢。我添加了一个检查,以查看在临时禁用滚动之前是否先启用了它&再次启用。这样,如果它已经禁用,你就不会看到它了冒险在你不打算的时候启用滚动。这几乎是同一个解决方案,顺便说一句“isUserInteractionEnabled”无法设置,这是关键。你应该使用“userInteractionEnabled”。Hello@arturdev!这是我在问之前做的:)我一点也不喜欢它。。。因为我确实需要有足够的宽度来让它工作,然后这很烦人,因为有时我只是想拖动地图,它会打开抽屉。。。这感觉更像是一个黑客
- (void) handleEdgeGesture:(UIScreenEdgePanGestureRecognizer*)recognizer : (id)sender
{
    if(recognizer.state == UIGestureRecognizerStateBegan && sender == GMSMapView) {
        // cancel simultaneous gesture on map view
        _mapView.isUserInteractionEnabled = NO;
    }
}
// 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;
}