我以编程方式创建一个UIButton并将其添加到这样的视图中:
self.button = [[UIButton alloc] initWithFrame:CGRectMake(20, 20, 100, 30)];
[self.button setTitle:@"Test" forState:UIControlStateNormal];
self.button.translatesAutoresizingMaskIntoConstraints = YES;
[myView addSubview:self.button];
按钮显示正确,并且它没有使用其内在大小(这是正确的,因为translatesAutoresizingMaskIntoConstraints已启用)。但是,当我打印myView.constraints时,我没有看到任何关于按钮的约束。根据定义,当translatesAutoresizingMaskIntoConstraints打开时,约束将自动生成并添加到superview,在本例中为myView。
那为什么这里没有生成约束?为什么布局系统仍然知道如何在屏幕上布局按钮?
********更新: 我想我知道原因。 当UIView没有附加任何约束时,布局系统将不会到位。它将使用视图框架。 在这种情况下,当我们打开translatesAutoresizingMaskIntoConstraints时,不会生成按钮的内在约束,因此按钮没有任何约束。所以框架将被使用。 从代码创建的所有UIView都将translatesAutoresizingMaskIntoConstraints默认设置为YES,因此不会自动为视图生成约束。框架将被使用。这对于向后兼容性非常有意义。
答案 0 :(得分:2)
文档描述其行为如下:
如果translatesAutoresizingMaskIntoConstraints = YES
,视图的超级视图会查看视图的自动调整大小,生成实现它的约束,并将这些约束添加到自身(超级视图)。
基于此描述,期望能够查看 - [UIView constraints]数组以查找已转换的约束,但是不会在那里添加生成的约束以编程方式创建视图(如果在nib中添加视图那么只有我们才会得到预期的行为。)
在使用调试器进行一些仔细的探索之后,我确定在布局期间通过私有方法‑[UIView(UIConstraintBasedLayout) _constraintsEquivalentToAutoresizingMask]
按需生成约束。
查看约束条件创建 UIView
的类别@interface UIView(TestConstriants)
- (NSArray *)_constraintsEquivalentToAutoresizingMask;
@end
将此类别导入 ViewController 类#import "UIView+TestConstriants.h"
调用此行代码将 self.button 添加到查看:
NSLog(@"constraints: %@", [self.button _constraintsEquivalentToAutoresizingMask]);
以上记录了相当于autoResize mask的约束。 通过将 autoresizingMask 设置为不同的值来尝试测试,您将获得相应的等效约束。