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

App crashing while adding constraints programatically

我正在使用视觉格式来定义约束。目标是在超级视图的底部放置一个 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];

更改此行

[self.redView addConstraints:constraint_V];

[self.view addConstraints:constraint_V];

自己解决了。多亏了我..:)

如果你想把视图的宽度应用到红色视图上,你只需要像这样添加一个约束:

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

在视觉约束语法中,| 指的是 parent 视图。你之前那个水平约束的方式,把它加到redview里面,被解释成redview有个child,叫的一样,明明不存在,所以就崩溃了。

垂直约束按原样工作,因为它不引用 parent 视图。

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

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

您需要先将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];