Добавление ограничений авторазметки для подпредставлений вида с помощью Masonry
Я использую библиотеку Masonry iOS, чтобы упростить некоторую логику вокруг автоматического размещения iOS, и до сих пор мне это нравилось. Совсем недавно, однако, я работаю в более сложном приложении и пытаюсь добавить ограничения автоматического макета для подпредставлений, связанных с их родительскими представлениями. Однако выполнение этого, похоже, заставляет родительское представление принять ограничения своих дочерних элементов. Может быть, я просто не совсем понимаю этот аспект наследования автоматической разметки, но вот простой пример:
UIView *test = UIView.new;
[test setBackgroundColor:[UIColor orangeColor]];
[self.view addSubview:test];
[test makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.view).with.insets(UIEdgeInsetsMake(10, 10, 10, 10));
}];
UIView *test2 = UIView.new;
[test2 setBackgroundColor:[UIColor redColor]];
[test addSubview:test2];
[test2 makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(test).with.insets(UIEdgeInsetsMake(5, 5, 5, 5));
make.centerX.equalTo(test);
}];
В этом примере, несмотря на то, что второй UIView (test2) является подпредставлением теста и его ребра настроены на соответствие тесту, при запуске этого кода "тестовое" представление сдвигается вровень с экраном. Как ни странно, верх и низ, кажется, соответствуют вставкам краев "тестового" вида, и они точно позиционируются, однако правый край "вида" теперь находится на вставке 20 точек (так как левый тянется вплотную к левой стороне).
Теперь, если я изменю test2 и сделаю его подпредставлением self.view вместо подпредставления test, ограничения внезапно будут работать нормально.
Вот наглядная картина того, что происходит, когда test2 является подпредставлением test:
По-видимому, это означает, что вы можете добавлять только связанные ограничения для дочерних элементов одного родительского представления. Я знаю, что это не может иметь место, но, несмотря на пробу множества разных вещей, я не могу удержать более глубокие представления от воздействия на их родителей.
1 ответ
В моем случае оказывается, что причиной проблемы было ограничение, наложенное на базовое представление контроллера представления. Это ограничение, первоначально предназначавшееся для простого позиционирования базового вида на полную ширину и высоту, действительно устанавливало ширину, высоту и верхнюю позицию, но не левую позицию.
Если оставить левую позицию без каких-либо ограничений, будущие подпредставления, которые сами включили левое ограничение, будут подталкивать родительское представление к соответствию ограничениям подпредставления.
Урок здесь: начните с ОЧЕНЬ начала вашего стека представлений и проверяйте каждое из ваших подпредставлений по пути, прежде чем предположить, что проблема связана с вашими подпредставлениями.