加载时UITextView不会滚动到顶部

Mic*_*all 47 uitextview ios autolayout

当我的文本没有填充UITextView时,它会按预期滚动到顶部.如果文本上的文本多于屏幕上显示的内容,则UITextView将滚动到文本的中间位置,而不是顶部.

以下是一些可能相关的细节:

在viewDidLoad中,在UITextView的顶部和底部给出一些填充:

self.mainTextView.textContainerInset = UIEdgeInsetsMake(90, 0, 70, 0);
Run Code Online (Sandbox Code Playgroud)

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

一旦加载,我仍然可以用手指滚动它.

编辑我发现删除自动布局约束,然后修复宽度似乎只能解决问题,但仅限于该屏幕宽度.

Muh*_*him 116

将以下函数添加到视图控制器类...

斯威夫特3

override func viewDidLayoutSubviews() {
    self.mainTextView.setContentOffset(.zero, animated: false)
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特2.1

override func viewDidLayoutSubviews() {
    self.mainTextView.setContentOffset(CGPointZero, animated: false)
}
Run Code Online (Sandbox Code Playgroud)

目标C.

- (void)viewDidLayoutSubviews {
    [self.mainTextView setContentOffset:CGPointZero animated:NO];
}
Run Code Online (Sandbox Code Playgroud)

  • 在一系列类似主题的答案之后,这个对我有用.谢谢 :) (2认同)
  • 还要确保在覆盖 UIViewController 生命周期方法时始终调用 super。 (2认同)

Mik*_*and 18

UITextView是UIScrollView的子类,因此您可以使用其方法.如果您只想确保它滚动到顶部,那么无论文本添加到何处,请尝试:

[self.mainTextView setContentOffset:CGPointZero animated:NO];
Run Code Online (Sandbox Code Playgroud)

编辑:AutoLayout与任何类型的scrollview快速变得难以理解.设置固定宽度解决它并不奇怪.如果它不起作用-viewDidLayoutSubviews则那就是奇怪的.手动设置布局约束可能有效.首先在IB中创建约束:

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *textViewWidthConstraint;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *textViewHeightConstraint;
Run Code Online (Sandbox Code Playgroud)

然后在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];
        }
Run Code Online (Sandbox Code Playgroud)

可能仍然需要setContentOffset -viewDidLayoutSubviews.

(另一种方法是在textView和它的superView之间创建"'相等'宽度"和"相等'高度"的布局约束,常量为"-40".如果常量为零,它只是"相等" ,否则它会根据常量进行调整.但由于您只能将此约束添加到限制两个视图的视图中,因此您无法在IB中执行此操作.)

您可能会问自己,如果必须这样做,AutoLayout的重点是什么?我已经深入研究了AutoLayout,这是一个很好的问题.

  • 什么样的恶梦!.我确实最终得到它并最终使用等高/宽度方法,常数为-40.它需要在viewDidLayoutSubviews中使用setContentOffset.非常感谢. (3认同)

Ale*_*oDP 11

迅速

self.textView.scrollRangeToVisible(NSMakeRange(0, 0))
Run Code Online (Sandbox Code Playgroud)

Objective-C的

[self.textView scrollRangeToVisible:(NSMakeRange(0, 0))];
Run Code Online (Sandbox Code Playgroud)


Rus*_*uso 9

我有同样的问题!重置为建议的约束并且只放(y offset)

@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)
    }
Run Code Online (Sandbox Code Playgroud)


小智 7

对于iOS9及更高版本,即使在viewWillAppear上,textview也随附CGRect(0,0,1000,1000).为了使其工作,您必须在viewWillAppear中调用:

[self.view setNeedsLayout];
[self.view layoutIfNeeded];
// * Your code here
Run Code Online (Sandbox Code Playgroud)

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