如何设置带动画的UITextView selectedTextRange并滚动位置

时间:2017-07-20 13:29:48

标签: ios swift animation uitextview

我一直试图找到一种方法将光标设置为带有动画的长UITextView的底部。设置它并不太难,事实上这个答案很好地涵盖了它。 https://stackoverflow.com/a/34922332/563381

但是,动画制作并不容易。我找不到setSelectedTextRange(animated:)。在UIView.animate...块内设置它似乎没有做任何事情。我能想到的最好的方法是手动设置滚动动画,然后在完成集selectedTextRange中设置动画。然而,这是脆弱的,往往看起来波涛汹涌,似乎有时根本不起作用。

当您设置selectedTextRange时,它会跳转到该位置。如果有办法避免跳转,动画可能会更平滑,至少不会那么脆弱,因为它不需要延迟,您可以使用setContentOffset(animated)而无需等待设置selectedTextRange

另一种选择是找到一种方法使selectedTextRange跳转自己动画。在这方面我尝试了之前禁用滚动和重新启用之后的技巧,但这对我来说似乎不起作用。猜测在iOS的更高版本中已经发生了变化。

1 个答案:

答案 0 :(得分:1)

您可以使用setContentOffset(_,animated :)并使用scrollViewDidEndScrollingAnimation检测动画结束,并将光标设置为:

// The action to scroll down
@IBAction func test(_ sender: Any) {

    let offset = self.textView.contentSize.height - self.textView.frame.height
    self.textView.setContentOffset(CGPoint(x: 0, y: offset), animated: true)
}

// Setting the cursor down
func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {

    let offset = self.textView.contentSize.height - self.textView.frame.height

    if scrollView.contentOffset == CGPoint(x: 0, y: offset) {
        let newPosition = textView.endOfDocument
        self.textView.selectedTextRange = self.textView.textRange(from: newPosition, to: newPosition)
    }
}

您需要将UITextViewDelegate添加到视图控制器并设置textView委托:

textView.delegate = self