iOS开发中如何为不同Target添加并设置对应的自定义字体
多Target下Storyboard Label自定义字体配置步骤
前置校验(必须做,90%的字体不生效问题都出在这)
- 先确认每个ttf字体文件的Target Membership只勾选了对应需要使用的Target,不要全选所有Target,避免字体串包、安装包体积冗余。
- 先运行代码打印当前Target下系统实际识别的可用字体名,ttf文件名≠代码/Storyboard里可调用的字体名,必须用打印出来的准确名称才能生效:
// App启动后或对应页面加载时调用,控制台会输出所有可用字体 for family in UIFont.familyNames.sorted() { print("字体族:\(family)") for fontName in UIFont.fontNames(forFamilyName: family).sorted() { print(" 可调用字体名:\(fontName)") } }
切换不同Target运行一次,分别记下来每个Target下粗体、半粗体、常规三个字重对应的准确字体名,后面配置直接用。
配置方式选择
方式1:Storyboard可视化配置(适合单Target调试用,多Target不推荐)
- 选中需要设置的Label,打开右侧属性检查器(Attributes Inspector),找到Font选项,点击下拉菜单选择
Custom - 在Family下拉列表里选中对应字重的自定义字体,再手动调整到你需要的字号即可
注意:这种方式下切换Target运行时,如果当前Target没有包含Storyboard中选中的字体,系统会自动回退为默认系统字体,不会触发崩溃,但显示效果不符合预期。
方式2:代码动态配置(多Target场景首选,无回退问题)
不需要反复修改Storyboard配置,按编译Target自动匹配对应字体即可:
- 先把Storyboard里的3个Label通过IBOutlet关联到对应控制器代码中,分别对应粗体、半粗体、常规字重的控件
- 给每个Target设置唯一的编译标识:进入对应Target的
Build Settings,搜索Other Swift Flags,给三个Target分别添加-DTARGET_A、-DTARGET_B、-DTARGET_C(名称可以自定义,保证唯一即可) - 在页面的
viewDidLoad生命周期方法中,按当前编译的Target给Label赋值对应字体:
override func viewDidLoad() { super.viewDidLoad() // 按Target匹配对应字体,字号按你实际需求修改 #if TARGET_A boldLabel.font = .init(name: "TargetA粗体字体名", size: 20) semiboldLabel.font = .init(name: "TargetA半粗体字体名", size: 17) regularLabel.font = .init(name: "TargetA常规字体名", size: 14) #elseif TARGET_B boldLabel.font = .init(name: "TargetB粗体字体名", size: 20) semiboldLabel.font = .init(name: "TargetB半粗体字体名", size: 17) regularLabel.font = .init(name: "TargetB常规字体名", size: 14) #else boldLabel.font = .init(name: "TargetC粗体字体名", size: 20) semiboldLabel.font = .init(name: "TargetC半粗体字体名", size: 17) regularLabel.font = .init(name: "TargetC常规字体名", size: 14) #endif }
如果项目里Label数量多,不想逐个关联控件,可以给UILabel写分类,通过方法替换拦截awakeFromNib生命周期,根据Label默认的字重属性自动匹配当前Target下的对应自定义字体,一次配置全局生效。
内容的提问来源于stack exchange,提问作者Asmita
相关产品推荐
相关产品推荐

