Невозможно создать Small Caps Selector на iOS 13 - PullRequest
0 голосов
/ 30 сентября 2019

Этот код, приведенный ниже, позволил мне создать небольшой текст заглавными буквами на iOS 12. Однако на iOS 13 он перестал работать.

Журнал iOS 12

.SFUIDisplay-Semibold
.SFUIDisplay-Semibold

Журнал iOS 13

.SFUI-Semibold
TimesNewRomanPSMT

Кажется, что шрифт SFUI изменил имя, по крайней мере, в iOS 13, но он также был удаленподдержка маленьких колпачков?

let font = UIFont.systemFont(ofSize: 20, weight: .semibold)
print(font.fontName)

let settings = [[UIFontDescriptor.FeatureKey.featureIdentifier: kLowerCaseType,
                 UIFontDescriptor.FeatureKey.typeIdentifier: kLowerCaseSmallCapsSelector]]

let attributes: [UIFontDescriptor.AttributeName: AnyObject] = [UIFontDescriptor.AttributeName.featureSettings: settings as AnyObject,
                                                               UIFontDescriptor.AttributeName.name: font.fontName as AnyObject]

let smallCapsFont = UIFont(descriptor: UIFontDescriptor(fontAttributes: attributes), size: 20)
print(smallCapsFont.fontName)

Ответы [ 3 ]

1 голос
/ 30 сентября 2019

Ваш код всегда был неправильным. Вы начинаете с создания шрифта, а затем извлекаете из него дескриптор шрифта, передавая имя :

let font = UIFont.systemFont(ofSize: 20, weight: .semibold)
let settings = [
    [UIFontDescriptor.FeatureKey.featureIdentifier: kLowerCaseType,
    UIFontDescriptor.FeatureKey.typeIdentifier: kLowerCaseSmallCapsSelector]
]
let attributes: [UIFontDescriptor.AttributeName: AnyObject] = [
    UIFontDescriptor.AttributeName.featureSettings: settings as AnyObject,
    UIFontDescriptor.AttributeName.name: font.fontName as AnyObject // ** NO!
]
let smallCapsFont = UIFont(descriptor: UIFontDescriptor(fontAttributes: attributes), size: 20)

Это было никогда правильно. Вы должны получить дескриптор шрифта непосредственно из самого шрифта . Вот как должен выглядеть ваш код всегда . Он работал в iOS 12 и работает сейчас:

let font = UIFont.systemFont(ofSize: 20, weight: .semibold)
let settings = [
    [UIFontDescriptor.FeatureKey.featureIdentifier: kLowerCaseType,
    UIFontDescriptor.FeatureKey.typeIdentifier: kLowerCaseSmallCapsSelector]
]
let desc = font.fontDescriptor.addingAttributes([.featureSettings:settings])
let smallCapsFont = UIFont(descriptor: desc, size: 0)
1 голос
/ 30 сентября 2019

Системные шрифты, подобные этому, теперь более доступны для ссылок с нотацией 'точка' / . (даже при воссоздании их, как в примере font.fontName) согласно:

https://developer.apple.com/videos/play/wwdc2019/227/

Начиная с iOS 13, вы можете использовать новое перечисление UIFontDescriptor.SystemDesign, используя regular, rounded, serif или monospaced.

Пример создания шрифта с использованием дескрипторов вSwift (посмотрите, как я использую параметр design):

extension UIFont {

    convenience init?(
        style: UIFont.TextStyle,
        weight: UIFont.Weight = .regular,
        design: UIFontDescriptor.SystemDesign = .default) {

        guard let descriptor = UIFontDescriptor.preferredFontDescriptor(withTextStyle: style)
            .addingAttributes([UIFontDescriptor.AttributeName.traits: [UIFontDescriptor.TraitKey.weight: weight]])
            .withDesign(design) else {
                return nil
        }
        self.init(descriptor: descriptor, size: 0)
    }
}

0 голосов
/ 30 сентября 2019

Вдохновленный ответом @Ash Camerons, вот обновленный код, который позволяет применять маленькие заглавные буквы

Обратите внимание, это работает только в iOS 13+, но вы можете дополнительно добавить строку .withDesign(systemDesign) дляiOS 13 и выше.

let pointSize: CGFloat = 20
let weight: UIFont.Weight = .semibold
let systemDesign: UIFontDescriptor.SystemDesign = .default

let settings = [[UIFontDescriptor.FeatureKey.featureIdentifier: kLowerCaseType,
                 UIFontDescriptor.FeatureKey.typeIdentifier: kLowerCaseSmallCapsSelector]]

let descriptor = UIFontDescriptor.preferredFontDescriptor(withTextStyle: .callout)
        .addingAttributes([UIFontDescriptor.AttributeName.traits: [UIFontDescriptor.TraitKey.weight: weight]])
        .addingAttributes([UIFontDescriptor.AttributeName.featureSettings: settings])
        .addingAttributes([UIFontDescriptor.AttributeName.size: pointSize])
        .withDesign(systemDesign)

let font = UIFont(descriptor: descriptor!, size: pointSize)
...