我正在尝试实现我自己的手势识别器以及MKMapView已经使用的手势识别器。现在我可以点击地图并设置一个别针。这种行为是由我的UITapGestureRecognizer实现的。当我点击已经存在的引脚时,我的手势识别器什么都不做,而是显示了该引脚的标注气泡。 UIGestureRecognizerDelegate看起来像这样:
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
if (gestureRecognizer == self.tapRecognizer)
{
bool hitAnnotation = false;
int count = [self.mapView.annotations count];
int counter = 0;
while (counter < count && hitAnnotation == false )
{
if (touch.view == [self.mapView viewForAnnotation:[self.mapView.annotations objectAtIndex:counter]])
{
hitAnnotation = true;
}
counter++;
}
if (hitAnnotation)
{
return NO;
}
}
return YES;
}
这很好用。我唯一的问题是针脚的标注气泡和双击。通常双击用于放大。这仍然有效,但除此之外,我还得到一个新的引脚。有什么方法可以避免这种情况吗?
另一个问题出现在引脚的标注气泡上。我可以通过敲击引脚来打开气泡而不在此处设置新引脚(参见上面的代码)但是当我想通过点击它来关闭气泡时,另一个引脚被设置。我的问题是,如果用户点击了一个标注气泡,我就无法检查touch.view,因为就我所知,它不是常规的UIView。有关此问题的任何想法或解决方法吗?
由于
答案 0 :(得分:4)
我遇到了与你的第一个问题相同的问题:在MKMapView
中区分双击和单击。我做的是以下内容:
[doubleTapper release];
doubleTapper = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(mapDoubleTapped:)];
doubleTapper.numberOfTapsRequired = 2;
doubleTapper.delaysTouchesBegan = NO;
doubleTapper.delaysTouchesEnded = NO;
doubleTapper.cancelsTouchesInView = NO;
doubleTapper.delegate = self;
[mapTapper release];
mapTapper = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(mapTapped:)];
mapTapper.numberOfTapsRequired = 1;
mapTapper.delaysTouchesBegan = NO;
mapTapper.delaysTouchesEnded = NO;
mapTapper.cancelsTouchesInView = NO;
[mapTapper requireGestureRecognizerToFail:doubleTapper];
然后实现以下委托方法:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
使用requireGestureRecognizerToFail:
可让应用区分单击和双击,实现gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
可确保双击仍然转发到MKMapView
,以便继续正常缩放。请注意,doubleTapper
实际上没有做任何事情(在我的情况下,除了日志调试消息)。它只是一个虚拟UIGestureRecognizer
,用于帮助将单个分接头与双击分开。