美文网首页IOS-Tips我的ios学习之旅iOS开发遇到的问题
AutoLayout下多行UILabel无法显示多行文本的问题

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

作者: Code_Ninja | 来源:发表于2015-04-01 14:39 被阅读8215次

          在项目中的一个自定义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标签的富文本内容,可以不设置这个属性。那么为了不出错,最好两种情况下都设置下这个属性。

    相关文章

      网友评论

      • b7ac9371e916:遇到一样的问题,改变约束解决的。

        不是Label的约束有问题,是相关的约束,设置横向相关的控件抗挤压高点就行了。
      • LD_左岸:楼主我在Xib里给cell上的Label添加了上下左右的约束 相对于cell的ContentView 上0下0左10右10 还需要设置preferredMaxLayoutWidth吗 目前显示出来的cell有问题 感觉Lable的高度有问题 Lable上的文字显示不全....
        Code_Ninja:@左岸__ xib拖动的应该不用设置,我是纯代码的。布局设置好了之后直接用动态高度啊,不用再获取label的高度。
        LD_左岸:cell上只有一个label cell的高度返回的代理方法里 返回的是label上文字的动态高度 但是lable上展示的文字不太对
      • 2e4d6736b77b:查了一下午资料到你这解决了,太感激了
      • Zentopia:为什么我没有设置 preferredMaxLayoutWidth 也可以正常显示呢?我用的 UILabel + Masonry + 普通文本 + numberOfLines=0
        戏精鸭鸭:遇到过一次,都是普通文本,但是有的UILabel + Masonry + 普通文本 + numberOfLines=0就可以,有的就不可以,很郁闷。还有一个问题就是动态计算cell高度,使用CGRectGetMaxY(self.contentLabel.frame)方法的话返回的值总是会多20几个px,但是设置上preferredMaxLayoutWidth解决了。。。无语了也是
        Code_Ninja:@UtopiaCHN 你可以看下在不同iOS版本下的情况。
      • Code_Ninja:@碧野MAX 我试了下不行,我是用的Masonry写的约束。你是在SB中布局的吧?可能有些差异
      • 6fdb0c58ceca:@Cielpy 用[_titleLabel setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];设置了抗拉伸优先级,OK了,谢谢
      • 6fdb0c58ceca:@Code_Ninja 我好像解决了,我在用Masonry添加约束之前,先给左边的Label添加了抗拉伸的优先级
        [_titleLabel setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];
        然后就OK了
      • Code_Ninja:@碧野MAX 你可以把你的代码贴出来看看。
        下面是我之前遇到的一个类似问题的解决方案:
        在自定义单元格上面,左边一个UILabel右边对齐显示标题,右边一个UITextField供用户输入内容。给UILabel添加了固定宽度约束,给UITextFiled添加了边距约束。但是当UITextField中输入内容很长的时候会发现UITextFiled会把左边的UILabel挤压到左边(比如UILabel显示的文字是@“姓名”给它加的宽度约束是100,但是实际显示的时候会显示到单元格的最左边,只有刚刚好能显示全@“姓名”的宽度,剩下的单元格宽度都给了UItextFiled。)这种效果不是我们想要的效果,我们想要UILabel固定宽度。只需要将右边的UITextField也添加一个宽度约束即可,添加lessThanOrEqualTo(这里加上cell的宽度减去左边UILabel的宽度以及它们之间的间隔) 这样当文本框输入内容很长的时候就不会挤压左边的UILabel了。
      • 743211a10026:@碧野MAX 设置内容压缩优先级试下?
      • 6fdb0c58ceca:@Cielpy 我现在遇到跟你差不多的问题,我的是两个Label并排显示,都不固定长,但是左边的Label会短一点,我用Masonry设置之后始终都是左边的长,右边的根据内容会伸缩,刚好和我的需求相反,不知道你有没有经验
      • Code_Ninja:@Cielpy 虽然在不同屏幕这个值不同,但是你可以通过获取[UIScreen mainScreen].bounds.size.width就是屏幕的宽度啊,然后再减去左右的间距,赋值给preferredMaxLayoutWidth就可以了。
        你说的“按道理设置左右间距宽度就应该确定了”这个问题,如果你用SB或者XIB拖的界面的话应该没有这个问题,但是用代码写的约束会有这种问题。比如我有一个自定义的UITableViewCell,左边是一个UILabel显示标题,右边是一个UITextField用来供用户输入内容的,我给UILabel添加了宽度约束(代码添加的,用的Masonry),给UILabel和UITextFiled添加了间距约束,按道理UILabel会显示固定宽度,UITextFiled的宽度也是得到的,但是当这个UITextFiled中输入的文字很长的时候,它自己会向左移动,并把UILable向左挤压了(UILabel显示的宽度是刚刚好能显示全它的text的宽度)。。。。。。
      • 743211a10026:@Code_Ninja 多谢,解决了我的一个大问题。另外如一楼所说,不同屏幕宽度这个值是不同的,
        如图http://s1.momo.moda/2015/04/28/caf1a3dfb505ffed0d024130f58c5cfa.png ,我想做的是棕色label内容不定,前边不能超过蓝色label,后边不能超过绿色label,按理说设置了前约束和后约束宽度应该就确定了,试了下不行。博主有什么建议吗。
      • Code_Ninja:@千煌89 不管这个值怎么得来的,只要你可以得到,你把这个值赋给preferredMaxLayoutWidth它就好了。
      • 千煌89:如果preferredMaxLayoutWidth这个值是根据屏幕宽度等等要计算的呢

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

      本文链接:https://www.haomeiwen.com/subject/nfbatttx.html