В моем приложении для iOS 8, использующем классы размеров, чтобы iPad имел другой макет в портретной и альбомной ориентации, у меня есть IBOutletCollection
для каждой ориентации, которую я активирую и деактивирую. Это отлично работало до появления Container View.
Я добавляю новый VC, который является отдельным элементом вкладки в версии для iPhone, но я встраиваю его в макет iPad с помощью представления контейнера. Я сосредоточусь только на классе одного размера, RegularRegular. Представление контейнера имеет 4 ограничения: конечное, ведущее, верхнее и нижнее. Когда я запускаю приложение, оно выглядит нормально (в этой единственной ориентации).
Теперь, когда я добавляю эти 4 ограничения в свой IBOutletCollection
, сообщение activateConstraints
завершается ошибкой со следующим сообщением об ошибке:
*** Завершение работы приложения из-за неперехваченного исключения «NSGenericException», причина: «Невозможно активировать ограничение с элементами; слой =; contentOffset: {0, 0}; contentSize: {460, 78}> и>, потому что у них нет общего предка. Указывает ли ограничение на элементы в разных иерархиях представлений? Это незаконно.
Ограничения не ссылаются на элементы в разных иерархиях представлений. Top, Bottom и Leading связаны с другим представлением, которое также находится в представлении VC. Трейлинг связан с шаговым двигателем, который также находится в поле зрения ВК. Так что, насколько мне известно, все они находятся на одном иерархическом уровне.
Во время отладки я вижу, что ограничение начинается с его свойства active
как nil
. Это кажется нормальным (неконтейнерные ограничения начинались так же, прежде чем они были установлены на YES
). Я проверил это с помощью цикла for, установив свойство active
.
Что-то я делаю не так с ограничениями в представлении контейнера? Являются ли ограничения в представлении контейнера чем-то особенным, потому что они находятся в представлении контейнера? Я сам пытался найти ответ, но не могу найти ничего в отношении этой проблемы.
Любая помощь будет принята с благодарностью.
4/10 Отредактируйте, чтобы добавить изображения и код. Обратите внимание, что на данный момент я выделил ограничения контейнера в отдельный массив, чтобы я мог справиться с ними самостоятельно.
На изображении ниже ограничения Leading, Top и Bottom контейнера связаны с видом справа от контейнера. Ограничение "Трейлинг" относится к шагающему над ним.
Связанный код:
@property (strong, nonatomic) IBOutletCollection(NSLayoutConstraint) NSArray *regularAnyConstraints;
@property (strong, nonatomic) IBOutletCollection(NSLayoutConstraint) NSArray *regularAnyContainerConstraints;
@property (strong, nonatomic) IBOutletCollection(NSLayoutConstraint) NSArray *anyRegularConstraints;
@property (strong, nonatomic) IBOutletCollection(NSLayoutConstraint) NSArray *anyRegularContainerConstraints;
Это ограничения в массиве _anyRegularContainerConstraints
:
[NSLayoutConstraint deactivateConstraints:_regularAnyConstraints];
[NSLayoutConstraint activateConstraints:_anyRegularConstraints];
[NSLayoutConstraint deactivateConstraints:_anyRegularContainerConstraints];
[NSLayoutConstraint activateConstraints:_anyRegularContainerConstraints];