×

AutoLayout下多行UILabel无法显示多行文本的问题

96
Code_Ninja
2015.04.01 14:39 字数 580

      在项目中的一个自定义UITableViewCell中有个多行UILabel,用来显示多行文本的。项目中用了第三方库Masonry来给视图添加约束。添加完约束之后程序跑起来,发现这个UILabel总是不能显示多行文字,总是只显示一行文字就结束了,虽然设置的numberOfLines=0。我就纳闷了,我一直怀疑是我的约束加的有问题,就一遍又一遍的检查约束,调整约束。可是到头来还是显示不正常,我就奇怪了,之前我有一个显示多行的UILabel就显示正常了啊,同样是这样加的约束啊。查看之前的代码,发现那个多行的UILabel显示的是富文本,而富文本是自带有html标签的字符串,所以能正常显示多行。区别就在这里了,查看资料发现UILabel在iOS6中添加了一个这样的属性:preferredMaxLayoutWidth。看帮助文档是这样解释的:

This property affects the size of the label when layout constraints are applied to it. During layout, if the text extends beyond the width specified by this property, the additional text is flowed to one or more new lines, thereby increasing the height of the label.

再看Xcode里面的解释:

// Support for constraint-based layout (auto layout)

// If nonzero, this is used when determining -intrinsicContentSize for multiline labels

      看到这个解释,我想到了UIScrollView的布局,要确定自己的Size,必须由它的子视图计算得出,而子视图的尺寸计算必须有一个确定的参考物,否则子视图的真实尺寸计算不出来,那就得不到UIScrollView的contentSize。这个属性决定了多行UILabel的真实尺寸,多行UILabel不知道自己要显示多少内容,不知道自己的真实尺寸,这个preferredMaxLayoutWidth属性就告诉了它布局时最大的参考宽度。

正确地设置了UILabel的preferredMaxLayoutWidth属性之后发现它正常地显示了多行文本内容。

      总结:如果多行UILabel单纯的显示多行文本,不是带标签的富文本,那么就要设置preferredMaxLayoutWidth属性。如果是显示多行带html标签的富文本内容,可以不设置这个属性。那么为了不出错,最好两种情况下都设置下这个属性。

iOS开发
Web note ad 1