编辑:会让我更清楚我想要实现的目标。
我在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;
}
答案 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
同时识别平移手势。
如果你现在实现这个委托函数并返回true
,ownPGR
和builInPGR
应该同时工作:builInPGR
会移动地图,ownPGR
会如果已经点击了靠近注释的区域,则检查,如果是,则移动注释。
现在,此委托函数还为您提供了指向builInPGR
otherGestureRecognizer
的指针
因此,如果ownPGR
决定拖动注释,因为它开始接近它,您可以将isEnabled
的属性builInPGR
设置为false。这使builInPGR
转换为已取消状态,并且不再拖动地图
当然,当builInPGR.isEnabled
完成拖动注释时,您必须再次将true
设置为ownPGR
。
再一次:我不知道这是否有效,但可能。我强烈建议使用标准方法!
编辑:对不起,我刚才意识到你想要在Obj-C中得到答案。但是,使用docs(只需切换到Obj-C),在Obj-C中测试它应该很容易。