Ios 带有constraintWithItem与带有VisualFormat的Constraints的自动布局问题

Ios 带有constraintWithItem与带有VisualFormat的Constraints的自动布局问题,ios,objective-c,cocoa-touch,autolayout,Ios,Objective C,Cocoa Touch,Autolayout,我有一个非常简单的UI,可以很好地使用constraintsWithVisualFormat,我尝试用constraintWithItem替换它,但由于某种原因它不起作用。我不知道这里怎么了 我理解的字面意思是 在垂直方向上,contentView应该填充其视图的整个高度 没有填充的superview 新代码指定高度,但不指定位置。视觉格式规范没有说明项目的高度,而是将视图的上边缘和下边缘相互固定 不要为高度创建约束,而是创建两个约束,一个为上边距,一个为下边距,将contentView的边缘固

我有一个非常简单的UI,可以很好地使用constraintsWithVisualFormat,我尝试用constraintWithItem替换它,但由于某种原因它不起作用。我不知道这里怎么了

我理解的字面意思是

在垂直方向上,contentView应该填充其视图的整个高度 没有填充的superview


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


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

您应该将其从高度更改为顶部。并在底部添加类似的约束

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

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];

我还有一个水平约束H:|[contentView]|,这意味着我也需要左和右?我想我在翻译vFly时遇到了问题,水平视图也是如此。所以真正的问题可能是V:|[contentView]|和H:|[contentView]|
V:|[contentView]|
的直译是什么意思是“将contentView捕捉到超级视图的顶部和底部”
H:|[contentView]|
的意思是“将contentView捕捉到其superview的前导和尾随。如果将“NSLayoutFormatDirectionLeftToRight”设置为选项,则前导和尾随将被左右替换。@AtifImran如果您确实想知道视觉格式是如何转换的,可以在约束数组上迭代。此数组包含NSLayoutConstraint对象,然后可以打印出其debugDescription。
NSLayoutConstraint *bottomConstraint =
[NSLayoutConstraint constraintWithItem:contentView
                             attribute:NSLayoutAttributeBottom
                             relatedBy:NSLayoutRelationEqual
                                toItem:containerView
                             attribute:NSLayoutAttributeBottom
                            multiplier:1.0
                              constant:0];
[containerView addConstraint:bottomConstraint];