自动布局横向和纵向模式的不同约束

Autolayout different constraints for landscape and portrait mode

我使用有助于以编程方式添加约束的 Masonry 库。 很好,但现在我遇到了一个问题,即在用户将设备从横向旋转为纵向后,我需要卸载并添加新的约束。我尝试了 "brutal" 解决方案,它确实改变了约束,但是,在几分之一秒内我可以看到 "old" 约束。用户旋转设备后是否有简单的方法 add/remove 约束?这就是我尝试过的方法(它有效,但正如我在上面描述的那样,在几分之一秒内我可以看到 "old" 帧):

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{

    if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation)){
        [bottomRight mas_updateConstraints:^(MASConstraintMaker *make) {

            NSLog(@"We are on landscape");
            make.top.equalTo(upperRight.mas_bottom).with.offset(20);
            make.left.equalTo(self.view.mas_centerX).with.offset(20);
            make.right.equalTo(bottomRightRight.mas_left).with.offset(-20);
            make.bottom.equalTo(self.view.mas_bottom).with.offset(-100);

            make.width.equalTo(bottomRightRight);

        }]; }
    else {
        NSLog(@"Swapped");
        [bottomRight mas_updateConstraints:^(MASConstraintMaker *make) {

            make.top.equalTo(upperRight.mas_bottom).with.offset(200);
            make.left.equalTo(self.view.mas_centerX).with.offset(200);
            make.right.equalTo(bottomRightRight.mas_left).with.offset(-200);
            make.bottom.equalTo(self.view.mas_bottom).with.offset(-200);

            make.width.equalTo(bottomRightRight);

        }];

    }

}

i need to uninstall and add new constraints after user rotate device from landscape to portrait. I tried rather "brutal" solution, it did change constraints, but, in fraction of second i could see "old" constraints.

但这就是问题所在:您要在用户旋转设备后更改约束。所以 是导致你不喜欢的现象的人,即这种情况发生在 旋转结束后的几分之一秒.

正确的解决方案是在用户旋转设备之前更改约束。如果这样做,约束的变化将神奇地动画化以匹配旋转并且变化将看起来绝对无缝。

例如,如果这是一个 iPhone 应用程序,您可以实现视图控制器的 willTransitionToTraitCollection... 并在那里进行约束更改,更改将神奇地与旋转相匹配。