1

我以编程方式创建了一个 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 打开时,将自动生成约束并添加到超级视图,在本例中为 myView。

那么为什么这里没有生成约束呢?为什么布局系统仍然知道如何在屏幕上布局按钮?

********更新:我想我知道原因。当 UIView 没有附加任何约束时,布局系统将不会到位。它将使用视图的框架。 在这种情况下,当我们打开 translatesAutoresizingMaskIntoConstraints 时,不会生成按钮的内在约束,因此按钮没有任何约束。因此将使用框架。从代码创建的所有 UIView 都将 translatesAutoresizingMaskIntoConstraints 默认为 YES,因此不会为视图自动生成约束。框架将被使用。这对于向后兼容非常有意义。

4

1 回答 1

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 掩码的约束。尝试通过将autoresizingMask设置为不同的值进行测试,您将获得相应的等效约束。

于 2014-06-25T09:09:08.797 回答