2013-07-06 134 views
10

我一直在试图两天修改UILabel的框架,这 是荒谬的......在UILabel是一个IBOutlet,但是这是不是这个原因 为什么它不工作:我试图以编程方式创建一个UILabel和 它仍然没有工作。下面是我如何做到这一点:为什么我不能更改我的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

+0

你之前和之后记录了帧?你为什么要改变边界(特别是使用框架,它在不同的坐标空间中)? – Wain

+0

我按照你的建议前后记录了框架,并得到了包含在我编辑的问题中的奇怪结果。 –

+1

为什么在最后将行数设置为0? – Abizern

回答

26

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

+0

它的工作!非常感谢!! –

+0

工作很好。如何更新约束并不明显。这里是你如何做到这一点:self.labelWidthContraint.constant = size.width; self.labelHeightContraint.constant = size.height; – ddiego

+0

不完全直观,但这很好 - 感谢Delmar先生! – BonanzaDriver

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

此外,请考虑通过更改边界来尝试做什么。将代码注释掉,直到你至少得到框架为止,然后你可以将它添加回来,并检查它实际上是你想要的。

+0

请参阅我的最新编辑。我遵循你的建议,并在日志框架改变,但它没有在模拟器中做一件事... –

+0

这是唯一的代码,你做任何事情的标签?代码在哪里(它在什么方法,什么时候被调用)在哪里?它有什么自动调整大小/自动布局规则? – Wain

+0

我从IB添加了UILabel,但没有触及自动布局约束。这里是这个代码所在的完整文件:https://gist.github.com/AzizLight/40b66b2daa2917952d6f正如你可以看到UILabel被设置在'viewDidLoad'中,这就是它... –

相关问题