iOS 6 也是如此。
我想有时约束“安定下来”而不是模棱两可需要时间。根据 WWDC 2012 视频“掌握自动布局的最佳实践”,可以暂时容忍歧义(不像不可满足性,它会立即引发异常)。
如果您想向自己证明您的约束没有模棱两可,请为 [[UIWindow keyWindow] _autolayoutTrace] 创建一个包装器,并在短暂延迟后调用它:
- (void)viewDidAppear:animated
{
[super viewDidAppear:animated];
[self performSelector:@selector(wrapperForLoggingConstraints) withObject:nil afterDelay:.3];
}
- (void)wrapperForLoggingConstraints
{
[[UIWindow keyWindow] _autolayoutTrace];
}
您必须在 UIWindow 上创建一个类别才能使其正常工作:
@interface UIWindow()
+ (UIWindow *)keyWindow;
- (NSString *)_autolayoutTrace;
@end
我把这个类别放在它自己的头文件中,UIWindow_AutoLayoutDebug.h
在我的应用程序中,无论我在哪里调用 [[UIWindow keyWindow] _autolayoutTrace],我都会导入 UIWindow_AutoLayoutDebug.h
我从 raywenderlich.com 团队的“iOS 6 by tutorials”第 1 卷一书中了解到如何在代码中调用 [[UIWindow keyWindow] _autolayoutTrace]。延迟通话的想法是我自己的。