使用constraintWithItem VS constraintsWithVisualFormat的Autolayout问题

时间:2015-10-07 09:03:32

标签: ios objective-c cocoa-touch autolayout

我有非常简单的UI,可以很好地使用constraintsWithVisualFormat,我试图用constraintWithItem替换它,并且由于某种原因它无效。我不知道这里有什么问题。

我理解的字面句是

  

垂直地,contentView应该填充其整个高度   超级视图没有填充。

NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(contentView);
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView]|"
                                                               options:0
                                                               metrics:nil
                                                                 views:viewsDictionary];
[containerView addConstraints:constraints];


//Below is my alternative code NOT working, but this should work too?
NSLayoutConstraint *constraints =
[NSLayoutConstraint constraintWithItem:contentView
                             attribute:NSLayoutAttributeHeight
                             relatedBy:NSLayoutRelationEqual
                                toItem:containerView
                             attribute:NSLayoutAttributeHeight
                            multiplier:1.0
                              constant:0];
[containerView addConstraint:constraints];

3 个答案:

答案 0 :(得分:1)

您的新代码指定高度,但不指定位置。视觉格式规范没有说明项目的高度,而是将视图的顶部和底部边缘相互固定。

不是创建高度约束,而是创建两个约束,一个用于上边距,一个用于下边距,将contentView的边缘固定到containerView。

答案 1 :(得分:1)

您应该从高处更改为顶部。并且还向底部添加了类似的约束。

NSLayoutConstraint *constraints =
[NSLayoutConstraint constraintWithItem:contentView
                             attribute:NSLayoutAttributeTop
                             relatedBy:NSLayoutRelationEqual
                                toItem:containerView
                             attribute:NSLayoutAttributeTop
                            multiplier:1.0
                              constant:0];
[containerView addConstraint:constraints];

答案 2 :(得分:0)

这种视觉格式:

NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(contentView);
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView]|"
                                                               options:0
                                                               metrics:nil
                                                                 views:viewsDictionary];
[containerView addConstraints:constraints];

应替换为两个约束:

NSLayoutConstraint *topConstraint =
[NSLayoutConstraint constraintWithItem:contentView
                             attribute:NSLayoutAttributeTop
                             relatedBy:NSLayoutRelationEqual
                                toItem:containerView
                             attribute:NSLayoutAttributeTop
                            multiplier:1.0
                              constant:0];
[containerView addConstraint: topConstraint];

NSLayoutConstraint *bottomConstraint =
[NSLayoutConstraint constraintWithItem:contentView
                             attribute:NSLayoutAttributeBottom
                             relatedBy:NSLayoutRelationEqual
                                toItem:containerView
                             attribute:NSLayoutAttributeBottom
                            multiplier:1.0
                              constant:0];
[containerView addConstraint:bottomConstraint];