9

在我的 iphone 应用程序中,我将 MapKit 与 MKMapView 和自定义 MKAnnotationView 一起使用。

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

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

stackoverflow 上的Z 排序重叠注释问题的顺序对我没有太大帮助。

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

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

自定义注释.h

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

    @property (nonatomic, retain) CustomAnnotationView* view;

@end

自定义注释.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

Main class ... // 添加注释,其中一些与其他注释重叠。

- (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

4 回答 4

2

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

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

  • 接收到触摸事件时,将事件传递给主类

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

它工作得很好。

于 2010-04-22T11:04:54.777 回答
0

请参阅此问题的解决方案。基本上你会创建一个透明的 UIView 来拦截所有的触摸。我还没有尝试过,但是如果您必须在 MKMapView 中重新实现所有捏合缩放功能,这可能会带来更多麻烦。

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

于 2010-04-21T14:04:53.630 回答
0

跟进亚历山大的回答,我禁用了我所有的自定义 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 中,禁用 pin 也会禁用触摸事件。因此,此方法仅适用于 4.1 和可能的 4.0。

于 2010-10-21T05:47:47.930 回答
0

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

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

于 2011-12-15T14:04:45.167 回答