我一直试图找到一种方法将光标设置为带有动画的长UITextView的底部。设置它并不太难,事实上这个答案很好地涵盖了它。 https://stackoverflow.com/a/34922332/563381
但是,动画制作并不容易。我找不到setSelectedTextRange(animated:)
。在UIView.animate...
块内设置它似乎没有做任何事情。我能想到的最好的方法是手动设置滚动动画,然后在完成集selectedTextRange
中设置动画。然而,这是脆弱的,往往看起来波涛汹涌,似乎有时根本不起作用。
当您设置selectedTextRange
时,它会跳转到该位置。如果有办法避免跳转,动画可能会更平滑,至少不会那么脆弱,因为它不需要延迟,您可以使用setContentOffset(animated)
而无需等待设置selectedTextRange
另一种选择是找到一种方法使selectedTextRange
跳转自己动画。在这方面我尝试了之前禁用滚动和重新启用之后的技巧,但这对我来说似乎不起作用。猜测在iOS的更高版本中已经发生了变化。
答案 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