在地图上重叠注释(MKAnnotationView)的问题

时间:2010-03-18 15:07:45

标签: iphone objective-c mapkit mkmapview mkannotation

在我的iphone应用程序中,我正在使用MapKit和MKMapView以及自定义MKAnnotationView。

问题是当注释在地图上重叠时(在我的应用中,注释是照片而这些照片可能会重叠),当你点击前面出现的注释时,它是另一个接收事件的注释(在背面)(似乎是随机的。

我没有找到任何方法将事件发送到前端注释。 我无法相信这个错误/问题没有任何解决方案!

stackoverflow上的

Z orderingOrder of overlapping annotations问题对我没有多大帮助。

欢迎任何想法(即使是肮脏的解决方案)!

这是我的一些代码(没什么特别的,很常见的):

CustomAnnotation.h

@interface CustomAnnotation : NSObject <MKAnnotation> {
   @private
   CustomAnnotationView* view;
}

    @property (nonatomic, retain) CustomAnnotationView* view;

@end

CustomAnnotation.m

@implementation CustomAnnotation

@synthetize view;

CustomAnnotationView.h

@interface CustomAnnotationView : MKAnnotationView {
}

@end

CustomAnnotationView.m

@implementation CustomAnnotationView

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
// Do something related to the annotation tapped
}

@end

主要课程     ... //添加了注释,其中一些与其他注释重叠。

- (void)addAnnotation:(CustomAnnotation*)annotation {
    [map addAnnotation:annotation];
}

...

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {

    NSString* identifier = getIdentifierFromAnnotation(annotation);
    CustomAnnotationView* view;
    if(!(view = (CustomAnnotationView*)[map dequeueReusableAnnotationViewWithIdentifier:identifier])) {
        view = [[CustomAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier: identifier];
        [(CustomAnnotation*)annotation setView:view];
        [view release];
    }
    return view;
}

4 个答案:

答案 0 :(得分:2)

最后,我发现并避免失去地图功能的最佳方法是:

  • 让CustomAnnotationView(touchesEnded)上的触控侦听器(在每个注释上)

  • 接收触摸事件时,将事件转移到主类

  • 注释上的主类循环并保留具有良好位置的注释(注释框中的触摸事件)并且在前面

效果很好。

答案 1 :(得分:0)

请参阅此question的解决方案。基本上你会创建一个透明的UIView,它将拦截所有的触摸。我还没有尝试过,但如果你必须重新实现MKMapView中的所有缩放到缩放功能,这可能比它的价值更麻烦。

如果您有两个(或更多)MKAnnotations位于同一位置,您可以反复点击以在两者之间切换。这应该可以在不对您的应用进行任何更改的情况下运行。

答案 2 :(得分:0)

跟进Alexandre的回答,我用

禁用了所有自定义MKAnnotationViews对象
annView.enabled = NO

所以他们没有回应MKMapView的默认选择行为,并在我的自定义MKAnnotationView中实现了以下内容:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
 self.enabled = YES;
 [(MKMapView*)self.superview selectAnnotation:self.annotation animated:NO];
}

此解决方案在iOS 4上运行良好。似乎禁用MKAnnotationView不会禁用其userInteractionEnabled,而在iOS 3上则禁用它。仍在为iOS 3寻找解决方案......

编辑:实际上,这似乎是iOS 4.1中的一个错误。在iOS 4.2中,禁用引脚也会禁用触摸事件。因此,此方法仅适用于4.1和4.0。

答案 3 :(得分:0)

我已将UITapGestureRecognizer添加到前面的视图中,这为我解决了问题。

在您的情况下,向CustomAnnotationView添加手势识别器应该可以解决问题。