В проект за 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
, то връща същата стойност като стила на тялото. Ако опитате същото с 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 mm устройство има грешка както с +[UIFontDescriptor preferredFontDescriptorWithTextStyle:]
, така и с -[UIFont preferredFontForTextStyle:]
(използван на ред 1). Когато потребителят не персонализира размера на шрифта, и двата метода връщат 16
, когато ясно 15
трябва да бъде избрано на 38 mm устройство . (Можете да проверите това, като поставите етикет върху разкадровка, зададете му размер Тяло и визуално го сравните с етикет, който задава размера му на 15 ръчно.)
Забележка: Работя с Xcode 6.2.
person
Senseful
schedule
08.04.2015