Swift 4 iOS - 在不影响故事板字体大小的情况下完全覆盖系统字体
Swift 4 iOS - Completely override system font without compromising storyboard font size
我愿意:
- 覆盖所有应用程序中的默认字体,从情节提要中选择字体大小
- 如果可能,请在情节提要中可视化的文本中查看自定义字体的预览。
我成功插入了自定义字体,但我在调整文本大小方面遇到了问题。
我尝试了以下解决方案,但它们仍然不完全符合我的要求:
- 在 didFinishLaunchingWithOptions 函数中的
AppDelegate
中添加了这一行:
UILabel.appearance().font = UIFont(name: "yourFont", size: yourSize)
这会覆盖所有 UILabel 的字体,但也会覆盖字体大小。
所有标签都具有相同的 yourSize
字体大小。
我扩展了 UILabel 强制它执行 changeFontName。
extension UILabel {
override open func awakeFromNib() {
super.awakeFromNib()
changeFontName()
}
func changeFontName() {
self.font = UIFont(name: "yourFont", size: self.font.pointSize)
}
}
这是可行的,但故事板显然不会更新视图。我不确定这样做是否正确
我采用的解决方案与 #2 solution
类似,但它也在故事板上呈现字体。
我们创建了一些 class 扩展默认 UIView 的元素,例如 UILabel
和 UIButton
。你可以这样做:
@IBDesignable
public class CustomUILabel: UILabel {
public override func awakeFromNib() {
super.awakeFromNib()
configureLabel()
}
public override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
configureLabel()
}
func configureLabel() {
font = UIFont(name: "MyCustomFont", size: self.font.pointSize)
}
}
@IBDesignable
public class CustomUIButton: UIButton {
public override func awakeFromNib() {
super.awakeFromNib()
configureLabel()
}
public override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
configureLabel()
}
func configureLabel() {
titleLabel?.font = UIFont(name: "MyCustomFont", size: self.titleLabel!.font.pointSize)
}
}
然后在情节提要中,我们在 Identity Inspector
中将 class 设置为 Custom Class
到每个必须更改字体的组件。
这不是最干净的解决方案,但至少如果您在整个应用程序中更改 MyCustomFont
字体,您只需通过代码一次更改即可。
我愿意:
- 覆盖所有应用程序中的默认字体,从情节提要中选择字体大小
- 如果可能,请在情节提要中可视化的文本中查看自定义字体的预览。
我成功插入了自定义字体,但我在调整文本大小方面遇到了问题。
我尝试了以下解决方案,但它们仍然不完全符合我的要求:
- 在 didFinishLaunchingWithOptions 函数中的
AppDelegate
中添加了这一行:
UILabel.appearance().font = UIFont(name: "yourFont", size: yourSize)
这会覆盖所有 UILabel 的字体,但也会覆盖字体大小。 所有标签都具有相同的yourSize
字体大小。 我扩展了 UILabel 强制它执行 changeFontName。
extension UILabel { override open func awakeFromNib() { super.awakeFromNib() changeFontName() } func changeFontName() { self.font = UIFont(name: "yourFont", size: self.font.pointSize) } }
这是可行的,但故事板显然不会更新视图。我不确定这样做是否正确
我采用的解决方案与 #2 solution
类似,但它也在故事板上呈现字体。
我们创建了一些 class 扩展默认 UIView 的元素,例如 UILabel
和 UIButton
。你可以这样做:
@IBDesignable
public class CustomUILabel: UILabel {
public override func awakeFromNib() {
super.awakeFromNib()
configureLabel()
}
public override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
configureLabel()
}
func configureLabel() {
font = UIFont(name: "MyCustomFont", size: self.font.pointSize)
}
}
@IBDesignable
public class CustomUIButton: UIButton {
public override func awakeFromNib() {
super.awakeFromNib()
configureLabel()
}
public override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
configureLabel()
}
func configureLabel() {
titleLabel?.font = UIFont(name: "MyCustomFont", size: self.titleLabel!.font.pointSize)
}
}
然后在情节提要中,我们在 Identity Inspector
中将 class 设置为 Custom Class
到每个必须更改字体的组件。
这不是最干净的解决方案,但至少如果您在整个应用程序中更改 MyCustomFont
字体,您只需通过代码一次更改即可。