Конвертируйте UIFont в CTFontRef и добавляйте курсив на Retina Display - PullRequest
9 голосов
/ 19 марта 2012

У меня есть собственный подкласс UILabel, который делает пользовательское рисование с использованием CoreText. Раньше я рисовал свои строки, используя UIFont, установленный на ярлыке, который обращается к нему с помощью свойства font. Я также добавляю некоторые черты к шрифту. Вот как это выглядит:

UIFont* font = [self font];
CTFontRef ref = CTFontCreateWithName((CFStringRef)[font name], [font pointSize], NULL);
CTFontRef italicFont = CTFontCreateCopyWithSymbolicTraits(ref, [font pointSize], NULL, kCTFontItalicTrait, kCTFontItalicTrait);

Раньше все работало нормально, пока не появился новый ipad с дисплеем Retina. Когда я выполняю вызов CTFontCreateCopyWithSymbolicTraits, он возвращает нулевое возвращаемое значение. Я обнаружил, [font name] возвращает «.HelveticaNeueUI» на этих новых устройствах. CTFontCreateWithName, кажется, прекрасно работает с этим частным именем шрифта, но CTFontCreateCopyWithSymbolicTraits - нет. Тем не менее, если я создаю курсивный шрифт, используя [UIFont italicSystemFontOfSize:[font pointSize]], он создает курсивный шрифт, для которого [font name] по-прежнему возвращает ".HelveticaNeueUI".

Как мне преобразовать мой UIFont в CTFontRef, чтобы я мог по-прежнему применять новые черты к своему CTFontRef на дисплеях сетчатки и без сетчатки?

Ответы [ 2 ]

13 голосов
/ 16 мая 2012

Немного устарело, но для кого бы это ни касалось:

Это происходит потому, что новый системный шрифт Neue Helvetica, используемый в новых устройствах Retina (iPhone 4, iPad), не имеет курсивной версии.Не каждый шрифт имеет жирный и / или курсивный вариант.Итак, если вам нужен курсивный текст, вам нужно использовать другой шрифт, например, старый Helvetica.

CTFontRef ref = CTFontCreateWithName((CFStringRef)@"Helvetica", 12, NULL);
CTFontRef italicFont = CTFontCreateCopyWithSymbolicTraits(ref, 12, NULL, kCTFontItalicTrait, kCTFontItalicTrait);
1 голос
/ 04 мая 2017

Преобразование UIFont / NSFont в CTFontRef очень просто, если вы используете ARC.

UIFont:

UIFont *uiFont = [UIFont fontWithName:@"Helvetica" size:10];
CTFontRef ctFont = (__bridge CTFontRef)uiFont;

NSFont:

NSFont *nsFont = [NSFont fontWithName:@"Helvetica" size:10];
CTFontRef ctFont = (__bridge CTFontRef)nsFont;
...