2017-04-02 79 views
0

我有一个Notes视图控制器和一个大的UITextView。当键盘处于活动状态时,我已确保contentInset已被调整,以便用户可以查看正在输入的内容。这很好。然而,如果textView中已经有大量的文本并且键盘还没有激活,当用户点击textView下部的文本时,textView不会自动滚动到显示他们的光标。只要他们开始输入,textView就会滚动到合适的位置,但是我希望textView在他们点击textView后立即滚动到光标的位置。UITextView - 滚动到选定的地方

这里是我的代码:

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

您可以通过使用文本视图的selectedRange,致电scrollRangeToVisible(文档here)来实现此目的。该方法将文本视图滚动到任意范围的文本,并且selectedRange应位于游标的位置。

+0

这看起来很有前途..我尝试在我的keyboardWasShown方法中添加'self.textView.scrollRangeToVisible(textView.selectedRange)'(我在改变插入之前和之后都尝试过),我也尝试将它添加到'textViewDidBeginEditing'委托方法。它有时会滚动,但大多数时候它不会......并且它似乎让我在没有基于contentInset的textView滚动的情况下输入(即,我可以键入键盘覆盖textView的东西 - 我遇到的问题通过调整contentInset解决)。有关如何利用该方法的任何提示? –

0

我有一个类似的问题,但我尝试了你的示例代码。

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

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