将平移手势传递到MKMapView

时间:2017-10-07 17:03:21

标签: ios objective-c

编辑:会让我更清楚我想要实现的目标。

我在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;
}

2 个答案:

答案 0 :(得分:1)

  

移动注释的标准Apple方式是点按一次然后快速点击并按住并拖动。该应用程序的用户抱怨说这样做太难了。

我不这么认为...... :(

我要写我的逻辑,实际上使用平移手势甚至苹果提供默认拖放功能都是坏事。顺便说一下,如果按照问题中提到的方式进行操作,则必须为地图上显示的每个注释添加单独的平移手势。添加它自己的标签并为所有人保留相同的手势方法名称,这样您就可以通过标签轻松管理它。因此,当最终用户点击/触摸任何注释时,它的方法将被调用,您可以通过它自己的标记触摸/点击注释。只为拖放注释编写代码。不确定,但可能会解决您的问题。

答案 1 :(得分:0)

我完全同意iPatel:如果可能的话,应该使用标准的Apple方式,因为用户习惯了它 但是,如果您真的想要实现自己的解决方案,可能以下方法可能有效(未经测试):

MapView有一个内置PanGestureRecognizer(此处称为builInPGR)。我假设您已为此PanGestureRecognizer添加了自己的ownPGR(此处称为MapView) 现在,UIGestureRecognizerDelegate协议中的以下函数控制两个手势识别器是否应同时识别(请参阅docs):

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, 
shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool

默认实现返回false

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

如果你现在实现这个委托函数并返回trueownPGRbuilInPGR应该同时工作:builInPGR会移动地图,ownPGR会如果已经点击了靠近注释的区域,则检查,如果是,则移动注释。

现在,此委托函数还为您提供了指向builInPGR otherGestureRecognizer的指针 因此,如果ownPGR决定拖动注释,因为它开始接近它,您可以将isEnabled的属性builInPGR设置为false。这使builInPGR转换为已取消状态,并且不再拖动地图 当然,当builInPGR.isEnabled完成拖动注释时,您必须再次将true设置为ownPGR

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

编辑:对不起,我刚才意识到你想要在Obj-C中得到答案。但是,使用docs(只需切换到Obj-C),在Obj-C中测试它应该很容易。