我有一个带有大型UITextView的Notes视图控制器。当键盘处于活动状态时,我确保调整了contentInset,以便用户可以看到键入的内容。这很有效。
但是,如果textView中已有大量文本且键盘尚未激活,则当用户点击textView下半部分的文本时,textView不会自动显示向上滚动以显示其光标。一旦他们开始输入,textView就会滚动到适当的位置,但是我希望textView在他们点击textView时立即滚动到光标的位置。
这是我的代码:
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWasShown), name: NSNotification.Name.UIKeyboardDidShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillBeHidden), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}
func keyboardWasShown(_ notification: Notification) {
let mainViewY = self.view.frame.origin.y
let textViewY = self.textView.frame.origin.y
let oneLineHeight = self.textView.font.lineHeight
let delta = (textViewY - mainViewY) - oneLineHeight
let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue
let keyboardHeight = (keyboardSize?.height)!
self.textView.contentInset = UIEdgeInsetsMake(0, 0, keyboardHeight + delta, 0)
self.textView.scrollIndicatorInsets = textView.contentInset
}
func keyboardWillBeHidden(_ notification: Notification) {
self.textView.contentInset = UIEdgeInsets.zero
self.textView.scrollIndicatorInsets = UIEdgeInsets.zero
}
我搜索了提出这个问题的人,但找不到任何遇到我特定问题的人。
如何确保当用户点击textView开始键入将被键盘覆盖的textView部分时,textView会在实际输入之前滚动显示光标?
答案 0 :(得分:3)
您可以使用文字视图scrollRangeToVisible
调用selectedRange
(文档here)来实现此目的。该方法将文本视图滚动到任何文本范围,selectedRange
应位于光标的位置。
答案 1 :(得分:0)
我遇到了类似的问题,但我尝试了您的示例代码。
在viewDidLoad中,我注释掉了第二个观察者(self.keyboardWillBeHidden)。
当我运行模拟器并选择大块文本的任何部分时,textView会自动滚动到正确的位置。