在我的根 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/