Неоднозначный макет на почти пустом UIView для iPad

Я хочу спроектировать экран для 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>

После этого я добавил больше элементов управления, и экран, кажется, работает нормально, но я не могу избавиться от этой неоднозначной компоновки. Что я делаю не так?

2 ответа

Я предполагаю, что иногда требуется время, чтобы ограничения успокоились и не были двусмысленными. Согласно видео WWDC 2012 "Best Practices для освоения автоматической компоновки", двусмысленность может быть временно допущена (в отличие от неудовлетворенности, которая немедленно вызывает исключение).

Если вы хотите доказать себе, что ваши ограничения не остаются неоднозначными, создайте оболочку для [[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

Я узнал о вызове [[UIWindow keyWindow] _autolayoutTrace] в коде из книги "iOS 6 по учебным пособиям", том 1, командой raywenderlich.com. Идея отложить звонок - моя собственная.

Я не знаю, если вы делаете что-то не так, но я использую язык визуального форматирования:

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

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

Я не вижу каких-либо неоднозначных предупреждений о разметке от трассировки.

Другие вопросы по тегам