2015-09-18 3 views
4

Я хотел бы реализовать метод замены для [NSFont systemFontOfSize:13 weight:NSFontWeightLight], который работает на Mac OS 10.9 и 10.10.10.9 замена для [NSFont systemFontOfSize: вес:]

Я могу получить дескриптор шрифта на [[NSFont systemFontOfSize:13] fontDescriptor].

Однако я не мог понять, как изменить вес дескриптора шрифта и создать из него NSFont.

Как объясняется в WWDC 2015, #804: 30:17, мы не должны брать фамилию из системного шрифта (как предложено here и here).

Можно ли изменить вес дескриптора шрифта и получить от него новый NSFont?

ответ

2

Я могу думать о двух путях, но не дает точно такой же семантики, как +[NSFont systemFontOfSize:weight:].

Один из них - -[NSFontManager convertWeight:ofFont:]. Это просто позволяет вам подниматься или опускаться по весу, а не выбирать определенный целевой вес. Однако, если он предоставляет новый шрифт, вы можете запросить -[NSFontManager weightOfFont:], чтобы получить его вес, где значение 3 «светлое» (см. Таблицу в -convertWeight:ofFont:). Повторяя этот процесс, вы можете получить желаемый вес, хотя метод может выйти из строя или провалиться.

Другой идти от шрифта, шрифт дескриптор нового шрифта дескриптора с нужным весом до нового шрифта:

NSFontDescriptor* origDescriptor = origFont.fontDescriptor; 
NSFontDescriptor* newDescriptor = [origDescriptor fontDescriptorByAddingAttributes:@{ NSFontTraitsAttribute: @{ NSFontWeightTrait: @(-0.2) } }]; 
NSFont* newFont = [NSFont fontWithDescriptor:newDescriptor size:origFont.pointSize]; 

Здесь я просто выбрал -0.2 произвольно. Проблема с этим подходом заключается в том, что он принимает значения веса от -1,0 до 1,0, причем 0 является «нормальным». Неясно, как сопоставить эту шкалу с «легким весом». Я предполагаю, что вы можете запросить некоторые легкие шрифты, которые вы приобретаете по имени, чтобы узнать, что их вес.

+0

Для второго метода предполагалось использовать -0.4 для «света», потому что это константа, обеспечиваемая 10.11 для константы NSFontWeightLight. –

+0

К сожалению, ни один из этих методов не работает. Тот же оригинальный шрифт возвращается из обоих. –

+0

Вы уверены, что шрифт, с которого вы начинаете, имеет легкий вариант? –

0

Это, вероятно, не ответ, просто подсказка для OS X 10.10. [NSFont systemFontOfSize: weight:] может использоваться под OS X 10.10 и работает нормально. Я не пробовал это под 10.9. Я не уверен, где я это слышал, но я думал, что этот метод обратно совместим со старыми версиями.

Я спросил у инженера AppKit в WWDC об этом, и он был удивлен, что мое приложение работало под 10.10 с новым API. Тем не менее, он не рекомендовал мне использовать API для более старых систем, таких как 10.10, потому что он может использовать частный API в фоновом режиме, который запрещает приложениям принимать MAS.

+0

Да, что-то подобное упоминается о iOS 8.2. –

Смежные вопросы