Атрибутированный текст UITextView не работает при использовании пользовательского шрифта

Я использую UITextView и устанавливаю его шрифт и атрибутированный текст по коду.

Случай 1: Пользовательский шрифт — ДА , атрибутированный текст — НЕТ

введите здесь описание изображения

Текст textView отображается настраиваемым шрифтом.

Я хочу, чтобы приписываемый текст был с пользовательским шрифтом, т.е. Message : в этом случае должен быть выделен жирным шрифтом.

Вариант 2: Пользовательский шрифт — ДА , атрибутированный текст — ДА

введите здесь описание изображения

Только атрибутированный текст (полужирный текст) отображается пользовательским шрифтом.

Код у меня есть:

- (void)loadTextView
{
    _textView.text=NSLocalizedString(@"more_info_text",nil);
    _textView.font=[UIFont fontWithName:@"BurbankSmall-Medium" size:16];

    NSRange rangeBold  = [_textView.text rangeOfString:@"Examples of invalid characters:"];
    NSRange rangeBold2 = [_textView.text rangeOfString:@"Restricted text:"];
    NSRange rangeBold3 = [_textView.text rangeOfString:@"Message :"];

    UIFont *fontText = [self boldFontWithFont:_textView.font];
    NSDictionary *dictBoldText = [NSDictionary dictionaryWithObjectsAndKeys:fontText, NSFontAttributeName, nil];

    NSMutableAttributedString *mutAttrTextViewString = [[NSMutableAttributedString alloc] initWithString:_textView.text];
    [mutAttrTextViewString setAttributes:dictBoldText range:rangeBold];
    [mutAttrTextViewString setAttributes:dictBoldText range:rangeBold2];
    [mutAttrTextViewString setAttributes:dictBoldText range:rangeBold3];

    [_textView setAttributedText:mutAttrTextViewString];

    _textView.editable=NO;
    _textView.selectable=NO;
}

- (UIFont *)boldFontWithFont:(UIFont *)font
{
    UIFontDescriptor * fontD = [font.fontDescriptor
                                fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold];
    return [UIFont fontWithDescriptor:fontD size:16];
}

Когда я комментирую строку setAttributedText:mutAttrTextViewString , все отображается настраиваемым шрифтом. Когда я раскомментирую его, только атрибутированный текст отображается в пользовательском шрифте, а остальное отображается в шрифте по умолчанию.

Почему это происходит ? Если это невозможно, я думаю включить html-контент в качестве атрибутированного текста, но я хочу рассмотреть это как вариант в худшем случае.


person Teja Nandamuri    schedule 09.05.2016    source источник
comment
NSMutableAttributedString *mutAttrTextViewString = [[NSMutableAttributedString alloc] initWithString:_textView.text attributes:@{NSFontAttributeName:[UIFont fontWithName:@"BurbankSmall-Medium" size:16]}];? Если вы зарегистрируете mutAttrTextViewString с вашим текущим кодом, вы должны увидеть, что у него нет шрифта для остального текста (там, где вы не указали полужирный шрифт) и не нужно получать по умолчанию шрифт, установленный в _textView для ОБЫЧНОГО текста.   -  person Larme    schedule 09.05.2016
comment
Я установил шрифт для текстового представления, и почему mutAttrTextViewString не использует шрифт textView? @Ларме   -  person Teja Nandamuri    schedule 09.05.2016
comment
Я не говорил, что это должно полностью заменить использование mutAttrTextViewString. Это просто строка NSMutableAttributedString *mutAttrTextViewString = [[NSMutableAttributedString alloc] initWithString:_textView.text];. В остальном вы продолжаете звонить по [mutAttrTextViewString setAttributes:dictBoldText range:rangeBold]; и двум другим линиям.   -  person Larme    schedule 09.05.2016
comment
По тем же причинам, что и здесь: stackoverflow.com/questions/36064762/ (см. комментарий @matt). font свойство UITextView предназначено для его свойства text (как обычно говорят, обычный текст), а не для его свойства attributedText.   -  person Larme    schedule 09.05.2016
comment
Вы хотите поместить этот комментарий в качестве ответа? @ Ларме Это сработало. Довольно странно, что нам нужно снова указать атрибуты для изменяемой строки.   -  person Teja Nandamuri    schedule 09.05.2016


Ответы (2)


Существует связанный вопрос здесь.
Основная проблема заключается в следующем. что свойство font (UIFont) элемента UITextView должно применяться к его свойству text (NSString) (также называемому "обычный текст"), а не к attributedText (NSAttributedString).

Таким образом, вы должны применить эффект «нормального» шрифта к своему NSAttributedString самостоятельно.

Так что просто замените:

NSMutableAttributedString *mutAttrTextViewString = [[NSMutableAttributedString alloc] initWithString:_textView.text];

с участием:

NSMutableAttributedString *mutAttrTextViewString = [[NSMutableAttributedString alloc] initWithString:_textView.text attributes:@{NSFontAttributeName:[UIFont fontWithName:@"BurbankSmall-Medium" size:16]}];
person Larme    schedule 10.05.2016

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

NSMutableAttributedString *mutAttrTextViewString = [[NSMutableAttributedString alloc] initWithString:_textView.text];
[mutAttrTextViewString setAttributes:@{NSFontAttributeName:[UIFont fontWithName:@"BurbankSmall-Medium" size:16] range:NSMakeRange(0, _textView.text.length)];
[mutAttrTextViewString setAttributes:dictBoldText range:rangeBold];
[mutAttrTextViewString setAttributes:dictBoldText range:rangeBold2];
[mutAttrTextViewString setAttributes:dictBoldText range:rangeBold3];

[_textView setAttributedText:mutAttrTextViewString];
person Chris Wood    schedule 09.05.2016