我认为它是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.
}
}
我尝试过大多数标准解决方案都无济于事。我没有尝试过的一个常见建议是“取消选中属性检查器中的调整滚动视图插入”。我没有尝试过的原因是因为我无法找到这个传说中的复选框。
我需要做些什么才能使文本开始与顶部对齐?
答案 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}}