加载时,UITextView不滚动到顶部

当我有不填充UITextView的文本,它滚动到顶部按预期工作。 当有更多的文字比在屏幕上适合,UITextView滚动到文本的中间,而不是顶部。

以下是一些潜在的相关细节:

在viewDidLoad中给UITextView的顶部和底部填充一些内容:

self.mainTextView.textContainerInset = UIEdgeInsetsMake(90, 0, 70, 0); 

UITextView使用自动布局将其从顶部,底部和屏幕的每一侧(在IB中完成)锚定20px以允许不同的屏幕大小和方向。

一旦载入,我仍然可以用手指滚动它。

编辑我发现删除自动布局的约束,然后修复宽度只能解决问题,但只为该屏幕宽度。

UITextView是UIScrollView的子类,所以你可以使用它的方法。 如果所有你想要做的是确保它滚动到顶部,那么无论文本添加尝试:

 [self.mainTextView setContentOffset:CGPointZero animated:NO]; 

编辑:任何种类的滚动视图的AutoLayout得到快速。 设置一个固定的宽度解决这并不奇怪。 如果在-viewDidLayoutSubviews-viewDidLayoutSubviews ,那很奇怪。 手动设置布局约束可能会起作用。 首先在IB中创build约束条件:

 @property (weak, nonatomic) IBOutlet NSLayoutConstraint *textViewWidthConstraint; @property (weak, nonatomic) IBOutlet NSLayoutConstraint *textViewHeightConstraint; 

然后在ViewController中

  -(void)updateViewConstraints { self.textViewWidthConstraint.constant = self.view.frame.size.width - 40.0f; self.textViewHeightConstraint.constant = self.view.frame.size.height - 40.0f; [super updateViewConstraints]; } 

-viewDidLayoutSubviews中设置-viewDidLayoutSubviews仍然有必要。

(另一种方法是在textView和它的superView之间创build一个“等宽”和“等高”的布局约束,常量为“-40”,如果常量为零,否则按常量进行调整,但是因为只能将这个约束添加到一个视图来约束两个视图,所以在IB中不能这样做)。

你可能会问自己,如果我必须这样做,AutoLayout有什么意义? 我已经深入研究了AutoLayout,这是一个很好的问题。

将以下函数添加到您的视图控制器类…

Swift 3

 override func viewDidLayoutSubviews() { self.mainTextView.setContentOffset(.zero, animated: false) } 

Swift 2.1

 override func viewDidLayoutSubviews() { self.mainTextView.setContentOffset(CGPointZero, animated: false) } 

目标C

 - (void)viewDidLayoutSubviews { [self.mainTextView setContentOffset:CGPointZero animated:NO]; } 

我有同样的问题! 重置为build议的约束,只是把(Y偏移)

 @IBOutlet weak var textContent: UITextView! override func viewDidLoad() { textContent.scrollsToTop = true var contentHeight = textContent.contentSize.height var offSet = textContent.contentOffset.x var contentOffset = contentHeight - offSet textContent.contentOffset = CGPointMake(0, -contentOffset) } 

迅速

 self.textView.scrollRangeToVisible(NSMakeRange(0, 0)) 

OBJ-C

 [self.textView scrollRangeToVisible:(NSMakeRange(0, 0))]; 

对于iOS9及更高版本,甚至在viewWillAppear上的textview:CGRect(0,0,1000,1000)。 为了这个工作,你必须调用viewWillAppear:

 [self.view setNeedsLayout]; [self.view layoutIfNeeded]; // * Your code here 

之后,textview将有正确的CGRect数据,您可以执行您可能需要的任何滚动操作。

如果你不想约束:

 override func updateViewConstraints() { super.updateViewConstraints() } override func viewDidLayoutSubviews() { self.textLabel.setContentOffset(CGPointZero, animated: false) } 

把代码放在viewDidLayoutSubviews和viewWillLayoutSubviews中的问题是,这些方法被称为很多(在设备旋转,调整视图等…)。 如果您正在从文本视图中读取某些内容,并且旋转了设备,则预计您正在查看的部分内容会保留在屏幕上。 你不希望它滚动回顶部。 尝试将文本视图的scrollEnabled属性设置为NO(false),并在viewDidAppear中将其重新打开,而不是将内容滚动到顶部。