Swift 4 iOS-完全覆盖系统字体而不会损害情节提要的字体大小

时间:2019-02-02 14:51:43

标签: ios swift xcode fonts swift4.2

我想:

  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)
        }
    }
    

    这是可行的,但情节提要板显然不会更新视图。而且我不确定这是否是正确的方法

1 个答案:

答案 0 :(得分:2)

我采用的解决方案与#2 solution类似,但是它也在情节提要上呈现了字体。

我们创建了一些扩展默认UIView的类,例如,用于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字体,就可以一次通过代码对其进行更改。