【问题标题】:UIScrollView + Centered View + Ambigous Scrollable Content Size + many iPhone sizesUIScrollView + 居中视图 + 模糊的可滚动内容大小 + 许多 iPhone 尺寸
【发布时间】:2014-12-03 09:27:49
【问题描述】:

我有:

  • 应用程序,应该在横向和纵向模式下工作。
  • 顶部带有全尺寸滚动视图的视图。
  • 滚动视图中的某些视图具有固定的宽度和高度。 (添加了 H 和 W 约束)
  • 设置为在容器中水平居中查看滚动视图。 (根据约束添加)

我在界面生成器中收到警告“具有不明确的可滚动内容宽度”。

据我所知,解决此问题的唯一方法是设置尾随和前导约束。 但对于不同的 iPhone(5.5"、4.7"、4"),我需要设置不同的尾随和前导约束。

我怎样才能消除此警告,并且仍然在所有 iPhone 尺寸的固定 W 和 H 的情况下保持居中水平视图?

我创建 Github repo 来说明这个问题:ScrollViewAmbigous

这不是 UIScrollView Scrollable Content Size Ambiguity 的重复 ,但它相似(虽然没有回答),但这个问题尤其与不同尺寸的 iPhone 有关。

【问题讨论】:

    标签: ios uiscrollview interface-builder autolayout xcode6


    【解决方案1】:

    早上喝了一杯新鲜的咖啡,我想出了解决这个问题的方法!

    所以,这是最简单情况的初始状态:

    1. scrollView 对所有边的约束为 0
    2. 按钮居中水平和垂直,宽度和高度固定
    3. 当然还有Has ambiguous scrollable content widthHas ambiguous scrollable content height 烦人的警告

    我们要做的就是:

    • 为我们的视图添加 2 个额外的约束,例如“0”用于尾随和/或底部空间(在我的例子中 - UIButton)

    重要提示:您必须添加尾随和/或底部约束。不是“领先和顶级”——这是行不通的!

    您可以在我的示例项目中查看它,它演示了如何解决此问题:ScrollViewAmbigous

    附言

    我不知道它为什么起作用以及 Xcode 如何检测哪个约束的优先级更高(因为我没有明确为这些约束设置优先级),但如果有人解释一下为什么它在下面的 cmets 中起作用,我将不胜感激.

    【讨论】:

    • 感谢您的解决方案,我有非常相似的问题:如何在您的示例中使 UIButton 在 UIScrollView 内滚动?
    • @Ponf If button size + constraint >= size of the screen - 它会滚动。
    • 是的!在这件事上花了半个小时!在我添加底部约束之前,我收到了这条消息。此外,当我滚动时,它总是返回到滚动视图的顶部。因此,在添加此约束后,它最终正常滚动,并且警告消失了!谢谢你! @skywinder
    • 非常感谢您提供此解决方案。我发现当有多个元素时(例如:3 个 UIButtons 一个接一个垂直对齐),必须在最底部添加约束。 github.com/skywinder/scrollViewAmbigous/pull/1
    • 当 ScrollView 的子视图是滚动视图本身的完整高度/宽度时,这似乎不起作用。考虑一个适合视口的滚动视图,其中包含几个“卡片”,这些“卡片”也是视口的大小。当高度/宽度可变地取决于视图时,您不能对高度/宽度进行硬编码。
    【解决方案2】:

    问题

    1. 警告告诉我们, 滚动视图取决于它的子视图。
    2. 虽然您的子视图没有任何严格的位置和大小规则(没有固定约束),但它会混淆 nib 生成的滚动视图 内容大小。

    解决方案

    1. 只制作一个子视图作为滚动视图的“内容视图”。

    2. 向该“contentView”添加严格(固定)约束。

      最佳实践:宽度和高度与其滚动视图相等。

    3. 将所有其他子视图和约束添加到您的“contentView”。

    【讨论】:

    • 与滚动视图相等的宽度和高度将呈现内容视图,因此滚动视图无用。
    • 运行时可以将 contentView 的底部更改为 contentView 中bottomMost 视图的底部。这样你就可以改变 contentView 的高度。
    • 感谢您的解决方案。为什么滚动视图必须有内容视图?它不应该明白自己在滚动视图中添加的任何内容都应该可以按给定顺序滚动吗?
    • @AsthaGupta 因为 UIScrollView 是 UIView 的子类,并且有额外的属性、方法、委托等。所以它比 UIView 更丰富。而 .contentView 是一个简单的 UIView。使用 UIScrollview 中的 .contentView 基本上可以更好地管理。
    【解决方案3】:

    在这个问题上似乎有很多困惑。我的看法是 UIScrollView 必须有 TWO 尾随空间约束,一个将其连接到其中一个子视图的“内部”约束(因此它可以知道其内容宽度),另一个连接它的“外部”约束到同级视图或父视图,因此它知道它的帧宽度。

    同样的原则适用于高度,即两个底部空间限制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2016-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多