ios - 设置自动布局约束后, subview 没有宽度或高度

标签 ios autolayout

我正在尝试在其父 View 中布局 subview Controller 的 View 。 subview Controller 的 View ( subview )必须跨越整个父 View ,但 14 像素的上边距除外。

在我看来,下面的代码应该足以实现这一点,但是虽然 subview 的原点是正确的 (0, 14),但它的宽度和高度都是 0。

我正在使用以下代码添加 subview Controller 并设置其 View 约束:

[self.view addSubview:_infoController.view];
[self addChildViewController:_infoController];
[_infoController didMoveToParentViewController:self];

UIView *infoView = _infoController.view;
NSDictionary *viewsDict = NSDictionaryOfVariableBindings(infoView);
NSArray *heightConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-14-[infoView]|" options:0 metrics:nil views:viewsDict];
NSArray *widthConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[infoView]|" options:0 metrics:nil views:viewsDict];

NSMutableArray *constraints = [NSMutableArray array];
[constraints addObject:[heightConstraints objectAtIndex:0]];
[constraints addObject:[widthConstraints objectAtIndex:0]];

[infoView setTranslatesAutoresizingMaskIntoConstraints:NO];

[self.view addConstraints:constraints];
[self.view setNeedsUpdateConstraints];

这会产生一个具有原点 (0, 14) 和大小 (0, 0) 的 View 。

或者,当我不禁用“translatesAutoresizingMaskIntoConstraints”属性时, View 确实具有有效的原点和大小,但随后存在约束冲突,并且 14px 上边距被丢弃。显示的冲突如下:
"<NSLayoutConstraint:0xba6bad0 V:|-(14)-[UIView:0xba6aec0]   (Names: '|':UIView:0xa3b9200 )>",
"<NSAutoresizingMaskLayoutConstraint:0xb8b4db0 h=--& v=--& V:[UIView:0xba6aec0(480)]>",
"<NSAutoresizingMaskLayoutConstraint:0xb8b4180 h=--& v=--& UIView:0xba6aec0.midY == + 240>"


Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0xba6bad0 V:|-(14)-[UIView:0xba6aec0]   (Names: '|':UIView:0xa3b9200 )>

有任何想法吗?

最佳答案

constraintsWithVisualFormat:options:metrics:views:返回 NSArray因为某种原因。原因是视觉格式通常定义多个约束。

但是除了每种视觉格式中的第一个之外,您正在抛弃所有约束。您只需将每种视觉格式的第一个约束添加到 View 中。很可能您没有指定足够的约束来定义完整的布局。

您的代码应如下所示

NSArray *heightConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-14-[infoView]|" options:0 metrics:nil views:viewsDict];
[self.view addConstraints:heightConstraints];
NSArray *widthConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[infoView]|" options:0 metrics:nil views:viewsDict];
[self.view addConstraints:widthConstraints];

您不需要 constraints大批。

关于ios - 设置自动布局约束后, subview 没有宽度或高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18631180/

相关文章:

ios - 是否有可能不在 iOS 上推送/呈现预览 Controller

ios - UIPanGestureRecognizer 冲突

ios - 使用ARKit检测手机移动轨迹和距离

ios - 使用 uiscrollview 水平滚动完全通过 Storyboard和自动布局

ios - 以编程方式将 stackview 与屏幕顶部对齐,不使用硬编码的 CGRect 和最小数量的约束

iOS:自动布局与在 iOS 7 和 iOS 8 上对 subview 应用约束的差异

具有自动布局的 iOS UITableViewCell 水平滚动 subview

ios - 当我们尝试使用 Appium 脚本导航到 iPhone safari 浏览器中的框架时,获取异常阻止了具有原点的框架

ios - 在ios中将json转换成字典

ios - 自动布局 - 中间有 5 个按钮