我对 MKMapKit 的局限性感到相当沮丧。我当前的问题与注释 View 的 z 顺序有关,特别是与触摸相关的问题。如果您接受 Mapkit 为您提供的默认 z 顺序:
- 顺序是随机的。 z 顺序与添加注释的顺序无关。
- 如果一个注释最终位于另一个注释之上,触摸顶部注释通常会弹出底部注释的标注。似乎命中检测甚至不尊重绘制顺序。这是怎么回事?
我尝试使用类似于以下在网络上找到的代码(旨在对 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/