UITextView - 滚动到所选位置

时间:2017-04-02 23:16:08

标签: ios swift uiscrollview uitextview

我有一个带有大型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会在实际输入之前滚动显示光标?

2 个答案:

答案 0 :(得分:3)

您可以使用文字视图scrollRangeToVisible调用selectedRange(文档here)来实现此目的。该方法将文本视图滚动到任何文本范围,selectedRange应位于光标的位置。

答案 1 :(得分:0)

我遇到了类似的问题,但我尝试了您的示例代码。

在viewDidLoad中,我注释掉了第二个观察者(self.keyboardWillBeHidden)。

当我运行模拟器并选择大块文本的任何部分时,textView会自动滚动到正确的位置。