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