【问题标题】:Subview has no width or height after setting auto layout constraints设置自动布局约束后,子视图没有宽度或高度
【发布时间】:2013-09-05 17:19:06
【问题描述】:

我正在尝试在其父视图中布局子视图控制器的视图。子视图控制器的视图(子视图)必须跨越整个父视图,但 14 像素的上边距除外。

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

我正在使用以下代码添加子视图控制器并设置其视图约束:

[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) 的视图。

或者,当我不禁用“translatesAutoresizingMaskIntoConstraints”属性时,视图确实具有有效的原点和大小,但随后存在约束冲突,并且 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 )>

有什么想法吗?

【问题讨论】:

  • 当您DO 禁用该属性时会发生什么?那是你应该做的。您还需要将约束添加到 superview 而不是视图本身。
  • 这不是我在我的代码中所做的吗?我调用 [infoView setTranslatesAutoresizingMaskIntoConstraints:NO] 并将约束添加到 self.view 而不是 infoView (这是子视图)。
  • 哦,你是对的,但你说“当我不禁用时”所以我很困惑。那么上面的代码会发生这种情况吗?
  • 正确。为了更清楚,我重新表述了我的问题。

标签: ios autolayout


【解决方案1】:

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

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

您的代码应如下所示

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 数组。

【讨论】:

  • 谢谢。就是这样!我没有意识到返回了多个约束。
  • 干得好!我完全错过了!
【解决方案2】:

试试这个:

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

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

[infoView setTranslatesAutoresizingMaskIntoConstraints:NO];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 2020-01-18
    • 1970-01-01
    • 2014-10-21
    • 2015-08-30
    • 2014-06-25
    • 1970-01-01
    • 2019-05-18
    相关资源
    最近更新 更多