我有一个内置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,因为我有一个导航栏和基于标签栏的应用程序。
答案 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
。