在iOS11上,annotationView.layer的zPosition停止工作。每次地图区域发生变化。
- 原来的解决方案没有成功:layer.zPosition = X;
- 使用
bringViewToFront
/SendViewToBack
方法也没有成功
Xcode 8.3/9
更新(感谢Elias Aalto提供的解决方案):
创建MKAnnotationView时:
annotationView.layer.zPosition = 50;
if (IS_OS_11_OR_LATER) {
annotationView.layer.name = @"50";
[annotationView.layer addObserver:MeLikeSingleton forKeyPath:@"zPosition" options:0 context:NULL];
}
在MeLikeSingleton或其他观察者对象中:
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
if (IS_OS_11_OR_LATER) {
if ([keyPath isEqualToString:@"zPosition"]) {
CALayer *layer = object;
int zPosition = FLT_MAX;
if (layer.name) {
zPosition = layer.name.intValue;
}
layer.zPosition = zPosition;
//DDLogInfo(@"Name:%@",layer.name);
}
}
}
- 这个解决方案使用layer.name值来跟踪zOrder。如果您有多层zPosition(用户位置,聚类,图钉,弹出);)
- 没有for循环,只有KVO
- 我使用了一个单例对象来观察层的值变化。如果您在应用程序中使用多个MKMapViews。
在iOS11之前它是如何工作的
...是使用
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views
在此设置zPosition。
但是在iOS11中,这种方法(对于我们中的一些人来说,仍然不知道为什么)已经不起作用了!