MKAnnotationViews的Z排序

时间:2009-11-05 16:04:53

标签: iphone mapkit mkpinannotationview

我对MKMapKit的局限感到非常沮丧。我当前的问题与注释视图的z排序有关,特别是当它与触摸相关时。如果您接受默认的z顺序,则mapkit会为您提供:

  1. 订单显示为随机。 z顺序与添加注释的顺序无关。
  2. 如果一个注释最终位于另一个注释之上,则触摸顶部注释通常会显示底部注释的标注。似乎命中检测甚至不尊重绘制顺序。怎么了?
  3. 我尝试使用类似于网络上的以下代码解决#1(其设计旨在对z顺序进行一些控制)

    - (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
       for (MKAnnotationView * annView in views) {
          TopBottomAnnotation * ann = (TopBottomAnnotation *) [annView annotation];
          if ([ann top]) {
             [[annView superview] bringSubviewToFront:annView];
          } else {
             [[annView superview] sendSubviewToBack:annView];
          }
       }
    
    }
    

    运行传递给mapView的注释视图:didAddAnnotationViews:并调整它们的z顺序确实似乎修复了#1。问题是现在标注视图不再总是位于注释视图的顶部。 MapKit似乎对图层感到非常困惑(应在所有注释视图上方的图层中绘制标注)。我甚至可以弄清楚它是如何混淆的,因为你收到的所有MKAnnotationViews都有相同的superview(私有类MKOverlayView)。您会认为任何合理的设计都会绘制有关此叠加视图的标注。

    有没有人成功解决了#1或#2?

3 个答案:

答案 0 :(得分:8)

如果您有自定义annotationView(听起来像您已经拥有),可以尝试添加:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    [self.superview bringSubviewToFront:self];
    [super touchesBegan:touches withEvent:event];
}

副作用是每次触摸标记时它也会弹出到z顺序的前面,这实际上是明智的,因为这是用户关注的内容。

答案 1 :(得分:7)

Ramin,这对我想做的事情来说是完美的。我没有定义自定义注释视图。我通过使用一个类别解决了这个问题,它完美无缺!

以下是标题:

#import <Foundation/Foundation.h> 
#import <MapKit/MapKit.h>


@interface MKPinAnnotationView (ZIndexFix)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; 
@end

实施:

#import "AEBMapViewCategory.h"
@implementation MKPinAnnotationView (ZIndexFix)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    [self.superview bringSubviewToFront:self];
    [super touchesBegan:touches withEvent:event];
}
@end

答案 2 :(得分:6)

尝试另一种解决方案,在:

中设置注释视图图层的zPosition(annotationView.layer.zPosition)

(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views;