【问题标题】:Horizontal scroll view scrolls but only partially and bounces back to original position水平滚动视图滚动但仅部分滚动并反弹回原始位置
【发布时间】:2019-06-14 15:52:33
【问题描述】:

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

当我运行它时,它会部分水平滚动 - 我可以滚动到大约一半的红色视图可见,然后它会反弹回来。 我怎样才能得到它,以便它可以一直滚动,以便所有红色视图都可见,然后停留在那里?

我在视图控制器中有这个,但有没有没有关系。

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

在故事板的屏幕截图中,红色视图没有后沿约束,但是如果我在红色视图和内容视图之间添加一个,那么当我在设备上运行时,它会停止滚动并看起来像这样:

【问题讨论】:

    标签: ios xcode storyboard


    【解决方案1】:

    您不需要明确设置 .contentSize 开头 - 您可以让自动布局为您处理这一切。

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

    具有该约束告诉自动布局使您的contentView 仅与滚动视图一样宽,因此您不会获得任何水平滚动。通过显式设置.contentSize,您可以进行一些滚动,但您发现它并没有给您想要的。

    删除该约束后,从Red View 到内容视图的后沿添加一个 20 磅的尾随约束:

    现在,你有一个完整的水平约束链......

    - 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 被限制为滚动视图的前导和尾随,您可以获得正确的水平滚动。

    不需要任何代码。

    【讨论】:

      【解决方案2】:

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

      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)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-03
        相关资源
        最近更新 更多