日志

iOS Auto Layout 的布局时机

发表于 2025-04-11 zhangxinwei
  这段代码无效
[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
加入收藏

会员评论登录

评论


关于汉字公式

回到首页

后台数据库查询耗时: 2439 微秒

@2015-2023 最精简的解释,来自于自然、来自于生活

豫ICP备2023033703号-1