You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

为啥你的代码没效果?大概率踩了这些坑

  1. 没嵌套导航控制器:VC直接当根控制器,导航栏根本不存在,代码自然无效。
  2. iOS版本适配漏了:用了barTintColor这种旧API,没处理iOS13+的UINavigationBarAppearance,新系统上不生效。
  3. Info.plist配置错了:状态栏样式的开关View controller-based status bar appearance没设对,导致preferredStatusBarStyle不起作用。
  4. 代码被覆盖了:其他地方(比如其他VC、全局设置)的导航栏样式把你的设置覆盖了,检查代码执行顺序。

内容的提问来源于stack exchange,提问作者yude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 08:05:38