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

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

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

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

Здесь код:

-(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;                
}

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

attributedText issues

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

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

Ответ 1

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

Ответ 2

Вот примеры кода для этого, если вы ищете примеры

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;