UITextView - 滚动到所选位置

3
我有一个笔记视图控制器,其中包含一个大的UITextView。当键盘激活时,我已经确保调整了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滚动以显示他们的光标,即使他们还没有实际输入,也可以看到其光标?
2个回答

4
你可以通过调用scrollRangeToVisible(文档在这里)来实现此功能,使用文本视图的selectedRange。那个方法将文本视图滚动到任何文本范围,而selectedRange应该在光标位置。

2
这看起来很有前途... 我尝试将 self.textView.scrollRangeToVisible(textView.selectedRange) 添加到我的 keyboardWasShown 方法中(我尝试过在更改插图之前和之后都尝试过),并且我还尝试将其添加到 textViewDidBeginEditing 委托方法中。它有时会滚动,但大多数情况下不会... 而且似乎让我在没有基于 contentInset 滚动 textView 的情况下输入文本(即,我可以在键盘覆盖 textView 的位置输入内容 - 这是我通过调整 contentInset 解决的问题)。您有什么关于如何利用该方法的建议吗? - Michael Pangburn
当键盘消失时,我必须保存selectedRange,因为一旦用户编辑了attributedTextselectedRange就会重置。 - Deepak Sharma

0

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接