基于子视图约束的超级视图没有增加高度

Posted

技术标签:

【中文标题】基于子视图约束的超级视图没有增加高度【英文标题】:Superview not increasing in height based on the subviews constraint 【发布时间】:2015-07-28 13:22:29 【问题描述】:

我有一个滚动视图和一个单独的 UIView,我在其中放置了一系列文本字段和带有完全占据顶部和底部的约束的标签。我正在尝试根据其子视图约束调整 UIView 的高度,但不会。发生的情况是视图保持其高度并强制其他文本字段折叠或缩小,从而打破约束。

详情

    每个子视图的优先级值: 压缩 = 750 拥抱 = 250 UIView 优先级值: 压缩 = 249 拥抱 = 749 设置为低于其他人。 大多数文本字段都有纵横比限制。这会导致字段调整。 每个子视图之间都有垂直/顶部/底部间距。顶部和底部元素也对视图具有顶部和底部约束。

我的代码上有什么:

-(void)viewDidLayoutSubviews
    [super viewDidLayoutSubviews];
    /* I had to adjust the UIView's width to fill the entire self.view.*/
    if(![contentView isDescendantOfView:detailsScrollView])
        CGRect r = contentView.frame;
        r.size.width = self.view.frame.size.width;
        contentView.frame = r;
        [detailsScrollView addSubview:contentView];
    

截图

景色

这是目前正在发生的事情。在这种情况下,它会强制电子邮件字段缩小。如果我在其上放置一个高度值,它不会缩小,但布局引擎会找到另一个要破坏的元素

编辑:

已解决

也许我只是需要休息一下来梳洗一下。我之前确实尝试过使用约束,但没有运气。然而,多亏了这个建议,我回去设置约束而不是在这个上设置框架并让它最终工作。

解决方案:

-(void)viewDidLoad
    [detailsScrollView addSubview:contentView];

    [contentView setTranslatesAutoresizingMaskIntoConstraints:NO];
    [detailsScrollView setTranslatesAutoresizingMaskIntoConstraints:NO];
    NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(contentView,detailsScrollView);
    NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[contentView]-0-|"
                                                                         options:NSLayoutFormatDirectionLeadingToTrailing                                                                             metrics:nil
                                                                           views:viewsDictionary];
    NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[contentView]-0-|"
                                                                       options:NSLayoutFormatDirectionLeadingToTrailing
                                                                       metrics:nil
                                                                         views:viewsDictionary];
    NSArray *widthConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[contentView(==detailsScrollView)]-0-|" options:0 metrics:nil views:viewsDictionary];


【问题讨论】:

【参考方案1】:

当您使用界面生成器处理UIScrollView 及其子UIView 时。通常在UIScrollView 和它的子元素(在你的情况下是contentView)之间设置一个顶部、底部、左侧和等宽约束。

没有这些限制,另一个选项是设置 UIScrollView 的内容大小。这是在引入约束之前使用 UIScrollView 的方式。

所以,1. 您应该以编程方式添加这些约束。

通过使用约束,不再需要视图框架来调整视图大小。

所以,2. 删除内容视图的框架设置。

我对您在 viewDidLayoutMethod 中设置框架的方式不太满意。如果我要在这里这样做,我会将框架设置从if statement 中取出。

没有if语句的代码如下:

[detailsScrollView addSubview:contentView];

// then set the constraints here after adding the subview.

将此代码放在任何地方,但不要放在 viewDidLayoutSubviews 方法中。这将是一个比在 if 语句中设置框架更大的问题。

注意:原来,如果你要在viewDidLayoutSubviews中设置frame 方法。你应该在所有情况下都这样做。例如对于 if 情况 和其他情况。因为,下次这个方法会 称为视图将响应约束。并失去它的框架。

另一个观察:如果您希望视图响应其子视图约束,为什么需要为其设置框架?对吧?

添加约束后,您可能需要调用方法constraintNeedsUpdate 或其他相关方法。

【讨论】:

感谢您为我指明正确的方向。实际上,我一开始确实尝试过使用约束,但从未让它发挥作用,所以我采用了这种我认为很糟糕的方法。我想我只是需要休息一下,现在我开始工作了。

以上是关于基于子视图约束的超级视图没有增加高度的主要内容,如果未能解决你的问题,请参考以下文章

子视图内的 UIScrollview 高度动态变化

如何使用自动布局动态更改超级视图的高度

自动布局约束没有得到尊重

UITableView 的子视图与 tableView 的高度不同

Autolayout - 使超级视图高度等于子视图高度+常量,其中子视图是 textView

如何使用 AutoLayout 根据父高度调整子视图高度而不添加/删除约束