水平滚动视图滚动但仅部分滚动并弹回原始位置

时间:2019-06-14 15:52:33

标签: ios xcode storyboard

我有一个水平滚动视图,其内容如下:

enter image description here

运行时,它会部分水平滚动-我可以滚动直到红色视图的大约一半可见,但随后会反弹。 我如何获得它以便它可以一直滚动到所有红色视图都可见并停留在那里?

我在视图控制器中有此控件,但无论是否存在都没有区别。

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    print("Content view bounds: \(contentView.bounds)")
    scrollView.layoutIfNeeded()
    scrollView.contentSize = contentView.bounds.size
}

在情节提要的屏幕快照中,红色视图没有后缘约束,但是,如果我在红色视图和内容视图之间添加一个约束,则当我在设备上运行时,它将停止滚动并显示如下:

enter image description here

2 个答案:

答案 0 :(得分:1)

您无需一开始就明确设置.contentSize -您可以让自动布局自动为您处理。

首先,删除您的Content View.width = width约束:

enter image description here

具有该约束的情况下,自动布局使contentView 仅与滚动视图一样宽 ,因此您不会得到任何水平滚动。通过显式设置.contentSize,您可以进行一些滚动,但是您发现滚动没有提供您想要的内容。

删除该约束后,将Red View的20点尾约束添加到内容视图的后沿:

enter image description here

现在,您已经有了完整的水平约束链...

- Blue View.leading = leading + 20
- Blue View Width
- Red View.leading = Blue View.trailing + 40
- Red View Width
- trailing = Red View.trailing + 20

这满足了自动布局并正确定义了Content View ...的宽度,并且由于Content View被限制在Scroll View的前导和尾随,因此您可以获得正确的水平滚动。

不需要任何代码。

答案 1 :(得分:0)

我通过添加以下内容使其起作用:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    scrollView.contentSize = CGSize(width: 750,height: 812)
}

但是为什么上面的方法行得通,而下面的却行不通?

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    print("Content view bounds: \(contentView.bounds)")
    scrollView.layoutIfNeeded()
    scrollView.contentSize = contentView.bounds.size
}

在运行时contentView.bounds为(0.0,0.0,750.0,812.0)