UIWindow创建NSAutoresizingMaskLayoutConstraints而不是NSLayoutConstraint

时间:2013-03-30 06:26:56

标签: objective-c xcode uikit autolayout

我创建了一个简单的iOS应用程序,它创建了一个带有View的UIViewController。 这是应用程序委托:

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.viewController = [[ViewController alloc] init];
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];

这是UIViewController中的代码:

- (void)viewDidLoad {
  [super viewDidLoad];
  self.view.translatesAutoresizingMaskIntoConstraints = NO;
}

- (void)viewDidAppear:(BOOL)animated {
  NSLog(@"breakpoint here");
}

我在“断点此处”行中设置了一个断点。跑完应用程序并在它进入调试器后输入:

(lldb) po [[UIWindow keyWindow] _autolayoutTrace]
$0 = 0x0a056d30 
*<UIWindow:0x8078de0>
|   *<UIView:0xa053fe0>

以下是UIView的水平约束:

(lldb) po [0xa053fe0 constraintsAffectingLayoutForAxis:0]
$1 = 0x0a05ba60 <__NSArrayM 0xa05ba60>(
<NSLayoutConstraint:0xa059560 H:|-(0)-[UIView:0xa053fe0](LTR)   (Names: '|':UIWindow:0x8078de0 )>,
<NSLayoutConstraint:0xa0595e0 UIView:0xa053fe0.right == UIWindow:0x8078de0.right>,
<NSAutoresizingMaskLayoutConstraint:0x8571520 h=--- v=--- H:[UIWindow:0x8078de0(768)]>
)

所以这是一个简单的问题,所以我理解得更好。如果autolayout应该是新的东西而不是autoresizing mask,为什么UIWindow强制NSAutoresizingMaskLayoutConstraint?我应该使用不同的初始化程序来使UIWindow使用常规约束吗?也许我的UIWindow上的initWithFrame应该受到责备?

谢谢!

2 个答案:

答案 0 :(得分:2)

默认情况下,使用UIWindow创建translatesAutoresizingMaskIntoConstraints=YES和控制器的顶视图以帮助转换。来自cocoa-dev

默认情况下,对于顶级视图,Xcode会将translatesAutoresizingMaskIntoConstraints的值设置为YES,包括为视图控制器加载的视图。其原因也是过渡性的:现在AppKit视图子类通常期望将translatesAutoresizingMaskIntoConstraints设置为YES的子视图,并且大多数应用程序正在转换。也许将来的某一天,默认值将更改为NO。

您可以禁用代码,但无法以Apple提供的方式更改此行为。您可以使用调配来完成它,但是编写额外的行更加文明:

self.window.translatesAutoresizingMaskIntoConstraints = NO; // application:didFinishLaunchingWithOptions:
self.view.translatesAutoresizingMaskIntoConstraints = NO; // viewWillAppear:

答案 1 :(得分:0)

我的理解是,如果没有足够的约束,视图和UIWindow将依赖于自动调整掩码。

约束需要定义大小和原点。如果没有足够的约束,Auto Layout将无法定义它们。

WWDC 2012的

Auto Layout by Example应该有所帮助。

(你是否遇到过UIWindow自动调整掩码的问题?在我的代码中我已翻译并且只在我使用自动布局的地方关闭它,我只是从自动布局开始。)