Ios 为什么可以';我不能改变我的标签的框架吗?

Ios 为什么可以';我不能改变我的标签的框架吗?,ios,objective-c,uilabel,frame,Ios,Objective C,Uilabel,Frame,两天来,我一直在尝试修改UILabel的框架,它 太可笑了。。。UILabel是一个IBOutlet,但这不是原因 不起作用的原因:我试图以编程方式创建一个UILabel 它仍然不起作用。我是这样做的: self.descriptionLabel.text = description; self.descriptionLabel.lineBreakMode = NSLineBreakByWordWrapping; CGSize textSize = [self.descriptionLabel

两天来,我一直在尝试修改
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:我将代码更改如下,日志显示帧 改变了,但在模拟器上没有改变;我加了红色来证明这一点 边界到
ui标签的层

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;

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

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


也可以考虑通过改变界限来做些什么。对代码进行注释,直到您至少获得正确的框架,然后您可以将其重新添加,并检查它是否真正符合您的要求。

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

是否记录了前后的帧?你为什么要改变边界(特别是通过使用帧,它位于不同的坐标空间)?我按照你的建议在前后记录了帧,我得到了一些奇怪的结果,包括在我编辑的问题中。你为什么要在末尾将行数设为0?@Abizern从我读到的,它使行数变为0“动态”或任何你想叫它的东西。我发现这是这样的。但无论如何,取消注释这行并不能解决问题。请查看我的最新编辑。我按照你的建议,在日志中更改了框架,但它在模拟器中没有做任何事情…这是你唯一对标签做任何事情的代码?代码在哪里(它在什么方法中,何时调用)?它有什么自动调整大小/自动布局规则?我从IB添加了UILabel,但没有触及自动布局约束。下面是代码所在的完整文件:正如您所看到的,UILabel是在
viewDidLoad
中设置的,就是这样…工作得很好。如何更新约束并不明显。下面是您的操作方法:self.labelwidthcontaint.constant=size.width;self.labelheightcontaint.constant=size.height;不太直观,但效果很好-谢谢Delmar先生!@rizzes,是的。现在你应该改用boundingRectWithSize:options:attributes:context:来代替。