在MKMapView上使用UIPanGestureRecognizer?

40

我想在用户移动地图视图时添加一些逻辑,例如滑动触摸。但是当我添加手势识别器并尝试记录触摸操作时,什么也没有发生。当我在另一个视图控制器中尝试并将识别器添加到控制器的视图中时,它可以正常工作。

这是我的代码(地图视图是应用程序委托的属性,因为我需要即使它不可见时也要进行其他一些操作):

- (void)viewDidLoad
{
    ...
    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(showPan)];
    [appDelegate.mapView addGestureRecognizer:panGesture];
    [panGesture release];
}

- (void)showPan
{
    NSLog(@"pan!");
}

我使用最新的iOS 4.2.1版本。

感谢任何建议。

2个回答

143

好的,因为没有人知道,所以我不得不花费一次苹果技术支持咨询。;o)

由于MKMapView显然具有其自己的识别器与用户交互,您必须遵守UIGestureRecognizerDelegate协议,并像这样实现(BOOL)gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:

- (void)viewDidLoad
{
    ...
    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(showPan)];
    panGesture.delegate = self;
    [appDelegate.mapView addGestureRecognizer:panGesture];
    [panGesture release];
}

- (void)showPan
{
    NSLog(@"pan!");
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {   
    return YES;
}

然后它就像魔法一样运作。


天啊 - 谢谢,不然我得花很长时间才能弄明白! - n13
需要提到的是,您仍然可以从UIBuilder定义手势识别器。 因此,在技术上,重要的是委托方法(如果您将其定义为IBAction,则可以从构建器ctrl-drag识别器到showPan)。 - sheba
1
你找到减速问题的解决方案了吗?当你在滚动屏幕时释放手指,地图会持续滚动并减速。我找不到捕捉它的方法。 - VaporwareWolf

1

Swift 5

let panGesture = UIPanGestureRecognizer(target: self, action: #selector(panGesture))
panGesture.delegate = self
self.mapView.addGestureRecognizer(panGesture)

@objc func panGesture (sender: UIPanGestureRecognizer) {
        
}
    
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
   return true
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接