iOS Auto Layout 的布局时机
这段代码无效
[self setupScrollView];
self.thirdChildVC = [[CreateYugangTab1ViewController alloc] init];
[self.thirdChildVC.view setFrame:self.scrollView.bounds];
[self.scrollView addSubview:self.thirdChildVC.view];
原因:
1. Auto Layout 的布局时机
在 iOS 中,视图的布局过程分为以下几个阶段:
(1) viewDidLoad
视图控制器的视图已经加载到内存中,但此时视图的布局尚未完成。
这意味着视图的 frame 和 bounds 可能还未确定(尤其是当使用 Auto Layout 时)。
在这个阶段,直接设置子视图的 frame 或访问父视图的 bounds 可能会导致不准确的结果。
(2) viewWillAppear
视图即将显示,但此时布局仍然可能未完全确定。
系统可能会在此阶段调整约束或重新计算布局。
(3) viewWillLayoutSubviews 和 viewDidLayoutSubviews
关键阶段:这是系统实际执行布局的地方。
在此阶段,Auto Layout 根据约束计算出视图的最终 frame 和 bounds。
如果需要动态调整布局(例如根据父视图的尺寸设置子视图的尺寸),应该在这个阶段进行操作。
(4) layoutSubviews
每个视图都会调用此方法来更新其子视图的布局。
如果您自定义了一个视图类,可以在 layoutSubviews 中手动调整子视图的布局。
正确做法:
self.thirdChildVC = [[CreateYugangTab1ViewController alloc] init];
[self addChildViewController:self.thirdChildVC];
[self.scrollView addSubview:self.thirdChildVC.view];
[self.thirdChildVC didMoveToParentViewController:self];
self.thirdChildVC.view.translatesAutoresizingMaskIntoConstraints = NO;
// self.thirdChildVC.view.backgroundColor = [UIColor redColor];
// Add constraints for the child view
[NSLayoutConstraint activateConstraints:@[
[self.thirdChildVC.view.leadingAnchor constraintEqualToAnchor:self.scrollView.leadingAnchor],
[self.thirdChildVC.view.trailingAnchor constraintEqualToAnchor:self.scrollView.trailingAnchor],
[self.thirdChildVC.view.topAnchor constraintEqualToAnchor:self.scrollView.topAnchor],
// [self.thirdChildVC.view.bottomAnchor constraintEqualToAnchor:self.scrollView.bottomAnchor],
[self.thirdChildVC.view.widthAnchor constraintEqualToAnchor:self.scrollView.widthAnchor], // 确保宽度一致
]];
[self.thirdChildVC.view.heightAnchor constraintEqualToAnchor:self.scrollView.heightAnchor].active = YES;
标签:ios
加入收藏