Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从列到行的自动布局约束_Ios_Swift_Autolayout - Fatal编程技术网

Ios 从列到行的自动布局约束

Ios 从列到行的自动布局约束,ios,swift,autolayout,Ios,Swift,Autolayout,简化我的示例,假设我在基本视图控制器上有三个正方形。在纵向模式下,这些正方形相互堆叠,垂直间距约为20像素。比如说: X X X 在横向模式下,第三个X将被切断,因此我想让它看起来像这样: XXX 换言之,让底部的一个向上,并紧挨着顶部的一个(每个像素之间有20个左右的水平间距) 使用自动布局、约束和大小类执行类似操作的方法是什么?我是否以编程方式删除并重新添加约束?从整体角度来看,我很好奇如何实现这样的目标 谢谢 您可以使用NSLayoutConstraint的优先级 具有较高约束优先级的自动

简化我的示例,假设我在基本视图控制器上有三个正方形。在纵向模式下,这些正方形相互堆叠,垂直间距约为20像素。比如说:

X
X
X

在横向模式下,第三个X将被切断,因此我想让它看起来像这样:

XXX

换言之,让底部的一个向上,并紧挨着顶部的一个(每个像素之间有20个左右的水平间距)

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


谢谢

您可以使用NSLayoutConstraint的优先级

具有较高约束优先级的自动布局集视图

用于肖像

将方形视图的前导空间和顶部空间约束的优先级设置为低值(750或低于1000)。默认优先级值为1000

在界面生成器中,可以在属性检查器中设置优先级

适用于景观

在横向模式的代码中创建约束

约束应具有比肖像更高的优先级。将约束保留在数组中,并在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];


        }

    }

看看我这里的答案,很有意思-所以我们的想法是设置/约束它通常应该看起来的方式,优先级较低,然后如果它处于横向模式,则基本上添加具有较高优先级的新约束,并且它应该遵守新的约束?我可能应该查一下,"V:|-40-[view2]有什么作用??我想象V代表垂直,第一个元素和第二个元素之间的间距是40像素吗?是的。你完全知道我说了什么@“v:|-40-[view2]”只是示例代码。我只想告诉你们,你们需要添加垂直约束的平方2和平方3。最好将垂直约束平方2和平方3设置为等于平方1的垂直中心。谢谢-嘿,只是出于好奇,(不是想说某人更正确,等等,只是对你的意见感兴趣)你觉得这家伙做了什么?他只使用故事板就成功了:源帖子来自:你会说这是一个不太可靠的解决方案吗?或者只是实现我所说的另一种方式?谢谢你的帮助!我忘了这个@v:|-40-[view2]。v表示垂直表示视图2的超视图。在我的测试用例中,它是uiviewcontroller的视图。我在interface Builder的viewcontroller视图中添加了方形视图。40表示view2的superview和view2之间的y偏移。@user3379785我已经检查了您链接的解决方案。我认为这是一个很好的解决方案,但要理解程序员的意图有点困难。在您的例子中,正方形之间的关系对于绘制视图非常重要。计算方块位置时,不需要知道横向模式的屏幕大小。但在故事板的情况下,你们应该知道横向模式的大小来计算它。请参考,使用优先级的解决方案对于在“自动布局”中设置视图动画也很有用。