文本更改后 UILabel 未正确换行

Posted

技术标签:

【中文标题】文本更改后 UILabel 未正确换行【英文标题】:UILabel not wrapping correctly after text change 【发布时间】:2013-06-24 23:46:34 【问题描述】:

我正在通过 IB 工作,并且有一个几乎延伸到布局末尾的 UILabel。我将它设置为 Lines=2,因为它应该占用的最大行数是 2。但是,如果它只有 1 行长,我希望它具有顶部的垂直对齐方式。

IB 中的标签设置:

 Lines:2
 Line breaks: Word wrap

在代码中,我在 viewDidLoad 方法中设置了 UILabel 的文本。但是,作为功能的一部分,文本必须更改。这是我的代码:

[_main_lbl1 setText:[myUI MAIN_TITLE]];  //Always only 1 line
[_main_lblsub1 setText:[myUI SUB_TITLE]]; //May be 1 or 2 lines
[_main_lblsub1 sizeToFit];  //Causes vertical alignment (I believe)

每当我更改文本并重新运行 sizeToFit 时,文本换行就会完全混乱。与在 IB 中设置的几乎到达 UILabel 的末尾不同,在某些情况下,文本会在略多于一半的距离处换行,在某些情况下它根本不换行。

IB中的布局图:

模拟器中结果标签的图像:

在第一个标签中它似乎工作正常,第二个标签根本不换行。

在更改 UILabel 文本时,我需要做些什么来保持文本换行吗?我还有什么遗漏的吗?

注意:更新问题以包含更多细节和图片。

谢谢

【问题讨论】:

所以你想要它包裹,它只是包裹在错误的地方?或者你不想让它换行? 请出示您使用过的图片和代码。 【参考方案1】:

问题是您使用的是 sizeToFit。这会将标签拉伸以适合文本。如果你需要改变你可以使用的大小:

CGSize maxSize = CGSizeMake(320, 9999);  // 999 means it can be as tall as you like

CGSize textSize = [label.text sizeWithFont:label.font
                         constrainedToSize:maxSize];
label.size = textSize;

【讨论】:

这将完全阻止它换行。他似乎对包裹的方式不满意,而不是根本包裹。 嗨,在问题中添加了更多细节。正如drawag所说,我实际上希望它能够换行。 根据新图片更新了我的答案。【参考方案2】:

你不应该做任何特别的事情。当您更改文本时,它将自动换行以适应文本。否则,文本将超出文本标签范围(这不是您想要的)。您的问题是 sizeToFit 永久更改标签的框架。它使它尽可能小,同时仍然显示文本。您正在让它将其框架调整为原始文本,然后您正在更改文本,因此它的大小不再正确。您应该将框架重置为原始框架,更改文本,最后再次调用 size 以适应。

在 viewDidLoad 中:

self.originalFrame =  self.mainLabelSub1.frame;

然后在viewWillAppear中:

self.mainLabel1.frame = self.originalFrame;
self.mainLabel1.text = @"New Text";

注意: 查看文本标签的边框以了解环绕潜力的一个好方法是将标签的背景临时设置为像洋红色这样突出的颜色。

【讨论】:

嘿,在问题中添加更多细节。谢谢 我想我知道你的问题是什么。我适当地更新了我的答案。基本上 sizeToFit 会永久更改标签的框架,以显示其中的文本。您需要在更改文本和重新调整大小之前重置它。 重置框架?这是怎么做的?所以基本上第一次运行时我可以创建一个框架,然后在文本更新后重新应用这个相同的框架? 是重置我的意思是重新设置它。在代码中,您可以在调用 -sizeToFit 之前存储“原始”帧。然后每次更改您将框架设置为“原始”框架的文本并再次调用 -sizeToFit。 你有这个代码吗?我还是个 ios 开发新手。

以上是关于文本更改后 UILabel 未正确换行的主要内容,如果未能解决你的问题,请参考以下文章

如何在 animateWithDuration 的每个动画之间重复更改 UILabel 的文本?

当我在 ios 中展开和折叠 TableList 单元格时如何更改 UILabel 文本颜色

多行 UILabel 没有正确换行 [重复]

字体更改时自动uiLabel和uiTableViewCell调整大小的iphone代码?

SwiftUI 表单中的文本在更改后不换行

ScrollView中的UILabel sizeToFit