我创建了一个简单的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应该受到责备?
谢谢!
答案 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自动调整掩码的问题?在我的代码中我已翻译并且只在我使用自动布局的地方关闭它,我只是从自动布局开始。)