使用iOS自动布局在子视图控制器及其父视图之间建立约束

bea*_*ock 7 uiviewcontroller ios autolayout

在我的根视图控制器中,我将子视图控制器的视图添加为子视图,如下所示:

ChildViewController *cvc = [[ChildViewController alloc] init];
[self addChildViewController:cvc];
[self.view addSubview:cvc.view];
[cvc didMoveToParentViewController:self];
Run Code Online (Sandbox Code Playgroud)

我现在想使用NSLayoutConstraint在父视图(self.view)中定位cvc.view,这样cvc.view定位在父视图底部上方25个点.我的理解是以下应该有效:

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];
Run Code Online (Sandbox Code Playgroud)

但是约束在运行时失败了.我认为最初可能是子视图中的自动调整掩码导致了问题(并且在自动布局上遵循WWDC 2012简介视频),所以我设置了[childview setTranslatesAutoresizingMaskIntoConstraints:NO],但是子视图根本无法显示.

我究竟做错了什么?

Diz*_*iet 3

我不确定,但以下应该有效,或者非常类似:

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];
Run Code Online (Sandbox Code Playgroud)

如果不确定您实际上正在设置子视图的大小,例如:

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];
Run Code Online (Sandbox Code Playgroud)

比如说,让它填充视图的宽度。或者:

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];
Run Code Online (Sandbox Code Playgroud)

这意味着像 childview 这样的东西应该有一个大于 100 但小于 304 的宽度,并且与 superview 的默认边距。请注意,我不知道上述约束是否实际上有意义(例如,它可能总是为您提供 304 宽度的子视图,因为这会留下默认边距),但它只是一个示例。