父(UIView)大小更改时布局不会更改

时间:2016-07-14 06:38:22

标签: ios objective-c iphone uiview constraints

我有一个UIView,在UIView内,我有另一个UIView,让我们说父母和孩子UIView。我已将父UIView的高度和宽度设置为storyboard中的400,并将子视图constraint设置为从其超级视图的顶部,左右和底部获取8px边距。

但是当我将父视图的大小更改为200时,子视图的大小保持不变。我在viewdidloadviewdidappear

中都尝试过此操作
CGRect frm = self.mainTimerView.frame;
frm.size.width = size;
frm.size.height = size;
self.mainTimerView.frame = frm;

当我将父视图更改为200时,应根据约束将其自身设置为200-16高度和宽度。

5 个答案:

答案 0 :(得分:2)

您不应该使用uiconstraint与使用框架混合。如果您想在使用uiconstraint时更改大小,您应该制作约束的出口,然后更改约束的常量属性。调用{{1}然后你可以得到正确的框架。

layoutIfNeeded

调用@interface ViewController () @property (weak, nonatomic) IBOutlet UIButton *mainTimerView; @property (weak, nonatomic) IBOutlet NSLayoutConstraint *mainTimerViewHeightConstraint; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; [self.view layoutIfNeeded]; NSLog(@"%@",@(self.mainTimerView.frame.size.width)); self.mainTimerViewHeightConstraint.constant = 100; [self.view layoutIfNeeded]; NSLog(@"%@",@(self.mainTimerView.frame.size.height)); } @end 的目的是在绘制之前强制子视图的布局,然后调用layoutIfNeeded。请注意,您可以在viewDidLayoutSubviews中获取正确的框架。换句话说,您可以在调用viewDidLayoutSubviews后获得正确的框架。

viewDidLayoutSubviews

答案 1 :(得分:2)

1)更改height的{​​{1}}约束。

2)调用mainview方法。

3)在layoutIfNeeded上进行。

答案 2 :(得分:0)

您是否尝试在父视图上调用setNeedsLayout?此调用用于请求视图布置其子视图。来自setNeedsLayout's讨论部分:

  

如果要调整视图子视图的布局,请在应用程序的主线程上调用此方法。此方法记录请求并立即返回。由于此方法不强制立即更新,而是等待下一个更新周期,因此可以在更新任何视图之前使用它来使多个视图的布局无效。此行为允许您将所有布局更新合并到一个更新周期,这通常会提高性能。

调用layoutIfNeeded可能是另一种选择。但是根据文档,它会强制立即布局,因此不会提供使用setNeedsLayout获得的整合优势。

layoutIfNeeded文件:

  

立即布置子视图。

答案 3 :(得分:0)

enter image description here

Plz创建父视图的高度约束的IBOutlet。

IBOutlet NSLayoutConstraint *RedViewHeightconstraint;

- (void)viewWillAppear:(BOOL)animated
{
     RedViewHeightconstraint.constant = 500;
}

它适合你

答案 4 :(得分:0)

您只需要创建具有mainTimerView高度和宽度约束的IBOutlet。一旦你这样做,添加以下代码行:

constraintOuterViewHt.constant = 200 constraintOuterViewWidth.constant = 200

你不需要做任何其他事情。 Check screen shot here