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

我已经尝试了两天修改UILabel的框架,这是荒谬的… UILabel是一个IBOutlet,但这不是它不工作的原因:我试图创build一个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创build一个框架,并给它任意值,但是这也没有办法。

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

编辑1:我之前和之后logging框架,我得到了奇怪的结果:

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

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

编辑2:我改变了代码如下,日志说,帧改变,但在模拟器上没有改变; 我通过向UILabel的图层添加红色边框来certificate它。

 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; 

证明

如果您使用自动布局,则不应该进行任何框架设置 – 要么closures自动布局,要么使用约束来更改标签的大小。 最简单的方法是在IB中给你的标签一个高度限制(如果你想要一个宽度不变的话,宽度也是一样的),然后制作一个IBOutlet。 然后,在代码中,根据您从sizeWithFont获取的值更改该约束的常量值:constrainedToSize:lineBreakMode :.

你的标签有一个零框架开始,所以,当你这样做:

 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方法,然后使用响应(不仅仅是高度)来设置标签大小。

另外,通过改变边界来考虑你想要做什么。 注释代码,直到你至less得到框架,然后你可以添加回来,并检查它实际上是你想要的。