В проекте 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