以编程方式添加约束时应用程序崩溃

时间:2015-03-11 11:07:34

标签: ios objective-c ios7 autolayout

我使用可视化格式来定义约束。目标是在超级视图的底部放置一个UIView,将self.view的高度固定为40,并自动调整宽度。我使用Storyboard完成了这个,但我无法以编程方式执行此操作。这是我写的代码。如果我没有给出固定宽度,应用程序崩溃。它崩溃了以下约束:“H:[redView] |”。如果我将其更改为“H:[redView(100)]”,它可以工作。我不想使用self.bounds并从那里获得宽度。它应该从超视图的左侧,视图的底部和右侧粘住。

请帮忙!

NSDictionary *viewsDictionary = @{@"redView":self.redView};


NSArray *constraint_H = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[redView(40)]"
                                                                options:0
                                                                metrics:nil
                                                                  views:viewsDictionary];

NSArray *constraint_V = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[redView]|"
                                                                options:0
                                                                metrics:nil
                                                                  views:viewsDictionary];

// 3. Define the redView Position
NSArray *constraint_POS_V = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[redView]|"
                                                                    options:0
                                                                    metrics:nil
                                                                      views:viewsDictionary];

NSArray *constraint_POS_H = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[redView]"
                                                                    options:0
                                                                    metrics:nil
                                                                      views:viewsDictionary];
[self.redView addConstraints:constraint_H];
[self.redView addConstraints:constraint_V];



[self.view addConstraints:constraint_POS_H];
[self.view addConstraints:constraint_POS_V];

4 个答案:

答案 0 :(得分:2)

您需要先将redView添加到其超级视图中。 此外,约束将添加到超级视图,而不是redView

[self.view addSubview:self.redView];

// create your constraints here

[self.view addConstraints:@[constraint_H, constraint_V, constraint_POS_V, constraint_POS_H]];
[self.view updateConstraintsIfNeeded];

答案 1 :(得分:1)

在视觉约束语法中,|引用父视图。你之前有这种水平约束的方式,将它添加到redview,它被解释为redview有一个孩子,称为相同,显然不存在,所以它崩溃了。

垂直约束的工作方式是因为它不引用父视图。

您可以稍微更改一下代码,以使约束更清晰:

NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[redView(40)]|" options:0 metrics:nil
                                                                      views:viewsDictionary];

NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[redView]|" options:0 metrics:nil
                                                                      views:viewsDictionary];

[self.view addConstraints:horizontalConstraints];
[self.view addConstraints:verticalConstraints];

请记住,您应该始终将UIView的约束添加到superview

答案 2 :(得分:0)

更改此行

[self.redView addConstraints:constraint_V];

[self.view addConstraints:constraint_V];

解决了自己。谢谢我...... :)

答案 3 :(得分:0)

如果你想获取视图的宽度并将其应用于红色视图,你只需要添加一个类似的约束:

NSArray *constraint_POS_H = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[redView]-|"
                                                                options:0
                                                                metrics:nil
                                                                  views:viewsDictionary];