У меня есть UITextView
, который получает данные от пользователя.Я хочу заменить входной текст атрибутивным текстом.В настоящее время я использую textView(_:shouldChangeTextIn:replacementText:)
, чтобы установить свойство attributedText
текстового представления, а затем возвращаю false.Кажется, это работает нормально, за исключением того, что при добавлении или удалении начального символа курсор не синхронизирован с вводимой буквой.Иногда курсор выпрыгивает до появления текста, иногда текст удаляется до того, как курсор переместится назад.Есть ли способ синхронизировать их?
Это происходит не всегда, поэтому вам придется продолжать удалять и повторно вводить первый символ.Вы можете видеть это на симуляторе и 5 с, но на X это слишком быстро, чтобы увидеть.
Вот пример:
import UIKit
class ViewController: UIViewController, UITextViewDelegate {
override func viewDidLoad() {
super.viewDidLoad()
let textView = UITextView()
textView.delegate = self
textView.frame = {
var result = view.bounds
let top: CGFloat = 50.0
result.size.height -= top
result.origin.y += top
return result
}()
view.addSubview(textView)
}
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
if text == "\n" {
textView.resignFirstResponder()
return false
}
let text = (textView.text as NSString).replacingCharacters(in: range, with: text)
let attributes: [NSAttributedString.Key: Any] = [
.font: UIFont.systemFont(ofSize: 17.0, weight: .bold)
]
textView.attributedText = NSAttributedString(
string: text,
attributes: attributes)
return false
}
}