Ios 在不中断双击缩放的情况下,单次点击MKMapView
当用户点击地图时,我想在我的Ios 在不中断双击缩放的情况下,单次点击MKMapView,ios,mkmapview,Ios,Mkmapview,当用户点击地图时,我想在我的MKMapView上放置一个pin码。我有pin码工作,我有单点击工作,但当我双击缩放我得到一个单点击第一。以下是我设置识别器的代码: self.doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)]; self.doubleTap.numberOfTapsRequi
MKMapView
上放置一个pin码。我有pin码工作,我有单点击工作,但当我双击缩放我得到一个单点击第一。以下是我设置识别器的代码:
self.doubleTap = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(handleDoubleTap:)];
self.doubleTap.numberOfTapsRequired = 2;
self.doubleTap.numberOfTouchesRequired = 1;
[mapView_ addGestureRecognizer:doubleTap_];
self.singleTap = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(handleGesture:)];
self.singleTap.numberOfTapsRequired = 1;
self.singleTap.numberOfTouchesRequired = 1;
[self.singleTap requireGestureRecognizerToFail: doubleTap_];
[mapView_ addGestureRecognizer:singleTap_];
引用苹果的话,这并不奇怪:
注意:在单点击与双点击手势的情况下,如果
单点击手势识别器不需要双点击
如果识别器失败,您应该期望收到您的单个点击
双击操作之前的操作,即使在双击的情况下也是如此
水龙头这是预期的和可取的行为,因为最好的用户
经验通常涉及可堆叠的动作
因此,我在我的单点识别器中添加了requiregestrerecognizer-tofail
[单点击要求检测识别邮件:双点击]
这确保了我的单点识别器不会出现双点
但是
现在,我的双击识别器得到了双击,而MKMapView
没有得到它们。我已尝试在识别器中将cancelsTouchesInView
设置为NO
,但也没有帮助
因此,我需要一种方法来防止我的单点击识别器获得双点击(这似乎不太可能),或者将我的双点击事件发送到我的mapView。发布的代码似乎与iOS 6一样工作正常。
地图视图会自动处理双击,而不会干扰单次点击
在iOS 5.x中,要使地图视图在不干扰单次点击的情况下执行其正常的双击处理,请使用GestureRecognitor委托方法实现
应同时识别,并从中返回YES
(仅需要设置双击手势识别器的委托
属性)
不知道为什么在iOS 6中不需要这样做。我发现这对我帮助很大…
基本上,你需要找到苹果的手势识别器,并确保你不会与之竞争
乔纳森的解决方案几乎是完美的,除了一件事:
因为在iOS 7中,MKView的所有手势都在子视图中。如果你想区分哪些是你的(直接添加到MKMap中)哪些是苹果的,这有点方便,但它可能会在将来的某个地方被打破
我最后做的是浏览地图的所有子视图,希望它足够灵活,能够承受未来的一些变化
看起来像这样:
- (void) hackInTheGestureRecognizer {
for (UIView *aSubview in [[self theMap] subviews]) {
if ([aSubview isMemberOfClass:[UIView class]]) {
for (UIGestureRecognizer *aRecognizer in [aSubview gestureRecognizers]) {
if ([aRecognizer isKindOfClass:[UITapGestureRecognizer class]]) {
if ([(UITapGestureRecognizer *) aRecognizer numberOfTapsRequired] == 2) {
[[self singleTapRecognizer] requireGestureRecognizerToFail:aRecognizer];
}
}
}
}
}
}
在iOS 8上运行完美,双击操作为空
- (void)viewDidLoad
{
[super viewDidLoad];
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:nil];
doubleTap.numberOfTapsRequired = 2;
doubleTap.numberOfTouchesRequired = 1;
[self.mapView addGestureRecognizer:doubleTap];
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
singleTap.numberOfTapsRequired = 1;
singleTap.numberOfTouchesRequired = 1;
[singleTap requireGestureRecognizerToFail: doubleTap];
[self.mapView addGestureRecognizer:singleTap];
}
- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer
{
if (gestureRecognizer.state != UIGestureRecognizerStateEnded)
return;
//Do your work ...
}
iOS 10上的Swift 3版本:
// Gesture recognizer set up in Interface Builder
@IBOutlet weak var singleTapRecognizer: UITapGestureRecognizer!
override func viewDidLoad() {
// double tap recognizer has no action
let doubleTapRecognizer = UITapGestureRecognizer(target: self, action: nil)
doubleTapRecognizer.numberOfTapsRequired = 2
doubleTapRecognizer.numberOfTouchesRequired = 1
mapView.addGestureRecognizer(doubleTapRecognizer)
singleTapRecognizer.require(toFail: doubleTapRecognizer)
}
请注意,单个抽头是在IB中创建的。可以很容易地在如下代码中创建:
let singleTapRecognizer = UITapGestureRecognizer(target: self, action: Selector("someAction"))
singleTapRecognizer.numberOfTapsRequired = 1
singleTapRecognizer.numberOfTouchesRequired = 1
mapView.addGestureRecognizer(singleTapRecognizer)
你能展示一下你用来添加手势识别器的代码吗?您正在使用哪个iOS版本进行测试?您是否尝试过使用GestureRecognitizer委托方法从ShouldRecognitizesSimultaneousyWithGestureRecognitizer返回YES?问题经过编辑以获得更多代码。我正在用iOS5.1进行测试。还没有尝试过ShouldRecognizeSimultaneousyWithGestureRecognizer代理,我现在就这么做。ShouldRecognizeSimultaneousyWithGestureRecognizer=是的,完成了这个技巧,回答这个问题,我会将其标记为正确答案。谢谢