考虑我在 UILabel
(动态文本的长行)中有以下文本:
由于外星军队的数量远远超过团队,因此玩家必须利用后世界末日的世界,例如在垃圾箱,支柱,汽车,瓦砾和其他物体后面寻找掩护 .
我想调整 UILabel's
高度,以便文本可以适应 . 我正在使用 UILabel
的以下属性来使文本内部包装 .
myUILabel.lineBreakMode = UILineBreakModeWordWrap;
myUILabel.numberOfLines = 0;
如果我没有朝着正确的方向前进,请告诉我 . 谢谢 .
30 回答
sizeWithFont constrainedToSize:lineBreakMode:
是要使用的方法 . 以下是如何使用它的示例:你正朝着正确的方向前进 . 你需要做的就是:
克里斯的答案是错误的 .
应该
除此之外,这是正确的解决方案 .
在iOS 6中,Apple为 UILabel 添加了一个属性,极大地简化了标签的动态垂直大小调整: preferredMaxLayoutWidth .
将此属性与lineBreakMode = NSLineBreakByWordWrapping和sizeToFit方法结合使用,可以轻松地将UILabel实例的大小调整为适应整个文本的高度 .
来自iOS文档的引用:
一个样品:
而是以编程方式执行此操作,您可以在设计时在Storyboard / XIB中执行此操作 .
在属性检查器中将UIlabel的 number of lines 属性设置为 0 .
然后根据要求设置宽度约束/(或)前导和尾随约束 .
然后 set height constraint 与 minimum value . 最后选择您添加的高度约束,并在尺寸检查器中选择属性检查器旁边的高度约束, change 高度约束的 relation 来自 equal to - greater than .
无需添加单行代码即可完美检查此工作 . (使用Autolayout)
我根据你的要求为你做了一个 demo . 从以下链接下载,
Autoresize UIView and UILabel
Step by Step Guide :-
Step 1 :- 将约束设置为UIView
1)领先2)Top 3)尾随(来自主视图)
Step 2 :- 将约束设置为标签1
1)领先2)前3)尾随(从它的超级视图)
Step 3 :- 将约束设置为标签2
1)领先2)尾随(从它的超级视图)
Step 4 :- Most tricky 从UIView向UILabel提供帮助 .
Step 5 :- (可选)将约束设置为UIButton
1)领先2)底部3)尾随4)固定高度(来自主视图)
Output :-
Note :- 确保在Label属性中设置了Number of lines = 0 .
我希望这个信息足以理解Autoresize UIView根据UILabel的高度和Autoresize UILabel根据文字 .
谢谢大家的帮助,这是我尝试的代码,这对我有用
Solution to iOS7 prior and iOS7 above
由于不推荐使用sizeWithFont,我使用这个 .
这个获得标签特定的属性 .
这是一个类别版本:
UILabel+AutoSize.h #import
UILabel+AutoSize.m
最后,它奏效了 . 感谢你们 .
我没有让它工作,因为我试图在
heightForRowAtIndexPath
方法中调整标签大小:(是的,我很傻),我在
cellForRowAtIndexPath
方法中将标签调整为默认值 - 我忽略了我之前写过的代码:您可以通过以下方式实现
TableViewController's
(UITableViewCell *)tableView:cellForRowAtIndexPath
方法(例如):也可以使用
NSString
的sizeWithFont:constrainedToSize:lineBreakMode:
方法计算文本的高度 .对于那些迁移到iOS 8的人来说,这里是Swift的类扩展:
对我有用的最简单和更好的方法是将高度约束应用于标签并在故事板中设置 priority to low ,即(250) .
所以你不必担心以编程方式计算高度和宽度,这要归功于故事板 .
更新方法
谢谢你的这篇文章 . 它对我帮助很大 . 在我的情况下,我也在一个单独的视图控制器中编辑文本 . 我注意到当我使用时:
在tableView:cellForRowAtIndexPath:方法中,每次编辑单元格时,标签视图都会在上一个视图的顶部连续呈现 . 文本变为像素化,当删除或更改某些内容时,在新版本下可以看到以前的版本 . 这是我解决问题的方法:
没有更奇怪的分层 . 如果有更好的方法来解决这个问题,请告诉我 .
在这里使用这一切在标签上使用属性并通过将itemTitle.text中的文本增加为来测试它
它将根据您的需要显示perfetc答案
您也可以将它用作方法 . @Pyjamasam非常真实,所以我只是制作它的方法 . 对其他人来说,这可能会有所帮助
并设置它像这样
Swift 2:
有趣的行是
sizeToFit()
并且将frame.size.height
设置为最大浮点数,这将为长文本提供空间,但sizeToFit()
将强制它仅使用必要的,但 ALWAYS 在设置.frame.size.height
后调用它 .我建议设置
.backgroundColor
用于调试目的,这样您就可以看到为每种情况呈现的帧 .要在Swift3中执行以下操作,请执行以下操作:
这是使用Objective-c获取UILabel高度的一行代码:
并使用.height,您将获得标签的高度,如下所示:
我的代码:
这种方法将给出完美的高度
请在故事板中为UILable设置约束,包括左上角右下角
我计算UILabel动态高度的方法 .
换行功能:
加上以上答案:
这可以通过故事板轻松实现 .
为UILabel设置约束 . (在我的情况下,我做了顶部,左边和固定宽度)
在属性检查器中设置 Number of line to 0
在属性检查器中设置 Line Break to WordWrap .
基于this answer的UILabel扩展 Swift 4 and above
可以像:
问题是没有提到的功能是可行的,并且对于某些字符串和字体将返回不正确的高度值 . 特别是归因于文本的失败 .
唯一可行的解决方案是:https://stackoverflow.com/a/4214978/699944,重点是使用CoreText手动计算每一行的高度以获得正确的大小 . 没有其他已知方法可以做到这一点 .