You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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.plistFonts 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

火山引擎 最新活动