当用户单击地图时,我想在MKMapView
上放置一个图钉。我有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_];
现在,引用Apple来说这并不奇怪:
注意:对于单击与双击手势,如果是 单击手势识别器不需要双击 识别器失败,你应该期望收到你的单击 双击动作之前的动作,即使是双重动作 挖掘。这是预期和理想的行为,因为最好的用户 经验通常涉及可堆叠的行动。
所以我将requireGestureRecognizerToFail
添加到我的单击识别器中。
[singleTap requireGestureRecognizerToFail:doubleTap];
这可确保我的单击识别器不会双击。
但是...
现在我的双击识别器获得了双击,而MKMapView
没有得到它们。我已尝试在识别器中将cancelsTouchesInView
设置为NO
,但这也无济于事。
所以我需要一种方法来阻止我的单击识别器获得双击(这似乎不太可能)或者将我的双击事件发送到我的mapView。
答案 0 :(得分:4)
在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 ...
}
答案 1 :(得分:2)
发布的代码似乎在iOS 6中正常工作。
双击由地图视图自动处理,不会干扰单击。
在iOS 5.x中,要使地图视图执行其正常的双击处理而不干扰您的单击,请实施shouldRecognizeSimultaneouslyWithGestureRecognizer
委托方法并从中返回YES
(需要仅设置双击手势识别器的delegate
属性。
不确定为什么在iOS 6中没有必要这样做。
答案 2 :(得分:0)
我发现this post给了我很多帮助...... 基本上,您需要找到Apple的手势识别器,并确保您不会与之竞争。
Jonathan的解决方案几乎是完美的,除了一件事:
因为在iOS 7中,MKView在子视图中具有所有它的手势。如果你想区分哪些是你的(直接添加到MKMap)以及哪些是Apple,它有点方便,但它可能会在未来的某个地方出现....
我最终做的是浏览所有地图的子视图,希望它能够灵活到足以承受至少一些未来的变化......
看起来像这样:
- (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];
}
}
}
}
}
}
答案 3 :(得分:0)
iOS 10上的Swift 3版本:
let filter_string = '';
input.on('keyDown', e => filter_string = e.target.value)
<Items filter={filter_string} />
请注意,在IB中创建单击。它可以很容易地在代码中创建:
// 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)
}