Как использовать альтернативный вес шрифта (например, короткий) в WKInterfaceLabel?

В ресурсах по дизайну Apple Watch есть документ под названием Альтернативный вес шрифта и выделение курсивом. В нем показаны примеры того, как выглядит шрифт по умолчанию с различными атрибутами, такими как Курсив, Выделенный и Короткий.

Предположим, я хочу использовать шрифт, который выглядит точно так же, как в примере «Short».

  1. Есть ли способ выбрать этот шрифт и стиль через раскадровку для ярлыка?

  2. В коде, как мне установить метку для использования этого шрифта и стиля?


person Senseful    schedule 03.04.2015    source источник


Ответы (1)


В проекте iOS я попытался изменить основной шрифт (UIFontTextStyleBody), включив в него UIFontDescriptorTraitTightLeading. Когда я читаю свойства fontAttributes, он сообщает NSFontNameAttribute как .AppleSystemUIShortBody (исходное значение .AppleSystemUIBody).

Из этого я смог выяснить условия Apple:

+------------+-----------------------------------+------------------------------+---------------------------------+
|    Term    |  UIFontDescriptorSymbolicTraits   |     NSFontNameAttribute      |    NSCTFontUIUsageAttribute     |
+------------+-----------------------------------+------------------------------+---------------------------------+
|            | (none)                            | .AppleSystemUIBody           | UICTFontTextStyleBody           |
| Italic     | UIFontDescriptorTraitItalic       | .AppleSystemUIItalicBody     | UICTFontTextStyleItalicBody     |
| Emphasized | UIFontDescriptorTraitBold         | .AppleSystemUIEmphasizedBody | UICTFontTextStyleEmphasizedBody |
| Short      | UIFontDescriptorTraitTightLeading | .AppleSystemUIShortBody      | UICTFontTextStyleShortBody      |
| Tall?      | UIFontDescriptorTraitLooseLeading | .AppleSystemUISpliceTallBody | UICTFontTextStyleTallBody       |
+------------+-----------------------------------+------------------------------+---------------------------------+

Если вы попытаетесь сделать то же самое с UIFontDescriptorTraitExpanded, UIFontDescriptorTraitCondensed, UIFontDescriptorTraitVertical, UIFontDescriptorTraitUIOptimized, а затем прочитаете fontAttributes, будет возвращено то же значение, что и в стиле Body. Если вы попробуете то же самое с UIFontDescriptorTraitMonoSpace, он вернет словарь nil.

Поэтому в проекте Apple Watch вы должны использовать шрифт Body Short Emphasized следующим образом:

/*1*/ UIFontDescriptor *fontDescriptor = [UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleBody];
/*2*/ fontDescriptor = [fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitTightLeading | UIFontDescriptorTraitBold];
/*3*/ UIFont *font = [UIFont fontWithDescriptor:fontDescriptor size:0];
/*4*/ [label setAttributedText:[[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName: font}]];

Я говорю «должен», потому что здесь есть две ошибки:

  • В строке 2 указывается UIFontDescriptorTraitTightLeading, но эта черта игнорируется на обоих симуляторах часов. Жирный и курсив работают просто отлично.
  • В строке 3, поскольку size имеет значение 0, оно получает свое значение из UIFontDescriptorSizeAttribute в fontDescriptor [1]. Проблема в том, что на 38-мм устройстве есть ошибка как с +[UIFontDescriptor preferredFontDescriptorWithTextStyle:], так и с -[UIFont preferredFontForTextStyle:] (используется в строке 1). Когда пользователь не настраивает размер шрифта, оба метода возвращают 16, тогда как на 38-мм устройстве явно следует выбрать 15 . (Вы можете убедиться в этом, разместив метку на раскадровке, назначив ей размер Body и визуально сравнив ее с меткой, которая вручную устанавливает размер 15.)

Примечание. Я использую Xcode 6.2.

person Senseful    schedule 08.04.2015