我已经创建了这个简单的自定义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个约束:

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

自定义视图的视图层次结构是self-> internalView-> sublabel
layoutSubviews做一件简单的事情,例如用 super 视图的边界设置每个子视图的框架。

我创建上面的代码只是为了指出我在 translationsAutoresizingMaskIntoConstraints 中发现的奇怪行为。

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

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

translationsAutoresizingMaskIntoConstraints的文档说:

如果该值为YES,则该视图的 super 视图将查看该视图的
自动调整大小的遮罩,产生实施遮罩的约束,并添加
对自身的约束( super 视图)。

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

为什么使用translatesAutoresizingMaskIntoConstraints = NO,我在layoutSubviews中设置的框架不是我在屏幕上看到的?

编辑2:

在给定的公开场景下,我期望将translatesAutoresizingMaskIntoConstraints设置为YES或NO来获得相同的结果。

编辑:

我试图混淆sizeToFit方法以检查它是否被调用。不是。

这发生在iOS6/7

更新14/08/08

经过进一步的调查,我发现有一种方法可以更改标签的框架而无需自动布局。

我发现,在第一次通过带有translatesAutoresizingMaskIntoConstraints = NO的布局(称为layoutSubviews)之后,自动布局会为UILabel的拥抱/压缩添加约束。关键是,对于每个实现internalContentContentSize且返回不同于UIViewNoIntrinsicMetric的视图,自动布局都会添加特定的约束。这就是调整标签大小的原因。

因此,我要做的第一件事是重新实现UILabel的子类以覆盖
internalContentSize。

之后,按照这篇非常好的文章http://www.objc.io/issue-3/advanced-auto-layout-toolbox.html中的建议,我尝试完全关闭涉及自动删除的子视图的[自动布局]。

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

最佳答案

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

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

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

根据我的理解,最重要的是,当启用自动布局时,所有视图都需要适当放置约束。您可以将该属性设置为YES,或者自己设置约束。如果您都不这样做,结果将是不可预测的。

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

您将UIViewAutoresizingNone解释为“无遮罩”,而实际上是“没有调整大小的遮罩”。抱歉,不同意您的意见,但我认为这是预期的行为:)

关于ios - 将AutoresizingMaskIntoConstraints和UILabel转换为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25162532/

10-10 08:19