【问题标题】:Getting ScrollView to Work with Autolayout and Storyboard让 ScrollView 与 Autolayout 和 Storyboard 一起工作
【发布时间】:2017-09-22 15:57:29
【问题描述】:

我正在尝试为我想要构建的应用程序制作一个非常简单的布局 - 但我似乎正在努力使用 ScrollView 并通过 Storyboard 让它工作。基本上我正在尝试在下面构建:

我已经使用几个教程完成了约束 - 但它要么不滚动,要么看起来不对。有什么建议吗?

我收到以下警告:

【问题讨论】:

  • @riadhluke 但是如果我为它提供一个高度 - 这不会阻止它滚动 - 内容视图的内部视图不会为滚动视图提供高度吗?
  • 在使用约束进行布局时,您必须为 UIScrollView 提供 contentSize。例如:您可以将 View 的宽度设置为等于 scrollView,因为这将提供 scrollview 内容的宽度。然后,提供内容高度,垂直布局红色和黄色视图,并使用它们提供视图的高度。这意味着您必须为黄色视图提供初始高度,或者您可以使用提供 intrinsicContentSize 的视图来确定黄色视图高度,这样您就不必手动更改它。
  • 如果您提供的内容高度高于滚动视图框架,它将滚动。没错,内部视图应该提供内容大小,但现在没有任何价值,因为视图(滚动视图的唯一内容)没有确定的大小。
  • 我不认为我关注你 - 我只是将项目拉入 gh repo - github.com/grantkemp/scrollview ...所以我应该为 ContentView 拉一个大小吗?

标签: ios swift uiscrollview ios-autolayout


【解决方案1】:

在使用约束进行布局时,您必须为 UIScrollView 提供 contentSize。

例如:

您可以将 View 的宽度设置为等于 scrollView,因为这将提供 scrollview 内容的宽度。然后,提供内容高度,垂直布局红色和黄色视图,并使用它们提供视图的高度。这意味着您必须为黄色视图提供初始高度,或者您可以使用提供 intrinsicContentSize 的视图来确定黄色视图高度,这样您就不必手动更改它。

另外我认为你必须删除 redview top == layout guide top,并添加 redview top == View top 和 yellowview bottom == View bottom

【讨论】:

    【解决方案2】:

    设置滚动视图内部视图的宽度和高度约束。

    如果宽度是固定的,则添加约束使 View 宽度等于 Scrollview。

    如果高度是可变的,则设置当前高度并将其优先级更改为 750。

    例如,在下图中,我设置了视图的宽度和高度。

    注意如果高度是可变的,那么视图必须知道它的高度,基于视图内容高度

    【讨论】:

    【解决方案3】:

    要使UIScrollView 完美运行,您需要做的是确保UIScrollView 内的内容视图 可以始终 推断其高度。我将把UIScrollView 的子视图称为内容视图。话虽如此,您需要做的是:

    • 向您的UIScrollView 添加前导、尾随、顶部和底部。在您的内容视图中添加UIScrollView 的前导、顶部、尾部和底部。现在 Xcode 应该抱怨缺少约束。您现在需要做的是在UIViewController 的主视图中添加一个相等的高度和宽度约束,并为相等的高度约束提供一个优先级,比如说 250。
    • 现在为您的红色视图添加前导、顶部和尾部以及固定高度约束
    • 现在向黄色视图添加前导、尾随、顶部和底部。现在您可以以编程方式设置 yellow 视图 的高度或向其中添加内容,从而允许 yellow 视图 推断其高度,从而让 content视图知道它的高度。

    低优先级相等高度约束的作用是为 内容视图 提供足够的约束,这样 Xcode 就不会抱怨,而且由于优先级低,如果内容的大小它会中断inside 太大,无法完全显示在屏幕上。

    注意:保持视图层次结构与原来相同。

    【讨论】:

      【解决方案4】:

      请记住,ScrollView 中的视图必须具有明确的大小(使用滚动视图进行布局时不要明确其大小)。通常,您可以使用根视图或固定值来布局视图的宽度。视图的高度您还固定了其中包含视图的值或布局(其中的视图必须具有明确的高度→视图的高度可以计算)。这是我的经验,希望对你有帮助:))

      【讨论】:

      • 嗨 NhatQuang - 感谢您的意见。但我不太清楚你的意思。你能澄清一下吗?
      • 好的,你可以试试: + 带有根视图的 Scrollview 布局(顶部 = 0,左侧 = 0,底部 = 0,右侧 = 0)+ 滚动视图布局中的视图(顶部 = 0,左侧 = 0 , right = 0) with scrollview + View's width = rootView + View's height = 500 + 现在你可以在 View 中正常布局所有视图如果你不想明确 View 的高度,那么它里面的所有视图都必须有明确的高度
      【解决方案5】:

      设置scrollView内部视图的高度和宽度。如果视图高度是固定的,则设置约束,对于具有可变高度的视图,设置该视图的高度并将其与 viewController 连接为 NSLayoutConstrains 并以编程方式更改并更新 scrollView 的高度

      scrollView.contenSize.height = fixedViewHeight + variableViewHeight

      也可以改变滚动视图的高度。

      【讨论】:

        【解决方案6】:

        让 ScrollView 工作的键

        • UIScrollView 应该只使用一个子视图。这是一个UIView,用作内容视图来保存您希望滚动的所有内容。
        • 使内容视图和滚动视图的父视图在垂直滚动时具有相等的宽度(或在水平滚动时具有相等的高度)。如果 ScrollView 在复杂的布局中,有时将 ScrollView 放在它自己的父内容视图中会更容易。这样可以更轻松地将子级宽度(或高度)与父级匹配。
        • 确保所有可滚动内容都具有设定的宽度并固定在所有侧面。

        我的完整答案是here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-27
          • 2013-12-27
          • 2020-03-13
          • 2018-01-26
          • 2017-09-19
          相关资源
          最近更新 更多