Как разрешить ввод текста NSAttributedString в UITextView?

Я пытаюсь разрешить ввод различных стилей текста в UITextView, немного похоже на текстовый редактор, использующий простые атрибуты, такие как жирный шрифт или курсив. Я понимаю, используя textView attributedText Свойство я могу применить атрибуты к определенным диапазонам текста. Это хорошо, но я хотел бы иметь возможность вводить атрибутивный текст в textView, который будет переключаться кнопкой (например, печатать полужирный текст).

Вот что я подумала до сих пор:

Я использовал -(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text Метод делегата UITextView для принятия text аргумент и измените его с помощью атрибутов, создав NSAttributedString с тем же текстом. Затем создайте NSMutableAttributedString, которая является копией textViewатрибутированный текст. Добавьте два, используя appendAttributedStringи затем установите textView attributedText Свойство для результирующего attribuString.

Вот код:

-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {

   if (self.boldPressed) {

        UIFont *boldFont = [UIFont boldSystemFontOfSize:self.textView.font.pointSize];
        NSDictionary *boldAttr = [NSDictionary dictionaryWithObject:boldFont forKey:NSFontAttributeName];
        NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc]initWithString:text attributes:boldAttr];
        NSMutableAttributedString *textViewText = [[NSMutableAttributedString alloc]initWithAttributedString:textView.attributedText];
        [textViewText appendAttributedString:attributedText];
        textView.attributedText = textViewText;

           return NO;
       }
   return YES;                
}

Необходимость сбрасывать атрибуты textViews attributeText каждый раз, когда вводится символ, кажется немного сложным для простого действия. Не только это, но это не работает должным образом. Вот как это выглядит, когда атрибут bold включен:

приписанные текстовые проблемы

Есть две проблемы с этим. Наиболее очевидным является то, как каждый новый персонаж помещается на новую строку. Но что также странно, так это то, что точка вставки всегда находится в самом первом индексе текста в текстовом представлении (только когда жирный шрифт включен, но жирный символ вставляется в новую строку). Поэтому, если вы печатаете с включенным жирным шрифтом, а затем выключаете жирный шрифт, ввод возобновляется перед всем существующим текстом.

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

3 ответа

Решение

Это то, что setTypingAttributes: для. Установите его в свой словарь атрибутов всякий раз, когда пользователь нажимает одну из ваших кнопок атрибутов, и новые символы выбирают запрошенные атрибуты.

Вот примеры кодов, чтобы сделать это, если вы ищете примеры

Swift 3.0

var attributes = textField.typingAttributes
attributes["\(NSForegroundColorAttributeName)"] = UIColor.red
textField.typingAttributes = attributes

Objective-C

NSMutableDictionary* attributes = [textField.typingAttributes mutableCopy];
attributes[NSForegroundColorAttributeName] = [UIColor redColor];
textField.typingAttributes = attributes;

Этот код может быть использован, я думаю, это может помочь

NSMutableAttributedString *string=[[NSMutableAttributedString alloc] initWithString:@"NEW ? String"];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(0, 3)];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(3,5)];
self.text.attributedText=string;
self.textViewss.attributedText=string;
Другие вопросы по тегам