将所有UILabel更改为特定的UIFont.TextStyle

时间:2019-03-04 15:45:35

标签: ios swift cocoa-touch

我在我的应用中使用const dbRef = admin.database().ref('/users/' + identifiant + '/mesures'); dbRef.push(mesure) .then(snapshot => { res.status(200).send('ok'); }) .catch(err => { res.status(500).send(err); }); 支持动态字体。我面临着为每个TextStyles更改字体的挑战。因此,例如TextStyle应该是 MyAwesomeBODYFont ,而TextStyle.body应该是 MyAwesomeHeadlineFont 。而这对于整个应用程序而言。设置整个应用程序的字体无法正常工作,因为我需要使用几种不同样式的字体。

是否可以对整个应用而不是对每个标签分别使用自定义字体覆盖这些TextStyle.headline

我尝试过的事情:

通常为TextStyles的{​​{1}}代理设置字体是可以的:

appearance

但这会覆盖所有标签,无论它们使用什么UILabel

此后,我尝试检查let labelAppearance = UILabel.appearance() let fontMetrics = UIFontMetrics(forTextStyle: .body) labelAppearance.font = fontMetrics.scaledFont(for: myAwesomeBodyFont) ,但由于UILabel.appearance()。font的nil指针异常而崩溃,甚至没有进入if块。

TextStyle

因为UILabel的外观没有设置TextStyle

2 个答案:

答案 0 :(得分:0)

您不能直接“设置”文本样式的自定义字体。 您可以获取文本样式的字体大小,然后可以使用自定义系列。

let systemDynamicFontDescriptor = UIFontDescriptor.preferredFontDescriptorWithTextStyle(UIFontTextStyleBody)
let size = systemDynamicFontDescriptor.pointSize
let font = UIFont(name: MyAwesomeBODYFont, size: size)

对于iOS 11+,有scaledFont()

您可以将此字体变量设为静态,并可以在应用程序中的任何地方使用它。

您也可以查看此解决方案:https://stackoverflow.com/a/42235227/4846167

答案 1 :(得分:0)

我最终创建了UILabel的子类,并让我的所有标签都继承自它。这样,您可以在InterfaceBuilder中设置类和/或在代码中创建自定义类。

这是DynamicCustomFontLabel类:

import UIKit

class DynamicCustomFontLabel: UILabel {

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!

        initCustomFont()
    }

    override init(frame: CGRect) {
        super.init(frame: frame)

        initCustomFont()
    }

    private func initCustomFont() {
        if let textStyle = font.fontDescriptor.object(forKey: UIFontDescriptor.AttributeName.textStyle) as? UIFont.TextStyle {
            let fontMetrics = UIFontMetrics(forTextStyle: textStyle)
            var customFont: UIFont?

            switch textStyle {
            case .body:
                customFont = UIFont(name: "MyAwesomeBODYFont", size: 21)

            case .headline:
                customFont = UIFont(name: "MyAwesomeHeadlineFont", size: 48)

            // all other cases...

            default:
                return
            }

            guard let font = customFont else {
                fatalError("Failed to load a custom font! Make sure the font file is included in the project and the font is added to the Info.plist.")
            }

            self.font = fontMetrics.scaledFont(for: font)
        }
    }
}