iOS开发:从VC1传递MGLMapView到VC2无法显示问题求助
解决MGLMapView在视图控制器间传递不显示的问题
嘿,这个坑我之前踩过!你碰到的问题核心原因很关键:UIView同一时间只能属于一个父视图。
你直接把VC1的mapboxView赋值给VC2的mapView时,这个地图视图其实还牢牢绑定在VC1的视图层级里——它的superview还是VC1的view。哪怕你在VC2里调用addSubview(mapView),系统也不会把它从原来的父视图移走并添加到VC2的view上,所以自然看不到它。至于打印尺寸不为0,是因为你拿到的是这个视图在VC1里的frame值,它本身的尺寸属性并没有变,但它不在VC2的视图树里,所以无法渲染显示。
给你两种可行的解决方案:
方案一:创建新的地图实例并同步配置(推荐)
这种方式是最稳妥的,每个视图控制器维护自己的MGLMapView实例,然后把VC1中地图的关键配置同步过去,保证两个页面的地图状态一致:
// 在VC1准备push到VC2时 let vc2 = VC2() // 同步地图的核心配置 vc2.targetCenter = mapboxView.centerCoordinate vc2.targetZoomLevel = mapboxView.zoomLevel vc2.targetStyleURL = mapboxView.styleURL // 如果你有自定义的注解、图层等,也需要同步过去 self.navigationController?.pushViewController(vc2, animated: true) // 在VC2的viewDidLoad中初始化地图 override func viewDidLoad() { super.viewDidLoad() let mapView = MGLMapView(frame: view.bounds) // 设置自动适配父视图尺寸变化 mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight] // 应用同步过来的配置 mapView.centerCoordinate = targetCenter mapView.zoomLevel = targetZoomLevel mapView.styleURL = targetStyleURL view.addSubview(mapView) self.mapView = mapView }
方案二:复用同一个地图实例(不推荐,有副作用)
如果你一定要复用同一个MGLMapView对象,那必须先把它从VC1的父视图中移除,再添加到VC2的视图里:
// 在VC1准备push时 mapboxView.removeFromSuperview() vc2.mapView = mapboxView self.navigationController?.pushViewController(vc2, animated: true) // 在VC2的viewDidLoad中 override func viewDidLoad() { super.viewDidLoad() mapView.frame = view.bounds mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight] view.addSubview(mapView) }
⚠️ 注意:这个方案有个明显的副作用——当你从VC2返回VC1时,原来的地图视图已经不在VC1的层级里了,除非你在VC1的viewWillAppear里再把它加回去,否则VC1的页面会没有地图。所以一般只在特殊场景下使用。
内容的提问来源于stack exchange,提问作者glemoulant
相关产品推荐
相关产品推荐

