如果在AutoLayout中无法使其符合内在大小,则折叠视图

时间:2017-03-27 04:24:05

标签: ios autolayout intrinsic-content-size

我的UILabelUIButton内部视图可以有不同的大小,如果标签只使用AutoLayout不能适应当前帧内的所有内容,我希望标签完全隐藏。所以基本上我希望它遵循它的内在大小,如果它缩小,它应该直接收缩到零而没有任何中间宽度。期望的例子:

example non-collapsed desired collapsed view

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

enter image description here

是否可以仅使用AutoLayout?如果没有,为什么?

我尝试在标签上添加零宽度约束,并将其优先级设置为小于标签的抗压缩性,但这不起作用。我认为,一旦Autolayout引擎破坏了内在尺寸规则,我的零宽度将被跟随,但似乎我错过了一些东西。

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

You can check out xib source in this gist

2 个答案:

答案 0 :(得分:1)

我目前的解决方案是将标签嵌入到自定义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中看到结果

答案 1 :(得分:1)

我知道你解决了你的问题,但只是为自动布局提供了一点颜色:我有同样的要求“折叠”一个不能满足它的内在内容大小的视图并尝试了相同的零宽度约束技术。 Auto Layout documentation的这一部分描述了该技术的问题:

  

在求解所需约束后,自动布局尝试按优先级顺序从最高到最低解决所有可选约束。如果它无法求解可选约束,它会尽可能接近所需结果,然后继续下一个约束。

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

不幸的是,这使得在不能满足更高优先级约束的情况下,不可能将较低优先级约束用作“后退”约束。我认为Apple的观点是,较低优先级约束的唯一目的是在较高优先级约束导致 约束布局时使布局更具体。