我有一个笔记视图控制器,其中包含一个大的UITextView。当键盘激活时,我已经确保调整了contentInset,以便用户可以看到正在输入的内容。这个效果很好。
然而,如果textView中已经有大量文本,并且键盘还没有激活,当用户点击textView底部的文本时,textView不会自动向上滚动以显示光标。当他们开始输入时,textView会滚动到适当的位置,但我希望textView在他们点击textView时立即滚动到光标的位置。
以下是我的代码:
我搜索了很多人的问题,但无法找到任何一个与我遇到的问题相同的人。
当用户点击TextView的某一部分以开始输入时,如何确保TextView滚动以显示他们的光标,即使他们还没有实际输入,也可以看到其光标?
然而,如果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滚动以显示他们的光标,即使他们还没有实际输入,也可以看到其光标?
self.textView.scrollRangeToVisible(textView.selectedRange)
添加到我的 keyboardWasShown 方法中(我尝试过在更改插图之前和之后都尝试过),并且我还尝试将其添加到textViewDidBeginEditing
委托方法中。它有时会滚动,但大多数情况下不会... 而且似乎让我在没有基于 contentInset 滚动 textView 的情况下输入文本(即,我可以在键盘覆盖 textView 的位置输入内容 - 这是我通过调整 contentInset 解决的问题)。您有什么关于如何利用该方法的建议吗? - Michael PangburnselectedRange
,因为一旦用户编辑了attributedText
,selectedRange
就会重置。 - Deepak Sharma