translatesAutoresizingMaskIntoConstraints和UILabel

时间:2014-08-06 14:06:18

标签: ios objective-c uiview uilabel autolayout

我创建了这个简单的自定义UIView

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        internalView = [UIView new];
        [self addSubview:internalView];
        internalView.backgroundColor = [UIColor whiteColor];

        sublabel = [UILabel new];
        sublabel.text = @"test";
        sublabel.backgroundColor = [[UIColor yellowColor] colorWithAlphaComponent:0.4];
        sublabel.textAlignment = NSTextAlignmentCenter;
        sublabel.translatesAutoresizingMaskIntoConstraints = NO;
        [internalView addSubview:sublabel];
    }
    return self;
}

- (void)layoutSubviews
{
    [super layoutSubviews];

    [internalView setFrame:self.bounds];
    [sublabel setFrame:internalView.bounds];
}

@end

视图用于xib,其中定义了4个约束:

XIB

约束与顶部,尾随,前导和高度有关。

自定义视图的视图层次结构是自我> internalView - >子标签

layoutSubviews正在做一个简单的事情,比如用超视图的边界设置每个子视图的框架。

我创建上面的代码只是为了指出我在 translatesAutoresizingMaskIntoConstraints 中找到的奇怪行为。

(黄色视图是标签) 如果属性的值为YES,则结果是我对layoutSubviews方法中的代码的期望

translatesAutoresizingMaskIntoConstraints = YES

如果不是,我使用相同的layoutSubviews:

translatesAutoresizingMaskIntoConstraints = NO

translatesAutoresizingMaskIntoConstraints 的文档说:

  

如果此值为YES,则视图的superview查看视图   自动调整掩码,生成实现它的约束,并添加   那些对自身的限制(超级视图)。

在这两种情况下, autoresizingMask 都设置为 UIViewAutoresizingNone ,并且标签的 constraints 属性中没有约束。

为什么使用 translatesAutoresizingMaskIntoConstraints =否我在layoutSubviews中设置的帧不是我在屏幕上看到的那样?

编辑2:

考虑到暴露的情况,我希望 translatesAutoresizingMaskIntoConstraints 设置为YES或NO。具有相同的结果。

编辑:

我试图调动 sizeToFit 方法来检查它是否被调用。不是。

这发生在iOS6/7


2014年8月8日更新

经过进一步调查后,我发现有一种方法可以改变标签的边框而不需要自动布局。

我发现布局的第一次传递(当被称为layoutSubviews时)与 translatesAutoresizingMaskIntoConstraints = NO 自动布局后,为UILabel的拥抱/压缩添加了约束。关键是,对于实现 intrinsicContentSize 的每个视图,返回与 UIViewNoIntrinsicMetric 不同的内容,autolayout会添加特定的约束。这就是调整标签大小的原因。

所以我做的第一件事是重新实现UILabel的子类来覆盖 intrinsicContentSize

在此之后,按照这篇非常好的文章http://www.objc.io/issue-3/advanced-auto-layout-toolbox.html中的建议,我尝试完全转换autolayout以获取涉及删除 [super layoutSubviews] 的子视图。

我的目标是避免自动布局可以对尝试应用动画转换的视图起作用。因此,如果您有相同的需求,我希望这可以帮助您。

1 个答案:

答案 0 :(得分:2)

这更多来自于使用它而不是实际研究的直觉,但是......

如果将translatesAutoresizingMaskIntoConstraints设置为YES,系统将创建约束以强制执行您为视图定义的帧。

如果设置为NO,则不会为视图设置约束,并且由于您没有自己设置约束,视图将根据默认行为调整大小。在这种情况下,由于“contentHugging”值,它似乎调整到最小内容大小。

根据我的理解,自动布局处于活动状态时,所有视图都需要约束才能正确放置。您可以将该属性设置为YES,也可以自己设置约束。如果你不这样做,结果将有点不可预测。


UIViewAutoresizingNone蒙版仍然是一个有效的蒙版,具有固定的尺寸(没有调整大小),它将被转换为约束。将该选项设置为YES时,视图可以共存而不设置约束。

当你真正意味着“没有调整大小的面具”时,你正在将UIViewAutoresizingNone解释为“无掩码”。很抱歉不同意你,但我认为这是预期的行为:)