Решение Сурава Гупты частично сработало для меня, однако у него было несколько ловушек, а именно то, что он неправильно вызывал целевой код, если редактирование происходило в середине текста (например: написание группы текста, перемещениекурсор в середину, а затем трижды нажмите клавишу возврата), а также обрабатывает события вставки, такие как вставка и исправление текста.В результате я провел некоторое собственное тестирование и обнаружил еще несколько условий, в которых можно предположить, что редактирование переместилось на следующую строку.
примечание: у этого подхода есть несколько ложных срабатываний, но я обнаружил, что это более терпимо, так как я использую это для передачи кода и, таким образом, излишнего размещения гораздо лучше, чем отсутствие ответа
Swift 5
private var previousRect:CGRect = CGRect.zero
private func checkIfReturnOrLineWrap(textView:UITextView) {
let currentRect = textView.caretRect(for:textView.endOfDocument)
if (currentRect.origin.y != previousRect.origin.y && (previousRect.origin.y != CGFloat.infinity || currentRect.origin.y > 0) ||
currentRect.origin.y == CGFloat.infinity) {
//React to the line change!
}
previousRect = currentRect
}
//MARK: UITextViewDelegate methods (be sure to hook up your textviews!)
func textViewDidChange(_ textView: UITextView) {
checkIfReturnOrLineWrap(textView: textView)
}
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
checkIfReturnOrLineWrap(textView: textView)
return true
}