我创建了这个简单的自定义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个约束:
约束与顶部,尾随,前导和高度有关。
自定义视图的视图层次结构是自我> internalView - >子标签
layoutSubviews
正在做一个简单的事情,比如用超视图的边界设置每个子视图的框架。
我创建上面的代码只是为了指出我在 translatesAutoresizingMaskIntoConstraints 中找到的奇怪行为。
(黄色视图是标签) 如果属性的值为YES,则结果是我对layoutSubviews方法中的代码的期望
如果不是,我使用相同的layoutSubviews:
translatesAutoresizingMaskIntoConstraints 的文档说:
如果此值为YES,则视图的superview查看视图 自动调整掩码,生成实现它的约束,并添加 那些对自身的限制(超级视图)。
在这两种情况下, autoresizingMask 都设置为 UIViewAutoresizingNone ,并且标签的 constraints 属性中没有约束。
为什么使用 translatesAutoresizingMaskIntoConstraints =否我在layoutSubviews中设置的帧不是我在屏幕上看到的那样?
考虑到暴露的情况,我希望 translatesAutoresizingMaskIntoConstraints 设置为YES或NO。具有相同的结果。
我试图调动 sizeToFit 方法来检查它是否被调用。不是。
这发生在iOS6/7
经过进一步调查后,我发现有一种方法可以改变标签的边框而不需要自动布局。
我发现布局的第一次传递(当被称为layoutSubviews时)与 translatesAutoresizingMaskIntoConstraints = NO 自动布局后,为UILabel的拥抱/压缩添加了约束。关键是,对于实现 intrinsicContentSize 的每个视图,返回与 UIViewNoIntrinsicMetric 不同的内容,autolayout会添加特定的约束。这就是调整标签大小的原因。
所以我做的第一件事是重新实现UILabel的子类来覆盖 intrinsicContentSize
在此之后,按照这篇非常好的文章http://www.objc.io/issue-3/advanced-auto-layout-toolbox.html中的建议,我尝试完全转换autolayout以获取涉及删除 [super layoutSubviews] 的子视图。
我的目标是避免自动布局可以对尝试应用动画转换的视图起作用。因此,如果您有相同的需求,我希望这可以帮助您。
答案 0 :(得分:2)
这更多来自于使用它而不是实际研究的直觉,但是......
如果将translatesAutoresizingMaskIntoConstraints设置为YES,系统将创建约束以强制执行您为视图定义的帧。
如果设置为NO,则不会为视图设置约束,并且由于您没有自己设置约束,视图将根据默认行为调整大小。在这种情况下,由于“contentHugging”值,它似乎调整到最小内容大小。
根据我的理解,自动布局处于活动状态时,所有视图都需要约束才能正确放置。您可以将该属性设置为YES,也可以自己设置约束。如果你不这样做,结果将有点不可预测。
UIViewAutoresizingNone蒙版仍然是一个有效的蒙版,具有固定的尺寸(没有调整大小),它将被转换为约束。将该选项设置为YES时,视图可以共存而不设置约束。
当你真正意味着“没有调整大小的面具”时,你正在将UIViewAutoresizingNone解释为“无掩码”。很抱歉不同意你,但我认为这是预期的行为:)