Swift开发:如何同时自定义导航栏、状态栏颜色及ViewController标题样式?
问题排查与解决方案
先确认最关键的一点
你的WinLoseViewController必须被嵌入到UINavigationController里!如果是直接把VC设为根控制器,导航栏相关的代码全白搭,先检查Storyboard或者代码里有没有做嵌套。
导航栏+状态栏背景色设置(适配iOS13+)
网上很多旧方法在iOS13之后失效,因为苹果改用了UINavigationBarAppearance来管理导航栏样式,正确的写法分两种:
全局生效(在AppDelegate里设置)
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 创建导航栏外观配置 let navBarAppearance = UINavigationBarAppearance() // 设置红色背景 navBarAppearance.backgroundColor = .red // 强制导航栏不透明(避免滚动时变半透明) navBarAppearance.configureWithOpaqueBackground() // 把配置应用到所有模式(标准、滚动、紧凑) UINavigationBar.appearance().standardAppearance = navBarAppearance UINavigationBar.appearance().scrollEdgeAppearance = navBarAppearance UINavigationBar.appearance().compactAppearance = navBarAppearance // 状态栏文字设为白色(红色背景下更清晰) // 注意:需要在Info.plist里把 `View controller-based status bar appearance` 设为 NO application.statusBarStyle = .lightContent return true }
仅单个VC生效(在WinLoseViewController里设置)
override func viewDidLoad() { super.viewDidLoad() let navBarAppearance = UINavigationBarAppearance() navBarAppearance.backgroundColor = .red navBarAppearance.configureWithOpaqueBackground() // 应用到当前导航栏 navigationController?.navigationBar.standardAppearance = navBarAppearance navigationController?.navigationBar.scrollEdgeAppearance = navBarAppearance // 触发状态栏样式更新 setNeedsStatusBarAppearanceUpdate() } // 重写这个方法自定义状态栏样式(需要Info.plist里 `View controller-based status bar appearance` 设为 YES) override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
导航栏标题字体/大小修改
同样要基于UINavigationBarAppearance设置,旧的titleTextAttributes直接写在UINavigationBar.appearance()上,iOS13+不会生效:
全局设置(加到AppDelegate的代码里)
在创建navBarAppearance之后加这段:
// 自定义字体和大小,这里用系统粗体20号,你可以换成自己需要的字体 let titleFont = UIFont.systemFont(ofSize: 20, weight: .bold) navBarAppearance.titleTextAttributes = [ .font: titleFont, .foregroundColor: UIColor.white // 可选:标题文字设为白色 ]
单个VC设置(加到WinLoseViewController的viewDidLoad里)
// 比如用PingFangSC粗体22号,找不到字体就 fallback 到系统粗体 let titleFont = UIFont(name: "PingFangSC-Bold", size: 22) ?? UIFont.boldSystemFont(ofSize: 22) navBarAppearance.titleTextAttributes = [.font: titleFont] // 别忘了重新应用配置 navigationController?.navigationBar.standardAppearance = navBarAppearance navigationController?.navigationBar.scrollEdgeAppearance = navBarAppearance
为啥你的代码没效果?大概率踩了这些坑
- 没嵌套导航控制器:VC直接当根控制器,导航栏根本不存在,代码自然无效。
- iOS版本适配漏了:用了
barTintColor这种旧API,没处理iOS13+的UINavigationBarAppearance,新系统上不生效。 - Info.plist配置错了:状态栏样式的开关
View controller-based status bar appearance没设对,导致preferredStatusBarStyle不起作用。 - 代码被覆盖了:其他地方(比如其他VC、全局设置)的导航栏样式把你的设置覆盖了,检查代码执行顺序。
内容的提问来源于stack exchange,提问作者yude
相关产品推荐
相关产品推荐

