我搜遍了S.O.获取光标当前位置的简单解决方案,然后滚动到它(假设键盘 可见)。在某些情况下,大多数人似乎过于复杂和/或无效。如果光标位于键盘下方,我怎样才能每次都进行滚动工作?
答案 0 :(得分:8)
1)确保UITextView
contentInset
已正确设置&在执行此操作之前,您的textView
已经firstResponder
了。 contentInset
属性告诉textView
可见区域在哪里为用户。如果键盘可见,请确保textView.contentInset.bottom
属性已设置为键盘的顶部边框,否则textView
可能会滚动到键盘后面不可见的空间。
见S.O.发布更多信息:What's the UIScrollView contentInset property for?
2)在我的插图准备就绪后,textView
为firstResponder
后,我调用以下函数:
private func scrollToCursorPositionIfBelowKeyboard() {
let caret = textView.caretRectForPosition(textView.selectedTextRange!.start)
let keyboardTopBorder = textView.bounds.size.height - keyboardHeight!
// Remember, the y-scale starts in the upper-left hand corner at "0", then gets
// larger as you go down the screen from top-to-bottom. Therefore, the caret.origin.y
// being larger than keyboardTopBorder indicates that the caret sits below the
// keyboardTopBorder, and the textView needs to scroll to the position.
if caret.origin.y > keyboardTopBorder {
textView.scrollRectToVisible(caret, animated: true)
}
}
可选:如果您只想滚动到光标的当前位置(假设textView
目前是firstResponder
而contentInset
已经在此之前正确设置),只需致电:
private func scrollToCursorPosition() {
let caret = textView.caretRectForPosition(textView.selectedTextRange!.start)
textView.scrollRectToVisible(caret, animated: true)
}
额外信息:要将textView
滚动条设置为正确的高度,请执行以下操作修改scrollIndicatorInsets
:
// This is not relative to the coordinate plane. You simply set the `.bottom` property
// as if it were a normal height property. The textView does the rest for you.
textView.contentInset.bottom = keyboardHeight
textView.scrollIndicatorInsets = textView.contentInset // Matches textView's visible space.