3

我创建了一个简单的 iOS 应用程序,该应用程序创建了一个 UIViewController,其中包含一个 View。这是应用程序委托:

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)]>
)

所以这是一个简单的问题,所以我理解得更好。如果自动布局应该是新的东西,而不是自动调整掩码,为什么 UIWindow 强制使用 NSAutoresizingMaskLayoutConstraint?我应该使用不同的初始化程序来使 UIWindow 使用常规约束吗?也许我的 UIWindow 上的 initWithFrame 是罪魁祸首?

谢谢!

4

2 回答 2

2

默认情况下,UIWindow创建控制器的顶视图translatesAutoresizingMaskIntoConstraints=YES以帮助转换。来自可可开发

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

您可以禁用使用代码,但不能以 Apple 提供的方式更改此行为。您可以使用 swizzling 来完成它,但编写额外的行更文雅:

self.window.translatesAutoresizingMaskIntoConstraints = NO; // application:didFinishLaunchingWithOptions:
self.view.translatesAutoresizingMaskIntoConstraints = NO; // viewWillAppear:
于 2013-11-09T23:36:06.647 回答
0

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

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

WWDC 2012 上的 Auto Layout by Example应该会有所帮助。

(您对 UIWindow 的自动调整大小蒙版有疑问吗?在我的代码中,我已打开翻译,并且仅在使用自动布局时将其关闭,不过我只是从自动布局开始。)

于 2013-05-06T01:50:24.327 回答