我有一个UIView
,在UIView
内,我有另一个UIView
,让我们说父母和孩子UIView
。我已将父UIView
的高度和宽度设置为storyboard
中的400,并将子视图constraint
设置为从其超级视图的顶部,左右和底部获取8px边距。
但是当我将父视图的大小更改为200时,子视图的大小保持不变。我在viewdidload
和viewdidappear
CGRect frm = self.mainTimerView.frame;
frm.size.width = size;
frm.size.height = size;
self.mainTimerView.frame = frm;
当我将父视图更改为200时,应根据约束将其自身设置为200-16
高度和宽度。
答案 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)
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