iOS13下Interface Builder自定义UINavigationBar样式异常及Xcode11.4.1未修复问题求助
这个导航栏的IB配置bug确实折腾了不少iOS开发者,我来分享下目前可行的解决方案和思路:
问题复盘
- 在iOS 13环境下,搭配Xcode 11.4或11.4.1使用Interface Builder(Storyboard/XIB)自定义
UINavigationBar时,会碰到一个棘手的问题:当你同时设置barTintColor和标题文本颜色(包括大标题和常规标题)时,标题颜色会被完全忽略 - 试着改用父类
UIView的backgroundColor来替代barTintColor?抱歉,同样会出问题 - 虽然Xcode 11.4.1的发布说明明确提到,已经修复了Storyboard/XIB中部分
UINavigationBar外观属性被忽略的问题(对应bug编号60883063、FB7639654),但实际测试下来,这个bug依然存在
可行的解决方案
1. 代码层面自定义(推荐的标准替代方案)
既然IB的配置不靠谱,最稳妥的方式就是用代码来统一控制导航栏样式,彻底避开IB的属性冲突问题。这里分两种场景给你示例:
全局统一配置(在AppDelegate或SceneDelegate中)
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 创建导航栏外观配置实例 let navBarAppearance = UINavigationBarAppearance() // 设置背景色(对应IB里的barTintColor) navBarAppearance.backgroundColor = .systemBlue // 配置常规标题的颜色 navBarAppearance.titleTextAttributes = [.foregroundColor: UIColor.white] // 配置大标题的颜色 navBarAppearance.largeTitleTextAttributes = [.foregroundColor: UIColor.white] // 应用到全局导航栏 UINavigationBar.appearance().standardAppearance = navBarAppearance // 适配大标题滚动后的样式(避免滚动后样式突变) UINavigationBar.appearance().scrollEdgeAppearance = navBarAppearance return true }
单个导航控制器单独定制
如果只需要给特定页面的导航栏改样式,可以在对应ViewController的viewDidLoad里设置:
override func viewDidLoad() { super.viewDidLoad() let navBarAppearance = UINavigationBarAppearance() navBarAppearance.backgroundColor = .darkGray navBarAppearance.titleTextAttributes = [.foregroundColor: UIColor.yellow] navBarAppearance.largeTitleTextAttributes = [.foregroundColor: UIColor.yellow] // 应用到当前导航控制器的导航栏 navigationController?.navigationBar.standardAppearance = navBarAppearance navigationController?.navigationBar.scrollEdgeAppearance = navBarAppearance }
2. 临时IB workaround(不推荐,仅应急用)
如果实在必须用IB配置,你可以试试这个不稳定的临时办法:
- 先单独设置标题颜色,确保预览里显示正常
- 再设置
barTintColor,如果此时标题颜色被覆盖了,重新选中导航栏,再手动设置一次标题颜色 - 注意:这种方式很不稳定,重新打开Storyboard或者编译后,bug可能又会出现,只适合临时测试用
后续建议
- 持续关注Xcode的更新,等官方彻底修复这个bug后,再回归IB的配置方式
- 如果你的项目还在受这个问题困扰,可以通过苹果开发者中心提交反馈,引用已有的bug编号FB7639654,帮助苹果更快定位修复
内容的提问来源于stack exchange,提问作者Craig Grummitt
相关产品推荐
相关产品推荐

