Swift 4 iOS - 完全覆盖系统字体,而不会影响故事板字体大小



我想:

  1. 覆盖所有应用程序中的默认字体 从情节提要中选择字体大小
  2. 如果可能,请在情节提要中可视化的文本中看到自定义字体的预览。

我设法插入了自定义字体,但我在文本大小方面遇到了问题。

我尝试了以下解决方案,但它们仍然不完全符合我的要求:

  1. 在 didFinishLaunchingWithOptions 函数内的AppDelegate中添加了此行:

    UILabel.appearance().font = UIFont(name: "yourFont", size: yourSize)这将覆盖所有 UILabel 的字体,但它也会覆盖字体大小。所有标签都具有相同的yourSize字体大小。
  2. 我扩展了UILabel,强制它执行changeFontName。

    extension UILabel {
        override open func awakeFromNib() {
            super.awakeFromNib()
            changeFontName()
        }
        func changeFontName() {
            self.font = UIFont(name: "yourFont", size: self.font.pointSize)
        }
    }
    

    这是有效的,但情节提要显然不会更新视图。而且我不确定这是正确的方法吗

我采用的解决方案与#2 solution类似,但它也在故事板上呈现字体。

我们创建了一些扩展默认UIViews的类,例如用于UILabelUIButton。你可以做这样的事情:

@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,作为必须更改字体的每个组件的Custom Class

这不是最干净的解决方案,但至少如果您更改整个应用程序中的MyCustomFont字体,您只需一次通过代码进行更改即可。

最新更新