14

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

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

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

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
   for (MKAnnotationView * 视图中的 annView) {
      TopBottomAnnotation * ann = (TopBottomAnnotation *) [annView 注释];
      如果([安顶]){
         [[annView superview] 带来SubviewToFront:annView];
      } 别的 {
         [[annView 超级视图] sendSubviewToBack:annView];
      }
   }

}

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

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

4

3 回答 3

8

如果你有一个自定义的 annotationView(听起来你已经有了),你可以尝试添加这个:

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

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

于 2009-11-05T16:54:34.953 回答
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
于 2009-12-04T18:40:27.683 回答
6

尝试另一种解决方案,在以下位置设置注释视图层的 zPosition (annotationView.layer.zPosition):

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

于 2013-05-03T11:12:52.157 回答