UILabel调整大小不起作用

时间:2014-02-20 20:50:17

标签: ios uiview resize uilabel frame

我有一个内置UILabel的UIVIew,我希望UILabel和UIView包装文本内容大小。 所以我计算文本大小,并将UIView的框架和UIlabel的框架设置为新的高度。 UIView完全调整大小,但UILabel没有调整大小。保持不变的大小。不知道为什么

这是我的代码:

[mylabel setNumberOfLines:0];
CGSize maximumLabelSize = CGSizeMake(mylabel.frame.size.width, 160);
CGSize expectedLabelSize = [text sizeWithFont:mylabel.font
                                      constrainedToSize:maximumLabelSize
                                          lineBreakMode:mylabel.lineBreakMode];
CGRect newFrame = mylabel.frame;
newFrame.size.height = expectedLabelSize.height;
mylabel.frame = newFrame;
mylabel.text = text;

myView.frame = CGRectMake(myView.frame.origin.x,
                                myView.frame.origin.y,
                                myView.frame.size.width,
                                newFrame.size.height);

PD:我正在更改viewDidLayoutSubviews中的帧,我应该在其他地方进行吗?

更新: 我正在使用Autolayout带来一些限制。我需要Autolayout,因为我有一个导航栏和基于标签栏的应用程序。

1 个答案:

答案 0 :(得分:4)

如果您正在使用Autolayout,则布局约束将决定视图的大小 - 不建议您使用Autolayout并更改视图框架,因为结果并不总是可预测的。

如果您只想让UILabel成为UIView的大小,那么请确保UILabel的高度和宽度限制与UIView相同。 UILabels具有固有的大小(标签'应该'的大小)。除非另有约束,否则标签将始终尝试为其内在大小。

视图应该对它的高度/宽度有一些约束。如果您在Xcode中设置这些,请将IBOutlet设置为控制器以获取这些约束并更改constant属性。

如果要为约束中的更改设置动画,则可以对要更改的约束进行更改,然后调用

[UIView animateWithDuration:.5f animations:^{
    [self.view layoutIfNeeded];
}];

调用layoutIfNeeded将导致重新评估自动布局约束。在动画中调用它将为更改的约束设置动画。

从外观上看,你想要的是UILabel被约束为与UIView相同的高度/宽度,并且在UIView上有一个IBOutlet用于高度约束。将该IBOutlet上的constant属性更改为所需的高度,然后从动画块内部调用layoutIfNeeded