在我的iphone应用程序中,我正在使用MapKit和MKMapView以及自定义MKAnnotationView。
问题是当注释在地图上重叠时(在我的应用中,注释是照片而这些照片可能会重叠),当你点击前面出现的注释时,它是另一个接收事件的注释(在背面)(似乎是随机的。
我没有找到任何方法将事件发送到前端注释。 我无法相信这个错误/问题没有任何解决方案!
stackoverflow上的Z ordering和Order 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;
}
答案 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添加手势识别器应该可以解决问题。