如何使用autolayout将UIScrollView滚动到viewWillAppear的底部,没有可视化动画

Jor*_*ans 5 objective-c uiscrollview uiview ios autolayout

这是问题所在:

我在UIScrollView中放了一堆视图.这些子视图的大小和位置由约束定义.这非常有效,滚动效果也很好.到现在为止还挺好.

但是,当我第一次在屏幕上显示viewcontroller时,我希望我的scrollview一直滚动到底部,这就是麻烦开始的地方.为了知道底部的位置,我需要知道子视图中最低元素的位置和大小.也应该很容易(因为我在某处提到了UIView):得到UIView的框架并且瞧.

我想在滚动视图出现在屏幕上之前将其滚动到底部(基本上,在viewWillAppear中),但是仅在viewWillAppear之后和viewDidAppear:之前调用约束.

viewWillAppear中获取UIView框架给了我一个零大小的CGRect.在viewDidAppear中做同样的事情给了我正确的CGRect.但是viewDidAppear对我来说太迟了,因为滚动视图已经在屏幕上,所以你看到内容向上移动.

有没有人有这个很好的解决方案?我尝试将代码放在viewDidLayoutSubviews中,但这也不起作用.

Raf*_*fAl 6

问题viewWillAppear是在布局发生之前调用它.您必须在布局后调整滚动视图的内容偏移量 - viewDidLayoutSubviews方法.在这是我的解决方案:

@property (nonatomic, assign) BOOL shouldScrollToBottom;


- (void)viewDidLoad
{
    [super viewDidLoad];

    _shouldScrollToBottom = YES;
}


- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    // Scroll table view to the last row
    if (_shouldScrollToBottom)
    {
        _shouldScrollToBottom = NO;
        [_scrollView setContentOffset:CGPointMake(0, CGFLOAT_MAX)];
    }
}
Run Code Online (Sandbox Code Playgroud)


Jor*_*ans 0

我最终想出的解决方案是:

  • 将滚动视图的所有子视图存储在 1 个内容视图中,而不是直接作为滚动视图的子视图
  • 观察该内容视图的边界何时发生变化
  • 每次更改时,都会scrollRectToVisible在滚动视图的底部执行一个操作
  • 一旦检测到委托调用,就禁用自动滚动到底部,scrollViewWillBeginDragging以便当用户开始移动滚动视图时自动滚动停止