繁体   English   中英

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

[英]Layout not changing when parent (UIView) size is changed

我有一个UIView并且在此UIView有另一个UIView ,可以说父级和子级UIView 我已在storyboard提要中将父UIView高度和宽度设置为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

请勿将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)更改主mainviewheight约束。

2)调用layoutIfNeeded方法。

3)在viewDidAppear

您是否尝试过在父视图上调用setNeedsLayout 该调用用于要求视图布局其子视图。 setNeedsLayout's讨论部分中:

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

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

layoutIfNeeded文档:

立即布置子视图。

在此处输入图片说明

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

IBOutlet NSLayoutConstraint *RedViewHeightconstraint;

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

它会为你工作

您只需要创建IBOutlet即可限制mainTimerView的高度和宽度。 完成后,添加以下代码行:

constraintOuterViewHt.constant = 200约束OuterViewWidth.constant = 200

您无需执行其他任何操作。 检查屏幕截图在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM