如何使用 Autolayout 调整我的超级视图大小以匹配其子视图的大小?

Posted

技术标签:

【中文标题】如何使用 Autolayout 调整我的超级视图大小以匹配其子视图的大小?【英文标题】:How do I make my superview resize to match the size of its subviews with Autolayout? 【发布时间】:2013-08-05 15:04:18 【问题描述】:

我有一个 UIView(“superview”),它有几个 UILabels 作为子视图,在 Interface Builder 中设置。我已经打开了自动布局以正确地将列表中的所有标签一个接一个地隔开。这很好用。

我现在要做的是让我的 Superview 垂直调整大小以匹配我所有标签的高度,但我不知道该怎么做。

这是如何工作的?

【问题讨论】:

【参考方案1】:

这是一个使用视觉布局的示例...所以忽略 translatesAutoresizingMaskIntoConstraints 业务。

这依赖于容器视图没有任何高度限制的事实,并且它似乎依赖于视图之间的间距。系统将调整视图的大小以匹配子视图的要求。

- (instancetype)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 
        self.backgroundColor = [UIColor redColor];

        [self setTranslatesAutoresizingMaskIntoConstraints:NO];

        _labelOne = [[UILabel alloc] init];
        _labelOne.text = @"Banana";
        _labelOne.backgroundColor = [UIColor blueColor];
        [_labelOne setTranslatesAutoresizingMaskIntoConstraints:NO];

        _labelTwo = [[UILabel alloc] init];
        _labelTwo.text = @"Dinosaur";
        _labelTwo.backgroundColor = [UIColor yellowColor];
        [_labelTwo setTranslatesAutoresizingMaskIntoConstraints:NO];

        [self addSubview:_labelOne];
        [self addSubview:_labelTwo];

        NSDictionary *views = NSDictionaryOfVariableBindings(_labelOne, _labelTwo);
        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_labelOne]|" options:0 metrics:nil views:views]];
        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_labelTwo]|" options:0 metrics:nil views:views]];
        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-10-[_labelOne(30)]-15-[_labelTwo(30)]-10-|" options:0 metrics:nil views:views]];
    
    return self;

【讨论】:

嗯,这很好,但问题是标签高度可以改变,因为它们启用了多行(我想我应该在我的问题中提到这一点)。仍在努力解决这项工作,同时保持底部填充。 您可以更改我在其中设置的固定“30”高度,例如 >=30,这至少可以扩展视图。不能 100% 确定如何提前触发 sizeToFit。【参考方案2】:

我知道基本的想法是通过确保每个子视图的垂直维度上的内容压缩阻力和内容拥抱约束不会被更高优先级的约束覆盖,让子视图的内在内容大小驱动超级视图的高度您已添加。

【讨论】:

【参考方案3】:

尝试使用 UIView 方法sizeToFit

【讨论】:

不知道,但我想是的。试试看,让我们知道:)

以上是关于如何使用 Autolayout 调整我的超级视图大小以匹配其子视图的大小?的主要内容,如果未能解决你的问题,请参考以下文章

使用 AutoLayout 动态布局滚动视图 contentSize

使用 Autolayout 和通用故事板超级视图是否全屏?

如何使用 Cocoa Autolayout 根据优先级调整两个子视图的大小?

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

如何将 AutoLayout 约束的常量设置为超级视图的百分比?

UIStackView 内的视图未使用 AutoLayout 调整大小