如果无法适应 AutoLayout 中的固有尺寸,请折叠视图

Collapse view if can't fit it's intrinsic size in AutoLayout

我有 UILabelUIButton 内部视图,它们可以有不同的大小,如果仅使用 AutoLayout 无法容纳当前框架中的所有内容,我希望标签完全隐藏。所以基本上我希望它遵循它的固有大小,如果它收缩,它应该直接收缩到零而没有任何中间宽度。所需示例:

相反,我让它缩小并尝试尽可能多地显示:

只用AutoLayout可以吗?如果不是,为什么?

我尝试在标签上添加零宽度约束并将其优先级设置为小于标签的抗压性,但这不起作用。我以为一旦 Autolayout 引擎打破了固有的大小规则,我的零宽度就会被遵循,但似乎我遗漏了什么。

编辑:我会接受在一些 UIView 子类中嵌入标签,这些子类可以检查子视图的固有大小并在代码中进行布局,但我正在寻找一般最干净的解决方案。

You can check out xib source in this gist

我目前的解决方案是将标签嵌入到自定义 UIView 中,在布局期间我直接检查尺寸是否小于固有尺寸:

@implementation AutocollapsibleView

- (void)layoutSubviews {
    UIView *subview = self.subviews.firstObject;
    if (self.bounds.size.width < subview.intrinsicContentSize.width) {
        subview.frame = CGRectZero;
    } else {
        [super layoutSubviews];
    }
}

@end

幸运的是,它可以与 IB_DESIGNABLE marco 一起使用,所以我可以立即在 Interface Builder 中看到结果

我知道你解决了你的问题,但只是为了在自动布局上提供一点颜色:我对 "collapse" 无法满足其固有内容大小的视图有相同的要求,并尝试了相同的零- 宽度约束技术。 Auto Layout documentation:

的这一部分描述了该技术的问题

After solving for the required constraints, Auto Layout tries to solve all the optional constraints in priority order from highest to lowest. If it cannot solve for an optional constraint, it tries to come as close as possible to the desired result, and then moves on to the next constraint.

显然,自动布局宁愿关闭 来满足约束条件,也不愿满足较低优先级的约束条件。这对我来说有点奇怪,因为如果我希望宽度为 >= 100,那么不清楚 90 是 "better" 而不是 80。也就是说,我确信这样做会产生更直观的行为在绝大多数情况下。

不幸的是,这使得在无法满足较高优先级约束的情况下,无法将较低优先级约束用作 "fall-back" 约束。我想 Apple 的观点是,较低优先级约束的唯一目的是在较高优先级约束导致 under 受限布局时使布局更加具体。