10

我已经尝试了两天来修改 a 的框架UILabel,这很荒谬......这UILabel是一个 IBOutlet,但这不是它不起作用的原因:我试图以UILabel编程方式创建一个,但它仍然没有工作。这是我的做法:

self.descriptionLabel.text = description;
self.descriptionLabel.lineBreakMode = NSLineBreakByWordWrapping;

CGSize textSize = [self.descriptionLabel.text sizeWithFont:[UIFont systemFontOfSize:12.0]
                                         constrainedToSize:CGSizeMake(self.descriptionLabel.frame.size.width, FLT_MAX)
                                             lineBreakMode:self.descriptionLabel.lineBreakMode];
CGFloat frameHeight = textSize.height;
CGRect frame = self.descriptionLabel.frame;
frame.size.height = frameHeight;
self.descriptionLabel.frame = frame;

CGRect bounds = self.descriptionLabel.frame;
bounds.origin.x = self.descriptionLabel.frame.origin.x + 10.0;
bounds.size.width = self.descriptionLabel.frame.size.width - 20.0;
self.descriptionLabel.bounds = bounds;
self.descriptionLabel.numberOfLines = 0;

我已经在 IRC 上问过了,他们告诉我没有理由不改变框架......

我还尝试创建一个框架CGRectMake并为其赋予任意值,但这也没有成功。

请问有谁知道可能是什么问题?

编辑 1:我在前后记录了帧,得到了奇怪的结果:

Before: 0.000000 0.000000 0.000000 0.000000
After: 0.000000 0.000000 0.000000 33525.000000

设置框架后的高度是唯一有意义的值(我故意在标签中有很多文本)。

编辑2:我改变了代码如下,日志说框架改变了,但在模拟器上它没有改变;我通过在UILabel.

self.descriptionLabel.text = description;
self.descriptionLabel.lineBreakMode = NSLineBreakByWordWrapping;

CGSize textSize = [self.descriptionLabel.text sizeWithFont:[UIFont systemFontOfSize:12.0]
                                         constrainedToSize:CGSizeMake(self.view.frame.size.width, FLT_MAX)
                                             lineBreakMode:self.descriptionLabel.lineBreakMode];
CGFloat frameHeight = textSize.height;
CGRect frame = CGRectMake(0.0, 300.0, self.view.frame.size.width, frameHeight);
self.descriptionLabel.frame = frame;

DDLogInfo(@"After: %f %f %f %f", self.descriptionLabel.frame.origin.x, self.descriptionLabel.frame.origin.y, self.descriptionLabel.frame.size.width, self.descriptionLabel.frame.size.height);
// After: 0.000000 300.000000 320.000000 585.000000

self.descriptionLabel.numberOfLines = 0;
self.descriptionLabel.layer.borderColor = [UIColor redColor].CGColor;
self.descriptionLabel.layer.borderWidth = 2;

证明

4

2 回答 2

26

如果您使用自动布局,则不应进行任何框架设置——关闭自动布局或使用约束来更改标签的大小。最简单的方法是在 IB 中为您的标签设置一个高度约束(如果您想要一个恒定的宽度,也可以设置宽度),并为其创建一个 IBOutlet。然后,在代码中,根据从 sizeWithFont:constrainedToSize:lineBreakMode: 获得的值更改该约束的常量值。

于 2013-07-06T17:15:06.530 回答
0

您的标签从零开始,因此,当您执行此操作时:

CGSize textSize = [self.descriptionLabel.text sizeWithFont:[UIFont systemFontOfSize:12.0]
                                         constrainedToSize:CGSizeMake(self.descriptionLabel.frame.size.width, FLT_MAX)
                                             lineBreakMode:self.descriptionLabel.lineBreakMode];

您要求该sizeWithFont方法做一些实际上不可能的事情 - 告诉您在不允许宽度时所需的高度。它提供的响应(33525.000000)可能是如果每行允许一个字符或类似的字符的高度。

因此,要么在开始之前设置标签的宽度,要么为sizeWithFont方法提供允许的宽度,然后使用响应设置标签大小(不仅仅是高度)。

另外,请考虑通过更改界限来尝试做什么。注释掉该代码,直到您至少获得正确的框架,然后您可以将其重新添加并检查它实际上是否符合您的要求。

于 2013-07-06T16:30:17.940 回答