在我的根 View Controller 中,我将 subview Controller 的 View 添加为 subview ,如下所示:

ChildViewController *cvc = [[ChildViewController alloc] init];
[self addChildViewController:cvc];
[self.view addSubview:cvc.view];
[cvc didMoveToParentViewController:self];

现在我想使用NSLayoutConstraint将cvc.view放置在父 View (self.view)内,以便cvc.view在父 View 底部上方定位25 pts。我的理解是以下应该起作用:
UIView *superview = self.view;
UIView *childview = cvc.view;
NSLayoutConstraint *cn =
    [NSLayoutConstraint withItem:childview
      attribute:NSLayoutAttributeBottom
      relatedBy:NSLayoutRelationEqual
      toItem:superview attribute:NSLayoutAttributeBottom
      multiplier: 1.0
      constant: -25.0];
[superview addConstraint: cn];

但是约束在运行时失败。我最初以为 subview 中的自动调整大小蒙版可能会引起问题(并遵循WWDC 2012 Intro视频中的自动布局),所以我设置了[childview setTranslatesAutoresizingMaskIntoConstraints:NO],但随后 subview 只是无法显示。

我究竟做错了什么?

最佳答案

我不确定,但是以下方法应该可以工作,或者非常类似:

UIView *superview = self.view;
UIView *childview = cvc.view;
NSDictionary *constrainedViews = NSDictionaryOfVariableBindings(childview);
NSArray *constraints =
[superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[childview]-25-|"
                                                                  options:0
                                                                  metrics:nil
                                                                    views:constrainedViews];

如果不能确保您确实为 subview 设置了大小,则类似于:
UIView *superview = self.view;
UIView *childview = cvc.view;
NSDictionary *constrainedViews = NSDictionaryOfVariableBindings(childview);
NSArray *constraints =
[superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[childview]|"
                                                                  options:0
                                                                  metrics:nil
                                                                    views:constrainedViews];

说,使其填充 View 的宽度。或者:
UIView *superview = self.view;
UIView *childview = cvc.view;
NSDictionary *constrainedViews = NSDictionaryOfVariableBindings(childview);
NSArray *constraints =
[superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[childview(>100,<304)]-|"
                                                                  options:0
                                                                  metrics:nil
                                                                    views:constrainedViews];

这意味着像childview之类的宽度应大于100但小于304,并且具有 super View 的默认边距。请注意,我不知道上面的约束是否真的有意义(例如,它可能总是给您304宽度的 subview ,因为这会保留默认的边距),但这只是一个示例。

关于ios - 使用iOS自动布局在 subview Controller 及其父 View 之间建立约束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13200525/

10-13 09:27