Я работаю над прокруткой клавиатуры до текущей позиции курсора в UITextView.
Для этого я использую textViewDidChange следующим образом:
func textViewDidChange(_ textView: UITextView) {
if let cursorPosition = textView.selectedTextRange?.end {
let caretPositionRect = textView.caretRect(for: cursorPosition)
print(caretPositionRect, "caret")
DispatchQueue.main.async{ [weak self] in
let pointsuperview = textView.convert(caretPositionRect, to: self?.vc?.mainView.scrollView)
self?.vc?.mainView.scrollView.scrollRectToVisible(pointsuperview, animated: false)
print(pointsuperview, "ps")
}
}
}
Это работает, пока есть персонаж или если я возвращаюсь. Но если я добавляю новую строку, нажимая ввод в последнюю строку, я получаю такой вывод:
(inf, inf, 0.0, 0.0) caret
Когда я затем использую backspace, я снова получаю действительные значения.
допустимые значения выглядят так:
(4.0, 7.0, 2.0, 21.5) caret
Тот же результат при использовании selectedTextRange.start
Я пробовал решения из этого вопроса: Получение и установка позиции курсора UITextField и UITextView в Swift
У меня была такая же проблема, пока я не поставил очередь отправки перед textview.caretRect(for:)
func textViewDidChange(_ textView: UITextView) {
if let cursorPosition = textView.selectedTextRange?.end {
DispatchQueue.main.async{ [weak self] in
let caretPositionRect = textView.caretRect(for: cursorPosition)
print(caretPositionRect, "caret")
let pointsuperview = textView.convert(caretPositionRect, to: self?.vc?.mainView.scrollView)
self?.vc?.mainView.scrollView.scrollRectToVisible(pointsuperview, animated: false)
print(pointsuperview, "ps")
}
}
}
если это не сработает, попробуйте добавить задержку в 1 миллисекунду
func textViewDidChange(_ textView: UITextView) {
if let cursorPosition = textView.selectedTextRange?.end {
let deadlineTime = DispatchTime.now() + .milliseconds(1)
DispatchQueue.main.asyncAfter(deadline: deadlineTime) { [weak self] in
let caretPositionRect = textView.caretRect(for: cursorPosition)
print(caretPositionRect, "caret")
let pointsuperview = textView.convert(caretPositionRect, to: self?.vc?.mainView.scrollView)
self?.vc?.mainView.scrollView.scrollRectToVisible(pointsuperview, animated: false)
print(pointsuperview, "ps")
}
}
}