iOS 11下MKMapView标注弹窗被后方标注遮挡无法点击问题
iOS 11 MKMapView标注弹窗按钮手势被遮挡问题的解决方案
我之前适配iOS 11的时候也碰到过一模一样的问题!当时折腾了好一阵才定位到原因——确实和zPosition层级渲染有关。iOS 11之后,MKMapView对标注视图的层级逻辑做了调整,默认情况下弹窗(不管是系统自带的还是自定义的callout)的层级会被后方的标注视图覆盖,导致按钮的点击手势被拦截,而iOS 11以下版本的渲染逻辑不存在这个问题。
针对这个问题,除了调整弹窗本身的zPosition,还有几个更稳妥的解决方案:
- 调整当前选中标注视图的层级:在
mapView(_:didSelect:)方法里,把选中的MKAnnotationView的zPosition设为一个较高的值(比如1000),当标注被取消选中(mapView(_:didDeselect:))时再恢复默认值。这样整个标注视图(包括关联的弹窗)都会处于最上层,不会被其他标注遮挡。示例代码:func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) { view.zPosition = 1000 } func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) { view.zPosition = 0 } - 自定义弹窗单独设置层级:如果用的是自定义弹窗视图,可以在弹窗显示后,将它的
layer.zPosition设为比所属标注视图的层级更高一级,确保弹窗在标注图片的前方:// 假设customCallout是你的自定义弹窗实例 customCallout.layer.zPosition = annotationView.layer.zPosition + 1 - 尝试bringSubviewToFront方法:在标注被选中时,调用
mapView.bringSubviewToFront(annotationView),这个方法在部分场景下也能解决层级遮挡,不过稳定性不如直接设置zPosition,可以作为备选方案。
关于你问的是否有其他开发者遇到这个问题——当然有!iOS 11刚发布的时候,这个问题在开发者社区里讨论得挺多的,大部分人都是通过调整层级的方式解决的。
内容的提问来源于stack exchange,提问作者Roger Soriano
相关产品推荐
相关产品推荐

