以编程方式添加约束时应用程序崩溃
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];
我正在使用视觉格式来定义约束。目标是在超级视图的底部放置一个 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];