将平移手势传递到MKMapView

5

编辑:我会让我的目标更加清晰。

我有一些MKMapView上的注释,我想让它们易于拖动。标准Apple移动注释的方法是单击一次,然后快速单击并按住并拖动。应用程序的用户抱怨这样做太难了。

因此,从技术上讲,我想使用平移手势。问题在于MKMapView也使用平移手势来移动地图。

当用户进行平移手势时,我想要做的是检查平移手势是否开始非常接近注释,如果是,则让平移手势处理程序移动该注释。我已经有了这部分的工作。

但是,如果平移手势与注释不接近,则将其传递给MKMapView进行处理。

// 编辑结束

我有一个处理平移手势的方法。当MKMapView上有平移手势时,这个方法会像我预期的那样调用。有时候我不想在我的方法中处理手势,而是通过将手势传递到MKMapView中,使其像正常情况下一样平/拖动地图。

以下是我所拥有的概述:

-(void)panGesture:(UIPanGestureRecognizer*)sender

根据某些逻辑,我想将这个手势传递给MKMapView(self.mapView)。请问有人可以分享一下如何做到吗?

我尝试过 [self.mapView gestureRecognizerShouldBegin:sender]; 但是没有任何反应。

- (void) addPanGesture
{
    self.panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGesture:)];
    self.panGesture.delegate = self;
    [self.panGesture setMinimumNumberOfTouches:1];
    [self.panGesture setMaximumNumberOfTouches:1];
    [self.mapView addGestureRecognizer:self.panGesture];

}

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

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    BOOL result = NO;
    if ((gestureRecognizer == self.panGesture) && [[otherGestureRecognizer view] isDescendantOfView:[gestureRecognizer view]])
    {
        result = YES;
    }
    return result;
}

-(void)panGesture:(UIPanGestureRecognizer*)sender
{
    //some logic to see if we will handle the gesture in this method or pass gesture on to the MKMapView

    return;
}

我认为你不能在不覆盖MKMapView的pan手势的情况下完成这个操作,伙计。 - thibaut noah
抱歉,我还不清楚你想要什么,请您能否再详细说明一下? - iPatel
@iPatel 进行了编辑以澄清。 - Code
你可以尝试在MKAnnotationView上添加平移手势,因为每个注释都有一个视图。 - Shamim Hossain
2个回答

1
“标准的苹果移动注释方式是轻触一次,然后快速轻触并按住并拖动。该应用程序的用户抱怨这样做太困难了。”“我不这么认为.. :(”“我将编写我的逻辑,实际上使用平移手势是一件坏事,即使苹果提供默认的拖放功能。顺便说一下,如果您按照问题中提到的方式进行操作,则必须为地图上显示的每个注释添加单独的平移手势。添加它自己的标签,并为所有手势方法保持相同的名称,以便您可以通过标签轻松管理它。因此,当最终用户轻触/触摸任何注释时,它的方法将被调用,并且您可以通过它自己的标记获取所触摸/轻触的注释。只编写拖放注释的代码。不能确定,但可能解决您的问题。”

1
我完全同意iPatel的观点:如果可能的话,应该使用标准的Apple方式,因为用户已经习惯了它。
但是,如果你真的想要实现自己的解决方案,也许下面的方法可以工作(未经测试): MapView有一个内置的PanGestureRecognizer(这里称为builInPGR)。我假设你已将自己的PanGestureRecognizer(这里称为ownPGR)添加到了这个MapView中。
现在,UIGestureRecognizerDelegate协议中的以下函数控制两个手势识别器是否同时识别(请参见docs):
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, 
shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool

默认实现返回false

您提到可以使用ownPGR拖动注释。这意味着builInPGR不会同时识别平移手势和ownPGR

如果您现在实现此委托函数并返回true,则ownPGRbuilInPGR应该同时工作: builInPGR将移动地图,而ownPGR将检查是否已点击靠近注释的区域,如果是,则将移动注释。

现在,这个委托函数还会给你一个指向builInPGR的指针,即otherGestureRecognizer
因此,如果ownPGR决定拖动注释,因为它从附近开始,你可以将builInPGR.isEnabled属性设置为false。这会使builInPGR转换到取消状态,地图将不再被拖动。
当然,当ownPGR完成对注释的拖动时,您必须再次将builInPGR.isEnabled设置为true

再说一遍:我不知道这是否有效,但是它可能有效。我强烈建议使用标准方法!

编辑:很抱歉,我刚意识到您想要Obj-C的答案。但是,使用文档(只需切换到Obj-C)应该很容易在Obj-C中测试它。


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