如何隐藏NavigationViewController中NavigationMapView的logoView?MGLMapView可行但该场景失效
我看了你遇到的问题——在普通MGLMapView里能顺利隐藏logo,但在NavigationViewController的NavigationMapView里却失效了,这确实挺让人困惑的。咱们来拆解下问题出在哪,以及怎么解决:
问题根源
你当前是在present的completion回调里设置logoView.isHidden = true,但这里有个关键问题:NavigationViewController的地图视图及相关子组件(包括logo)的初始化和布局时机可能晚于present完成的时机,或者logo的显示状态被导航的样式(比如你用的DayStyle)给覆盖了。
可行解决方案
方案1:通过自定义导航样式来隐藏Logo
这是最推荐的方式,因为Mapbox Navigation SDK的样式系统本来就负责控制UI元素的显示。你可以继承DayStyle,重写相关方法来隐藏logo:
class CustomDayStyle: DayStyle { override func apply() { super.apply() // 隐藏地图上的logo mapView?.logoView.isHidden = true // 如果还想隐藏版权信息,也可以加这句 // mapView?.attributionButton.isHidden = true } }
然后在创建NavigationOptions的时候用这个自定义样式:
let styles = [CustomDayStyle()] let options = NavigationOptions(styles: styles, navigationService: navigationService(route: route, options: routeOptions))
方案2:延迟设置Logo的隐藏状态
如果不想自定义样式,也可以延迟一点再设置,确保mapView的子视图已经完全加载完成。比如把设置代码放在DispatchQueue.main.asyncAfter里:
func presentAndRemoveMapview(_ navigationViewController: NavigationViewController, completion: CompletionHandler?) { navigationViewController.modalPresentationStyle = .fullScreen activeNavigationViewController = navigationViewController present(navigationViewController, animated: true) { // 延迟0.1秒,确保视图层级完全初始化 DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { activeNavigationViewController?.mapView?.logoView.isHidden = true } completion?() } }
方案3:通过NavigationViewController的代理方法设置
利用NavigationViewControllerDelegate的回调,在视图完全显示后再设置:
extension YourViewController: NavigationViewControllerDelegate { func navigationViewControllerDidFinishLoadingMap(_ navigationViewController: NavigationViewController) { // 地图加载完成后隐藏logo navigationViewController.mapView?.logoView.isHidden = true } }
记得确保你已经设置了navigationViewController.delegate = self,这个回调会在地图完全加载好之后触发,时机更可靠。
为什么原来的方式不行?
当你在present的completion里执行代码时,NavigationViewController的view已经被添加到视图层级,但它内部的NavigationMapView可能还在异步加载子视图(包括logoView),这时候设置isHidden可能还没生效,或者之后被样式的初始化代码给覆盖了。上面的几种方案都是从时机或者样式控制的角度来解决这个问题。
内容的提问来源于stack exchange,提问作者Dylan

