自动布局横向和纵向模式的不同约束
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...
并在那里进行约束更改,更改将神奇地与旋转相匹配。
我使用有助于以编程方式添加约束的 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...
并在那里进行约束更改,更改将神奇地与旋转相匹配。