UILabel不会使用AutoLayout在UIScrollView内自动换行

我有一个UILabel里面的UIScrollView ,我试图换行。 我想使用AutoLayout进行布局configuration。 当它不在UIScrollView时, UILabel字完美包装。 我只需要将行数设置为0,并将换行符模式设置为自动换行。

但是,当我把UILabel放入一个UIScrollView ,换行停止了。 我已经使用AutoLayout检查了“ UIScrollView中的dynamicUILabel高度 ”和“ 使用Interface Builder和Autolayout在UIScrollView中正确地调整UILabel的大小 ”,但是这些问题都没有帮助我的答案。

我已经build立了一个testing项目,说明如果有人想看看我在说什么。

原因是滚动视图内的约束被固定在滚动视图上,并不意味着你认为它们的意思。 他们必须从内向外确定滚动视图的contentSize ; 他们本身并不是从外部决定scrollview内部的东西的大小。请参阅我的答案: https ://stackoverflow.com/a/13548039/341994

在你的情况最简单的解决scheme是使用中间内容视图,以便您有这样的层次结构:

 scroll view content view label 

现在给内容视图绝对的宽度和高度的约束,并将其在所有四面固定到滚动视图。 现在 ,标签将按照您的预期工作。 内容视图有足够的约束来绝对地设置自己的大小,并从内部约束滚动视图的contentSize 。 同时,标签上的约束不是滚动视图,而是内容视图,而且由于内容视图具有固定的大小,并且是普通视图(而不是滚动视图),因此标签上的约束做到了您所期望的。

我有同样的问题,但能够通过在标签上设置以下约束使UILabel正确包装

  • 领先的空间来监督
  • 尾随空间来监视
  • 等宽度到超视图**(这是限制在标签上的宽度,所以它会正确包装)

您还必须具有从滚动视图的顶部到底部的限制。 例如,如果您只有标签,则必须将“Top Space”和“Bottom Space”设置为“Superview”。 如果你不这样做,它将有一个模糊的可滚动内容高度。

要防止滚动视图的水平滚动,请选中“方向locking已启用”并在scrollViewDidScroll方法内正确调用setContentOffset(有关详细信息,请参阅此问题的第一个答案)。

尝试使用UILabel's preferredMaxLayoutWidth并将其设置为父视图的宽度。