当我的应用程序在分屏模式下加载时,为什么自动布局约束没有正确安装?

Why are auto layout constraints not properly installed when my app loads in split screen?

如果我的应用加载全屏,则自动布局约束在 iPad 上适用。

当我进入分屏时,一切都按预期发生了变化。

分屏尺寸变化时,调用方法- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator

但是,如果我在分屏模式下加载应用程序,约束从一开始就不正确。

此外,当调整为全屏以外的任何其他内容时,不会调用 - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator

这是演示该问题的视频。 https://www.youtube.com/watch?v=ksHt8pIz0b0

我正在使用 Masonry 安装约束,如下所示:

    [labelLeft remakeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self.view.left);
        make.centerY.equalTo(self.view.centerY);
        make.width.equalTo(150);
        make.height.equalTo(30);
    }];

    [labelRight remakeConstraints:^(MASConstraintMaker *make) {
        make.right.equalTo(self.view.right);
        make.centerY.equalTo(self.view.centerY);
        make.width.equalTo(150);
        make.height.equalTo(30);
    }];


    [labelTop remakeConstraints:^(MASConstraintMaker *make) {
        make.centerX.equalTo(self.view.centerX);
        make.top.equalTo(self.view.top);
        make.width.equalTo(150);
        make.height.equalTo(30);
    }];


    [labelBottom remakeConstraints:^(MASConstraintMaker *make) {
        make.centerX.equalTo(self.view.centerX);
        make.bottom.equalTo(self.view.bottom);
        make.width.equalTo(150);
        make.height.equalTo(30);
    }];

在此先感谢您的帮助!

更新: 我构建了一个新的应用程序并安装了相同的约束。当我 运行 相同的测试场景时,它在分屏模式下加载正常。 但是,在测试场景中,在分屏加载后更改屏幕尺寸时正确调用了 viewWillTransitionToSize:

关于在分屏加载时可能会阻止在我的应用程序中调用它的任何想法?该应用程序很大,所以我正在寻找一般的搜索方向。

在创建了一个仅包含我提到的约束的空应用程序并发现它按预期工作后,我意识到我的代码中肯定有某些东西破坏了预期的行为。

原来是AppDelegate中的这一行

self.window.frame = [[UIScreen mainScreen] bounds];

这一定是在我使用 AutoLayout 之前的早期。

我怀疑是否有人会遇到与我相同的问题,但以防万一,一定要注意类似的问题!