简化我的例子,假设我在基本视图控制器上有三个正方形。在纵向模式中,这些正方形堆叠在彼此之上,并且具有20个左右的垂直间距。所以像这样:
X
X
X
在横向模式下,第3个X会被切断,所以我想让它看起来像这样:
XXX
换句话说,让底部的那些出现并且位于顶部的旁边(每个之间有20个左右的水平间距)。
使用自动布局,约束和大小类来执行此类操作的方法是什么?我是否以编程方式删除并重新添加约束?只是从整体的角度好奇如何实现这样的目标。
谢谢!
答案 0 :(得分:0)
您可以使用NSLayoutConstraint的优先级
自动布局设置具有较高优先级约束的视图。
for Portrait
将方形视图的前导和顶部空间约束的优先级设置为低值(750或低于1000)。默认优先级值为1000.
在Interface Builder中,您可以在“属性”检查器中设置优先级。
for Landscape
在横向模式的代码中创建约束。
约束应该比肖像具有更高的优先级。将约束保留在数组中,并在UIViewController的viewWillLayoutSubviews
方法中添加或删除约束。
以下测试代码。
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIView *view1; // square 1
@property (weak, nonatomic) IBOutlet UIView *view2; // square 2
@property (weak, nonatomic) IBOutlet UIView *view3; // square 3
@end
@implementation ViewController{
NSMutableArray *_constraintsList;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
_constraintsList = [NSMutableArray new];
// constraints for Landscape mode
// this constraints has 1000 priority. (default value)
// please modify offset value (20 or 40) to match your case.
NSDictionary *views = @{@"view1": self.view1, @"view2": self.view2,@"view3": self.view3};
[_constraintsList addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[view1]-20-[view2]-20-[view3]"
options:0 metrics:nil
views:views]];
[_constraintsList addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-40-[view2]" options:0 metrics:nil views:views]];
[_constraintsList addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-40-[view3]" options:0 metrics:nil views:views]];
}
-(void)viewWillLayoutSubviews{
[super viewWillLayoutSubviews];
UIInterfaceOrientation currentOrientation = [UIApplication sharedApplication].statusBarOrientation;
if(currentOrientation == UIInterfaceOrientationPortrait){
// in portrait mode.
// new constraints is not necessary.
[self.view removeConstraints:_constraintsList];
}else if(currentOrientation == UIInterfaceOrientationLandscapeLeft){
// for landscape mode
// add new constraints. then auto layout adjust view to fit new higher constraints
[self.view addConstraints:_constraintsList];
}
}