iOS导航栏自定义字体首次加载不生效问题求助
修复首次打开App时导航栏自定义字体不生效的问题
这个问题我之前也碰到过,大概率是导航栏初始化时机和字体设置时机不匹配导致的——App刚启动时导航栏还没完全完成初始化,直接设置的字体样式被系统默认样式覆盖了,而切换页面返回时导航栏重新渲染,自定义字体才会生效。下面给你几个靠谱的解决方法:
方法1:在导航控制器初始化完成后设置(推荐)
别只在AppDelegate里全局设置,给UINavigationController写个扩展,或者在自定义导航控制器的viewDidLoad里设置字体,确保导航栏已经准备好再应用样式:
extension UINavigationController { override open func viewDidLoad() { super.viewDidLoad() // 替换成你的自定义字体名称和大小 guard let navigationFont = UIFont(name: "MuseoSans-700", size: 18) else { print("自定义字体加载失败,请检查字体名称") return } // 设置导航栏标题字体 let textAttributes = [NSAttributedString.Key.font: navigationFont] navigationBar.titleTextAttributes = textAttributes // 如果需要给导航栏按钮也设置字体,加上下面这行 UIBarButtonItem.appearance().setTitleTextAttributes(textAttributes, for: .normal) } }
方法2:调整UIAppearance的设置时机
如果不想改导航控制器的结构,那就在AppDelegate里先初始化好窗口和根控制器,再设置UIAppearance样式,确保窗口已经可见:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 先初始化窗口和根导航控制器 window = UIWindow(frame: UIScreen.main.bounds) let rootVC = YourRootViewController() let navVC = UINavigationController(rootViewController: rootVC) window?.rootViewController = navVC window?.makeKeyAndVisible() // 这里再设置导航栏字体 guard let navigationFont = UIFont(name: "MuseoSans-700", size: 18) else { print("自定义字体加载失败") return true } UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.font: navigationFont] return true }
方法3:排查字体导入的基础问题
别忘了先确认最基础的环节没出错:
- 自定义字体文件已经添加到项目中,并且勾选了对应的target
- 在
Info.plist的Fonts provided by application里正确填写了字体的完整文件名(包括.ttf/.otf后缀) - 用
print(UIFont.familyNames)打印所有可用字体,确认你的字体名称(注意字体名称可能和文件名不一样,比如文件名是MuseoSans-700.ttf,但字体名称可能是MuseoSans)
应急方案:延迟设置字体
如果以上方法都暂时没法试,可以用延迟设置的方式绕过初始化时机问题,不过这算是临时方案,不推荐长期用:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 其他初始化代码... DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { guard let navigationFont = UIFont(name: "MuseoSans-700", size: 18) else { return } UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.font: navigationFont] } return true }
内容的提问来源于stack exchange,提问作者Box House




