使用自动布局

时间:2016-03-13 22:47:50

标签: ios uiscrollview autolayout

我有一个看似简单的设计,我无法使用自动布局约束表达:在UIScrollView中,我需要显示一个居中的文本列,其最小宽度为300磅,最大宽度为500磅(在所有情况下保持至少10分的差距。)

文本列实际上是一个UIStackView,但这对于这个讨论并不重要,视图可以很容易地成为具有宽高比的UIImageView。

我尝试使用具有不同内容拥抱和压缩阻力的填充视图,具有水平轴的堆栈视图,具有小于或等于常量的宽度约束等等。我想在所有内部执行此操作故事板,在布局更改期间嗅探或使用大小类感觉就像作弊。

(我的一些实验导致Xcode在更新故事板时挂起:给我一个痛苦的暗示,即没有针对这些约束的解决方案。)

在你建议之前,I have read about the subtleties of UIScrollView and Auto Layout

这似乎是一个无法解决的问题,这是一种耻辱。这是一个非常常见的模式,设计师喜欢使用CSS(使用最小宽度和最大宽度)。我希望我在这里遗漏一些东西,并且对汽车布局有更深入了解的人可以解释一种方法(并为其他想做同样事情的人提供参考。)

更新:以下Adam和Ben的建议对实现此布局非常有帮助。但是一旦你得到多个文本块,自动布局迭代求解器就无法处理它(并且Xcode会挂起。)有关更多信息:http://openradar.appspot.com/25173433

4 个答案:

答案 0 :(得分:3)

这个实际上非常简单!我已经添加了storyboard file作为演示。内容视图中文本的关键位:

  • 领先/尾随边距> = 10
  • 宽度> = 300
  • 宽度< = 500
  • 中心对齐

不需要更改优先级,除非您有其他内容优先。

enter image description here

答案 1 :(得分:0)

尝试前导和尾随约束10,但将其优先级设置为750.然后水平居中并且> = 300宽度和< = 500宽度并保留1000优先级。

答案 2 :(得分:0)

如果我正确地解决了这个问题,我认为我有一个相当简单的设置可以解决这个问题。

我从scrollview开始,然后添加一个基本的UIView作为容器。我将UIView固定在scrollview的顶部,底部,前导和尾部边缘,以便正确管理scrollview的内容大小。我向该容器视图添加一个约束,以使宽度与scrollview匹配。

然后我将UIStackView添加到容器视图中,并给它们这些约束:

  • 将中心X与Superview对齐
  • Superview的尾随空格> = 10
  • 领先于Superview的空间> = 10
  • 宽度= 500,优先级为750
  • 宽度> = 300
  • Superview的底部空间= 10
  • Superview的顶级空间= 10

除了宽度= 500之外的所有默认优先级。然后我在堆栈视图中放置了一些标签,我得到的结果是一列,任何一边至少有10点边距,但绝不会宽于500点,并将根据堆栈视图的内容下降到300点宽。

答案 3 :(得分:0)

如果我能正确理解问题,我想我有一个解决方案。我在UIScrollView中使用UILabel对此进行了测试,但它适用于任何具有内在大小的视图。对于您正在使用的内部视图,请尝试使用这些约束:

  • 宽度< = 500
  • 宽度> = 300
  • 将中心X与Superview对齐
  • Superview的最高空间= 10
  • Superview的底部空间= 10
  • Superview = 10(优先级750)的领先空间
  • 追踪空间到Superview = 10(优先级750)
  • 水平内容抗压性优先:250

设置水平内容抗压性的低优先级是关键。我的UILabel里面有很多文本,因此它的内在内容大小就像是2200px。使用默认的水平压缩阻力,它将始终扩展到500px最大宽度,并且滚动视图将在较小的屏幕上水平和垂直滚动。我只想垂直滚动,所以我在UILabel上设置了一个较低的水平压缩阻力优先级,告诉自动布局将其挤压以适应。