Внешний шрифт UILabel и строковый шрифт

В моем приложении у меня есть глобальный пользовательский шрифт, применяемый ко всем ярлыкам:

UIFont *font = [UIFont fontWithName:kMyFontName size:15.0]; 
[[UILabel appearance] setFont:font];

Это прекрасно работает. Однако в некоторых случаях я хочу иметь возможность указывать другой шрифт для определенного региона строки UILabel.

Итак, у меня есть что-то вроде этого:

NSString *string = @"Foo Bar Baz";
UIFont *boldFont = [UIFont fontWithName:kMyBoldFontName size:15.0]; 
NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:string];
[attrString setAttributes:@{ NSFontAttributeName: boldFont } range:NSMakeRange(0, 3)];
self.myLabel.attributedText = attrString;

Однако это не работает. Я ожидаю, что "Foo" будет полужирным, но вся строка просто имеет шрифт по умолчанию. Как будто полужирный шрифт вообще не применяется и перезаписывается шрифтом, установленным в прокси-сервере UILabel.

Когда я удаляю строку видимости UILabel, она работает нормально (я вижу часть строки, выделенную полужирным шрифтом). В принципе, я хочу, чтобы мой пользовательский шрифт применялся к метке, но отдельный шрифт применялся к другой области строки. Обычно это отлично работает с атрибутами строк, но по какой-то причине установка шрифта внешнего вида UILabel отключает эту функциональность (или так кажется).

  • Ожидаемые результаты: Foo Bar Baz "
  • Фактические результаты: "Foo Bar Baz"

Если я удаляю строку [[UILabel appearance] setFont:], то она работает:

  • " Foo Bar Baz"

(но пользовательский шрифт не устанавливается в остальной части строки).

Итак, мой вопрос: есть ли способ указать один шрифт, который будет использоваться в качестве по умолчанию для приложения, но все же может частично переопределить это, используя атрибутные строки?

Также, если кто-то может объяснить мне, почему это не работает, я был бы признателен.

Ответ 1

Вы не можете смешивать и сопоставлять атрибутный текст и обычный текст; почему удаление метода setFont работает, потому что, когда вы его используете, он предполагает UILabel с открытым текстом.

NSString *string = @"Foo Bar Baz";
UIFont *boldFont = [UIFont fontWithName:kMyBoldFontName size:15.0]; 
// Define your regular font
UIFont *regularFont = [UIFont fontWithName:kMyFontName size:15.0];
NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:string];
// And before you set the bold range, set your attributed string (the whole range!) to the new attributed font name
[attrString setAttributes:@{ NSFontAttributeName: regularFont } range:NSMakeRange(0, string.length - 1)];
[attrString setAttributes:@{ NSFontAttributeName: boldFont } range:NSMakeRange(0, 3)];
self.myLabel.attributedText = attrString;

Ответ 2

Установите шрифт и textColor на нуль перед установкой атрибутной строки.