0

我正在使用界面生成器为 iPad 设计一个屏幕。我有一个空视图,我添加了一个 UIImageView 作为具有 4 个约束的壁纸:

Leading Space to superview = 0
Trailing Space to superview = 0;
Top Space to superview = 0;
Bottom Space to superview = 0;

这样,图像在横向模式下可以完美调整大小。

我在 viewDidAppear: 和 didRotateFromInterfaceOrientation 中插入了一些调试代码:

NSLog(@"%@", [[UIWindow keyWindow] _autolayoutTrace]);

只有在屏幕上使用这些元素,我才能在纵向模式下获得模棱两可的布局输出:

*<UIWindow:0x754c210>
|   *<UIView:0x75555f0> - AMBIGUOUS LAYOUT
|   |   *<UIImageView:0x7555650> - AMBIGUOUS LAYOUT

在横向模式下,似乎工作正常

*<UIWindow:0x754c210>
|   *<UIView:0x75555f0>
|   |   *<UIImageView:0x7555650>

之后我添加了更多控件,屏幕似乎工作正常,但我无法摆脱那种模棱两可的布局。我做错了什么?

4

2 回答 2

1

我想有时约束“安定下来”而不是模棱两可需要时间。根据 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]。延迟通话的想法是我自己的。

于 2013-10-02T04:06:16.173 回答
0

我不知道你是否做错了什么,但我使用视觉格式化语言:

[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentsView]|"
                                            options:0
                                            metrics:nil
                                              views:NSDictionaryOfVariableBindings(contentsView)]];

[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[contentsView]|"
                                            options:0
                                            metrics:nil
                                              views:NSDictionaryOfVariableBindings(contentsView)]];

我没有从跟踪它中看到任何模棱两可的布局警告。

于 2013-01-11T17:43:49.717 回答