UITextView中的文本自动滚动到底部

时间:2015-10-31 03:24:35

标签: ios swift uitextview

我认为它是ViewController中的标准UITextView,其中包含大量文本,足以使其不能全部适合屏幕。我想要发生的是,当加载该视图时,用户可以开始阅读文本的顶部,然后在页面进展时向下滚动页面。有道理,对吗?我想要的并不是不切实际的。

问题是当视图加载时,UITextView中的文本已经一直向下滚动到底部。我已经搜索过SO并且有很多类似的帖子,但其中没有一个解决方案可以解决我的问题。这是他查看控制器中的代码:

import UIKit

class WelcomeTextVC: UIViewController {

    var textString: String = ""

    @IBOutlet weak var welcomeText: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()

        self.navigationController?.navigationBar.translucent = false

        self.welcomeText.text = textString
        self.welcomeText.scrollRangeToVisible(NSMakeRange(0, 0))
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(true)

        self.welcomeText.scrollRangeToVisible(NSMakeRange(0, 0))
        welcomeText.setContentOffset(CGPointMake(0, -self.welcomeText.contentInset.top), animated: true)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

我尝试过大多数标准解决方案都无济于事。我没有尝试过的一个常见建议是“取消选中属性检查器中的调整滚动视图插入”。我没有尝试过的原因是因为我无法找到这个传说中的复选框。

我需要做些什么才能使文本开始与顶部对齐?

2 个答案:

答案 0 :(得分:20)

我知道几种方式。这两种方式都是通过视图控制器中的viewDidLayoutSubviews()方法以编程方式实现的。致电super.viewDidLayoutSubviews()后,您可以添加:

myTextView.scrollRangeToVisible(NSMakeRange(0, 1))

这会自动将textView滚动到textView中的第一个字符。但是,当视图出现时,可能会添加一些不需要的动画。第二种方式是添加:

myTextView.setContentOffset(CGPoint.zero, animated: false)

这会将UITextView滚动到零点(开头)并让您控制是否要将其设置为动画。

答案 1 :(得分:0)

更好的解决方案是在textView.setContentOffset(.zero, animated: false)生命周期方法内而不是在viewWillAppear(_ animated: Bool)方法内调用viewDidLayoutSubviews()。只需在自定义UIViewController子类中覆盖默认实现即可:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    textView.setContentOffset(.zero, animated: false)
}

仅当显示视图时,它才会滚动到UITextView的顶部,而不是在布局更改时(总是会如您所想的那样)滚动到UITextView的顶部。

如果只希望UITextView滚动到顶部一次,而不是每次视图都滚动到顶部,则可以添加一个标志。如果您的UINavigationController位于UIViewController内,并且用户可以将另一个UITextView推到其顶部,则这将非常有用。用户返回到UITextField后,它将保持private var didAppearOnce = false override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) if !didAppearOnce { didAppearOnce = true textView.setContentOffset(.zero, animated: false) } } 的滚动位置,并且不会将位置重置为顶部:

{{1}}