Как выделить некоторые слова в моем UITextView с помощью NSMutableAttributedString?

У меня есть UITextView, и есть определенные слова, которые я использую с помощью NSString stringWithFormat, которые я хотел бы выделить жирным шрифтом.

Я просмотрел Stack Overflow и попытался следить за публикациями, но, думаю, я этого не понимаю.

Вот с чем я играл:

    NSRange boldedRange = NSMakeRange(0, 4);
    NSString *boldFontName = [[UIFont fontWithName:@"Helvetica-Bold" size:100]fontName];


    NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:self.name];

    [attrString beginEditing];
    [attrString addAttribute:NSFontAttributeName
                       value:boldFontName
                       range:boldedRange];
    [attrString endEditing];

    self.resultsTextView.attributedText = attrString;


    self.resultsTextView.text = [NSString stringWithFormat:@"One day, %@ was taking a walk and saw a %@ boy.  He was %@ a %@.", attrString, self.adjective, self.adverb, self.noun];

person May Yang    schedule 17.01.2015    source источник
comment
Прошло некоторое время с тех пор, как я работал со строками с атрибутами, но мне кажется, что ваша проблема в том, что вы устанавливаете resultsTextView как строку с атрибутами, но в следующей строке вы устанавливаете ее обратно как неатрибутированную NSString. NSString не имеет атрибутов, поэтому вы в основном «отменяете» любой атрибут, который вы «сделали». Если я правильно помню, у вас не может быть обоих свойств attributedText и text, это одно из них.   -  person AMI289    schedule 17.01.2015
comment
См. Ответ. Вы можете выделить определенный текст в textView.   -  person Kirit Modi    schedule 17.01.2015
comment
@KiritModi Я знаю, что ты можешь спариваться. Но см. вопрос, а точнее последнюю строку кода. в конце концов он использует NSString для своего UITextView, а не NSAttributedString. Вы не можете выделить текст жирным шрифтом в стандартном NSString.   -  person AMI289    schedule 17.01.2015
comment
Невозможно установить NSSting жирным шрифтом в соответствии с вашей последней строкой.   -  person Kirit Modi    schedule 17.01.2015
comment
Вы должны использовать только NSAttributedString для полужирного текста и обычного текста MIXUP   -  person Kirit Modi    schedule 17.01.2015


Ответы (4)


Вы также можете установить его следующим образом, если хотите, установив словарь в целом как атрибут

NSString *strTextView = @"This is some demo Text to set BOLD";

NSRange rangeBold = [strTextView rangeOfString:@"BOLD"];

UIFont *fontText = [UIFont boldSystemFontOfSize:10];
NSDictionary *dictBoldText = [NSDictionary dictionaryWithObjectsAndKeys:fontText, NSFontAttributeName, nil];

NSMutableAttributedString *mutAttrTextViewString = [[NSMutableAttributedString alloc] initWithString:strTextView];
[mutAttrTextViewString setAttributes:dictBoldText range:rangeBold];

[textViewTermsPolicy setAttributedText:mutAttrTextViewString];
person channi    schedule 17.01.2015
comment
Что, если я хочу выделить жирным шрифтом другое слово, кроме ЖИРНОГО? Например, это какой-то демонстрационный текст для выделения ЖИРНЫМ шрифтом? - person May Yang; 17.01.2015
comment
Я надеюсь, что вы, возможно, решили проблему, с которой столкнулись, но все же, если вы просто не заменили BOLD демо-текстом - person channi; 19.01.2015

Используйте приведенный ниже код, чтобы установить строку атрибута в TextView.

    NSString *infoString =@"I am Kirit Modi from Deesa.";

    NSMutableAttributedString *attString=[[NSMutableAttributedString alloc] initWithString:infoString];

    UIFont *font_regular=[UIFont fontWithName:@"Helvetica" size:20.0f];
    UIFont *font_bold=[UIFont fontWithName:@"Helvetica-Bold" size:20.0f];

    [attString addAttribute:NSFontAttributeName value:font_regular range:NSMakeRange(0, 4)];

    [attString addAttribute:NSFontAttributeName value:font_bold range:NSMakeRange(5, 15)];

    [attString addAttribute:NSFontAttributeName value:font_regular range:NSMakeRange(16, infoString.length - 15 - 1)];

    [self.txtView setAttributedText:attString];

Выход :

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

person Kirit Modi    schedule 17.01.2015

Ознакомьтесь с улучшением @CrazyYoghurt в @Bbrame и @BenoitJadinon в этом предыдущем SO-вопросе 3586871 Я использую его больше года, и он отлично работает. Одно ограничение: я не думаю, что вы можете выделить одну и ту же строку несколько раз, если она встречается в вашей исходной строке более одного раза. Но вы, вероятно, можете использовать код, чтобы сделать это, если хотите.

person Litome    schedule 24.05.2016

Если вам также нужно отфильтровать какое-то слово из UITextView и сделать так, чтобы оно подчеркивало/изменяло цвет только этого конкретного текста, вы можете использовать приведенный ниже код.

Здесь я получаю весь текст документа в строке содержимого и фильтрую определенный текст на иврите.

NSMutableAttributedString *aStr = [[NSMutableAttributedString alloc]initWithString:content attributes:nil];
[aStr addAttribute:NSLinkAttributeName value:@"http://www.apple.com" range:[content rangeOfString:@"מדיניות פרטיות"]];
[aStr addAttribute:NSLinkAttributeName value:@"http://www.google.com" range:[content rangeOfString:@"לינק"]];
textview.linkTextAttributes = @{NSUnderlineStyleAttributeName : @(NSUnderlineStyleSingle)};
textview.delegate = (id)self;

//... Вы можете выбрать свой собственный цвет

[aStr addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:[content rangeOfString:@"מדיניות פרטיות"]];
[aStr addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:[content rangeOfString:@"לינק"]];

//Здесь Вы также можете добавить жест нажатия на этот текст. //Жест касания

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedTextView:)];
             [textview addGestureRecognizer:tapRecognizer];
             [textview setAttributedText:aStr];
             textview.textAlignment=NSTextAlignmentRight;

//Для получения местоположения текста в жесте касания

-(void)tappedTextView:(UITapGestureRecognizer *)tapGesture

{
    UITextView *textView = (UITextView *)tapGesture.view;
    CGPoint tapLocation = [tapGesture locationInView:textView];
    UITextPosition *textPosition = [textView closestPositionToPoint:tapLocation];
    NSDictionary *attributes = [textView textStylingAtPosition:textPosition inDirection:UITextStorageDirectionForward];
    NSString *urlStr = attributes[NSLinkAttributeName];
    if (urlStr)

    {
        //[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@",url]]];

        PrivacyViewController *next = [PrivacyViewController new];
        [self.navigationController pushViewController:next animated:YES];
    }
}
person Yash    schedule 25.01.2018
comment
Я использовал этот код, и это работает для меня. Спасибо!! - person Swati Gautam; 02.02.2018