UITextView 滚动似乎对很多人来说是个问题。从这里的答案(尤其是this)和 Apple Developer 文档中收集,使用我自己的一些智慧,这是一个适合我的解决方案。您可以修改代码以满足您的需要。
我的用例如下:相同的UITextView用于不同的目的,在不同的情况下显示不同的内容。我想要的是,当内容发生变化时,旧的滚动位置会恢复,或者有时会滚动到最后。完成后我不想要太多动画。特别是我不希望视图像所有文本都是新的一样进行动画处理。此解决方案首先在没有动画的情况下恢复旧的滚动位置,然后根据需要滚动到动画的末尾。
你需要做的(或者我应该说可以做的)是扩展 UITextView 如下:
extension UITextView {
func setText(text: String, storedOffset: CGPoint, scrollToEnd: Bool) {
self.text = text
let delayInSeconds = 0.001
let popTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(delayInSeconds * Double(NSEC_PER_SEC)))
dispatch_after(popTime, dispatch_get_main_queue(), {
self.setContentOffset(storedOffset, animated: false)
if scrollToEnd && !text.isEmpty {
let popTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(delayInSeconds * Double(NSEC_PER_SEC)))
dispatch_after(popTime, dispatch_get_main_queue(), {
self.scrollRangeToVisible(NSMakeRange(text.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) - 1, 0))
})
}
})
}
}
它的作用是更新文本,然后使用 UITextView.contentOffset 属性的存储值(或您作为参数传递的任何内容),并相应地设置视图的偏移量。如果需要,在此之后,它会滚动到新的、可能更改的内容的末尾。
我是 iOS 编程的新手,我不知道为什么它工作得这么好,如果有人有这方面的一些信息,我会很高兴知道。此外,该方法可能并不完美,因此我也愿意接受改进的想法。
当然还要感谢 NixonsBack 在上面的链接后面发布答案。
我的第一篇文章 :),干杯!