Autolayout从列到行的约束

时间:2014-07-14 03:22:16

标签: ios swift autolayout

简化我的例子,假设我在基本视图控制器上有三个正方形。在纵向模式中,这些正方形堆叠在彼此之上,并且具有20个左右的垂直间距。所以像这样:

X
X
X

在横向模式下,第3个X会被切断,所以我想让它看起来像这样:

XXX

换句话说,让底部的那些出现并且位于顶部的旁边(每个之间有20个左右的水平间距)。

使用自动布局,约束和大小类来执行此类操作的方法是什么?我是否以编程方式删除并重新添加约束?只是从整体的角度好奇如何实现这样的目标。

谢谢!

1 个答案:

答案 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];


        }

    }