双击选择触摸MKPinAnnotationView

时间:2012-01-10 15:32:25

标签: iphone ios mkannotation mkannotationview mkpinannotationview

编辑:将标题从“双击...”更改为“双击选择触摸...”

我需要在我的应用中检测到MKPinAnnotationView上的至少第二次触摸。目前我能够获得第一次触摸(我在这里使用kvo:Detecting when MKAnnotation is selected in MKMapView),并且在第一次触摸时效果很好),但是如果我再次点击引脚,则不会调用任何内容,因为所选值不会更改。我使用“mapView:didSelectAnnotationView:”尝试了相同的功能,自ios 4起作用,但它也不会在第二次点击时再次调用。

如果有人可以帮助我,那就太棒了!

最好的问候

编辑,添加更多信息:

因此,触摸不必很快,如果用户触摸引脚,则在标题和注释的副标题中显示消息,如果用户再次触摸相同的引脚,那么我将做另一个事情

1 个答案:

答案 0 :(得分:4)

创建UITapGestureRecognizer并将numberOfTapsRequired设置为2。将此手势识别器添加到MKPinAnnotationView的实例中。此外,您需要将控制器设置为手势识别器的代理并实施-gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:并返回YES以防止手势识别器踩踏MKMapView内部使用的手势识别器。 / p>

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation)annotation
{
    // Reuse or create annotation view

    UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapRecgonized:)];
    doubleTap.numberOfTapsRequired = 2;
    doubleTap.delegate = self;
    [annotationView addGestureRecognizer:doubleTap];
}

- (void)doubleTapRecognized:(UITapGestureRecognizer *)recognizer
{
    // Handle double tap on annotation view
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGesture
{
    return YES;
}

编辑:抱歉,我误解了。您应该使用-mapView:didSelectAnnotationView:和仅为1个必需点击配置的手势识别器来描述您所描述的内容。我们的想法是,在选择注释视图时,我们只会将手势识别器添加到注释视图中。取消选择注释视图时,我们将删除它。通过这种方式,您可以处理-tapGestureRecognized:方法的缩放,并且只有在已经点击了注释的情况下才能保证执行。

为此,我将手势识别器添加为您班级的属性,并在-viewDidLoad中进行配置。假设它被声明为@property (nonatomic, strong) UITapGestureRecognizer *tapGesture;并且我们正在使用ARC。

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureRecognized:)];
}

- (void)tapGestureRecognized:(UIGestureRecognizer *)gesture
{
    // Zoom in even further on already selected annotation
}

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)annotationView
{
    [annotationView addGestureRecognizer:self.tapGesture];
}

- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)annotationView
{
    [annotationView removeGestureRecgonizer:self.tapGesture];
}