Swift修改GMSAutocompleteViewController导航栏颜色问题求助
解决GMSAutocompleteViewController导航栏颜色修改无效的问题
我之前也踩过这个坑!直接通过autocompleteController.navigationController?.navigationBar设置颜色之所以无效,是因为Google的这个控制器内部的导航控制器是懒加载的——你在present它之前去访问navigationController属性,它还没被初始化呢,自然设置不会生效。
给你两个靠谱的解决方案:
方案一:用UIAppearance针对性设置(推荐)
在present GMSAutocompleteViewController之前,用UIAppearance API专门给这个控制器的导航栏设置样式,这样内部导航控制器创建时会自动应用这些样式:
// 先配置针对GMSAutocompleteViewController的导航栏样式 UINavigationBar.appearance(whenContainedInInstancesOf: [GMSAutocompleteViewController.self]).barTintColor = UIColor.blue UINavigationBar.appearance(whenContainedInInstancesOf: [GMSAutocompleteViewController.self]).tintColor = UIColor.blue // 关键!设置导航栏不透明,否则barTintColor可能显示不出来 UINavigationBar.appearance(whenContainedInInstancesOf: [GMSAutocompleteViewController.self]).isTranslucent = false // 然后再初始化并present控制器 let autocompleteController = GMSAutocompleteViewController() autocompleteController.primaryTextHighlightColor = UIColor.jnlyDarkGrey // 其他配置... present(autocompleteController, animated: true)
方案二:通过代理/重写生命周期方法修改
如果你不想用全局样式,可以利用控制器的生命周期方法或者代理,在导航控制器初始化完成后再修改:
// 方法1:扩展GMSAutocompleteViewController重写viewDidAppear extension GMSAutocompleteViewController { open override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) navigationController?.navigationBar.barTintColor = .blue navigationController?.navigationBar.tintColor = .blue navigationController?.navigationBar.isTranslucent = false } } // 方法2:利用代理(可选) autocompleteController.delegate = self // 实现代理方法,在控制器即将显示时设置 func autocompleteViewController(_ viewController: GMSAutocompleteViewController, didAutocompleteWith place: GMSPlace) { // 这里也可以设置,但viewDidAppear时机更稳妥 }
不过方案二可能会出现短暂的白色导航栏闪屏情况,所以方案一的UIAppearance方法体验更顺畅。
另外还要注意:如果你的项目有全局导航栏样式配置,要确保没有覆盖掉针对GMSAutocompleteViewController的特殊设置哦。
内容的提问来源于stack exchange,提问作者N. Beer
相关产品推荐
相关产品推荐

