Когда пользовательский атрибут применяется к диапазону приписываемой строки, атрибуты ввода не обладают пользовательскими атрибутами в этом диапазоне, почему так? - PullRequest
0 голосов
/ 27 февраля 2019

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

Что я делаю:

  1. Введите текст в UiTextView, например: "Это образецtext "
  2. Выделить весь текст
  3. Применить настраиваемый атрибут
  4. Текст атрибута журнала

Вывод журнала

Thisобразец текста {MyCustomAttributeKey = CustomAttributeValue;NSFont = "font-family: \". SFUIText \ "; font-weight: normal; font-style: normal; font-size: 14.00pt";NSParagraphStyle = "Выравнивание 4, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 0, вкладки (\ n 28L, \ n 56L, \ n 84)n 112L, \ n
140L, \ n 168L, \ n 196L, \ n 224L, \ n 252L, \ n 280L, \ n
308L, \ n 336L \ n), DefaultTabInterval 0, блоки (\n), списки (\ n), BaseWritingDirection 0, HyphenationFactor 0, TighteningForTruncation NO, HeaderLevel 0 ";}

Теперь вставьте текст между текстом, например, «измененный», полный текст после изменения: «Это измененный образец текста» Логотип текста

Теперь яполучаю вывод журнала (журнал отформатирован для ясности)

Это {MyCustomAttributeKey = CustomAttributeValue;NSFont = "font-family: \". SFUIText \ "; font-weight: normal; font-style: normal; font-size: 14.00pt";NSParagraphStyle = "Выравнивание 4, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 0, вкладки (\ n 28L, \ n 56L, \ n 84)n 112L, \ n 140L, \ n 168L, \ n 196L, \ n 224L, \ n 252L, \ n 280L, \ n 308L, \ n 336L \ n), DefaultTabInterval 0, блоки (\ n), списки (\n), BaseWritingDirection 0, HyphenationFactor 0, TighteningForTruncation NO, HeaderLevel 0 ";}

изменение {NSFont = "font-family: \". SFUIText \ "; font-weight: normal; font-style: normal; font-size: 14.00pt";NSParagraphStyle = "Выравнивание 4, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 0, вкладки (\ n 28L, \ n 56L, \ n 84)n 112L, \ n 140L, \ n 168L, \ n 196L, \ n 224L, \ n 252L, \ n 280L, \ n 308L, \ n 336L \ n), DefaultTabInterval 0, блоки (\ n), списки (\n), BaseWritingDirection 0, HyphenationFactor 0, TighteningForTruncation NO, HeaderLevel 0 ";}

образец текста {MyCustomAttributeKey = CustomAttributeValue;NSFont = "font-family: \". SFUIText \ "; font-weight: normal; font-style: normal; font-size: 14.00pt";NSParagraphStyle = "Выравнивание 4, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 0, вкладки (\ n 28L, \ n 56L, \ n 84)n 112L, \ n 140L, \ n 168L, \ n 196L, \ n 224L, \ n 252L, \ n 280L, \ n 308L, \ n 336L \ n), DefaultTabInterval 0, блоки (\ n), списки (\n), BaseWritingDirection 0, HyphenationFactor 0, TighteningForTruncation NO, HeaderLevel 0 ";}

Мой ожидаемый вывод - применить пользовательский атрибут ко вновь введенному тексту, но это не так.Как этого добиться?

Заранее спасибо.

Мой ViewController и код:

//  ViewController.swift


import UIKit

class ViewController: UIViewController, UITextViewDelegate {

    let customAttributeStringKey: NSAttributedStringKey = NSAttributedStringKey.init(rawValue: "MyCustomAttributeKey")

    @IBOutlet weak var textV: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }


    @IBAction func applyCustomAttribute(_ sender: Any) {
        let attributedString : NSMutableAttributedString = textV.attributedText.mutableCopy() as! NSMutableAttributedString
        attributedString.addAttribute(customAttributeStringKey, value: "CustomAttributeValue", range:textV.selectedRange)
        textV.attributedText = attributedString
    }

    @IBAction func logAttribute(_ sender: Any) {
        print(textV.attributedText.description)
    }

}

ViewController UI

PS: Экспериментировал с использованием NSAttributedStringKey.underlineStyle (вместо пользовательского атрибута),

attributedString.addAttribute(NSAttributedStringKey.underlineStyle, value: NSUnderlineStyle.styleSingle.rawValue, range:textV.selectedRange)

, в этом случае измененный текст также получает атрибут underlineStyle, тогда в чем проблема с customAttribute?

Редактировать: прогресс

Я попытался установить атрибуты набора в методе прослушивания textview, как показано ниже, это частично работает ... но есть но

  func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
         if(isApplyAttributesClicked){  //this flag is true when we have applied attributes by clicking Apply attribute button
            textV.typingAttributes = [customAttributeStringKey.rawValue:"CustomAttributeValue"]
        }
        return true
    }

Но теперь проблема в том, что всякий раз, когда прогноз или автокоррекция выбирается с клавиатуры, затем следующийТипизированный атрибут печатного слова не имеет пользовательского атрибута.Любая помощь будет оценена.

...