Изменить все UILabels для определенного UIFont.TextStyle - PullRequest
0 голосов
/ 04 марта 2019

Я использую TextStyles в своем приложении для поддержки динамических шрифтов.У меня есть задача изменить шрифт для каждого TextStyle.Так, например, TextStyle.body должно быть MyAwesomeBODYFont , а TextStyle.headline должно быть MyAwesomeHeadlineFont .И это для всего приложения.Установка шрифта для всего приложения не будет работать, потому что мне нужно несколько шрифтов для разных стилей.

Можно ли как-то переопределить эти TextStyles с помощью пользовательских шрифтов для всего приложения, а не длякаждая метка отдельно?

Что я пробовал:

Настройка шрифта для appearance прокси UILabel в целом работает нормально:

let labelAppearance = UILabel.appearance()
let fontMetrics = UIFontMetrics(forTextStyle: .body)
labelAppearance.font = fontMetrics.scaledFont(for: myAwesomeBodyFont)

Но это переопределяет все метки, независимо от того, какие TextStyle они используют.

После этого я пытался проверить TextStyle, но он вылетает с исключением нулевого указателя для шрифта UILabel.appearance ().даже не переходите в блок if.

let labelAppearance = UILabel.appearance()
if let textStyle = labelAppearance.font.fontDescriptor.object(forKey: UIFontDescriptor.AttributeName.textStyle) as? UIFont.TextStyle {
    // this would be the place to check for the TextStyle and use the corresponding font

    let fontMetrics = UIFontMetrics(forTextStyle: textStyle)
    labelAppearance.font = fontMetrics.scaledFont(for: mayAwesomeBodyFont)
}

Поскольку внешний вид UILabel не имеет набора font.

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

В итоге я создал подкласс 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)
        }
    }
}
0 голосов
/ 05 марта 2019

Вы не можете напрямую "установить" пользовательский шрифт для текстовых стилей.Вы можете получить размер шрифта для стиля текста, а затем можете использовать пользовательское семейство.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...