为什么我不能改变我的UILabel的框架?

时间:2013-07-06 16:04:17

标签: ios objective-c uilabel frame

我一直在尝试修改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;

Proof

2 个答案:

答案 0 :(得分:26)

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

答案 1 :(得分: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方法提供允许的宽度,然后使用响应(而不仅仅是高度)设置标签大小。

另外,请考虑通过更改边界尝试执行的操作。注释代码,直到你至少得到框架,然后你可以将其重新添加并检查它实际上做你想要的。