[英]Layout not changing when parent (UIView) size is changed
我有一个UIView
并且在此UIView
有另一个UIView
,可以说父级和子级UIView
。 我已在storyboard
提要中将父UIView
高度和宽度设置为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
。
请勿将uiconstraint与using frame混合使用。如果要在使用uiconstraint时更改大小,则应制作约束的出口,然后更改约束的constant属性。 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
之后获得正确的框架。
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
NSLog(@"%@",NSStringFromCGRect(self.mainTimerView.frame));
}
1)更改主mainview
的height
约束。
2)调用layoutIfNeeded
方法。
3)在viewDidAppear
。
您是否尝试过在父视图上调用setNeedsLayout
? 该调用用于要求视图布局其子视图。 在setNeedsLayout's
讨论部分中:
若要调整视图的子视图的布局,请在应用程序的主线程上调用此方法。 此方法记录请求并立即返回。 因为此方法不会强制立即更新,而是等待下一个更新周期,所以您可以使用它在更新任何视图之前使多个视图的布局无效。 此行为使您可以将所有布局更新合并到一个更新周期,这通常可以提高性能。
调用layoutIfNeeded
可能是另一个选择。 但是根据文档,它强制执行立即布局,因此不能提供使用setNeedsLayout
获得的合并优势。
layoutIfNeeded
文档:
立即布置子视图。
您只需要创建IBOutlet即可限制mainTimerView的高度和宽度。 完成后,添加以下代码行:
constraintOuterViewHt.constant = 200约束OuterViewWidth.constant = 200
您无需执行其他任何操作。 检查屏幕截图在这里
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.