iphone - MKAnnotationViews 的 Z 排序

标签 iphone mapkit mkpinannotationview

我对 MKMapKit 的局限性感到相当沮丧。我当前的问题与注释 View 的 z 顺序有关,特别是与触摸相关的问题。如果您接受 Mapkit 为您提供的默认 z 顺序:

  1. 顺序是随机的。 z 顺序与添加注释的顺序无关。
  2. 如果一个注释最终位于另一个注释之上,触摸顶部注释通常会弹出底部注释的标注。似乎命中检测甚至不尊重绘制顺序。这是怎么回事?

我尝试使用类似于以下在网络上找到的代码(旨在对 z 顺序进行一些控制)的方法来解决 #1

- (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: 的注释 View 并调整它们的 z 顺序似乎修复了#1。问题是现在标注 View 不再总是位于注释 View 之上。 MapKit 似乎对图层感到非常困惑(标注应该绘制在所有注释 View 上方的图层中)。我什至可以弄清楚它是如何变得困惑的,因为您收到的所有 MKAnnotationView 都具有相同的 super View (私有(private)类 MKOverlayView)。您可能会认为任何合理的设计都会绘制有关此覆盖 View 的标注。

有人成功解决了#1 或#2 问题吗?

最佳答案

如果您有自定义的annotationView(听起来您已经有了),您可以尝试添加以下内容:

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

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

关于iphone - MKAnnotationViews 的 Z 排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1681565/

相关文章:

ios - 过滤/排序 MKLocalSearch 响应

objective-c - 如何在 map 工具包中显示默认用户位置和自定义注释 View ?

iphone - RestKit - RKObjectMapping 只运行一次

iphone - presentViewController 不支持 iOS 6 中的方向

iphone - 指定 iOS 应用程序安装目录

ios - MKpolyline 无法正确显示给定坐标

iphone - 如何防止 UITableViewCell 被移离它自己的部分?

ios - Swift 中的 UISearchDisplayController

ios - 更改pincolor后注释标题无法显示

ios - 在 Swift 中为 mapView 上的每个注释显示不同的图像