iOS AutoLayout - когда он запускается?
У меня есть файл XIB, где я определяю ограничения во время разработки. В дополнение к элементам управления с ограничениями у меня также есть элементы управления, которые не имеют ограничений в XIB, которые я хочу позиционировать программно во время выполнения.
Я делаю это, перемещая представления вручную в didRotateFromInterfaceOrientation.
Когда я поворачиваю устройство, мой код помещает элементы управления, которые управляются вручную, но потом оказывается, что автоматическая разметка портит размещение ручных элементов управления, которые не имеют на них ограничений, в Интерфейсном конструкторе.
Вопрос - Когда именно запустится автоматическая разметка, если я поверну устройство.
3 ответа
Автоматическая компоновка выполняется в конце цикла выполнения после setNeedsLayout
вызывается на виде, или сразу же, когда setNeedsLayout
сопровождается layoutIfNeeded
, Обратите внимание, что существует много методов, которые могут вызывать setNeedsLayout
в их реализации, таких как addSubview:
, removeFromSuperview
, так далее.
Пара предложений:
Вместо обновления ваших ограничений в didRotateFromInterfaceOrientation:
попробуйте сделать это в updateViewConstraints
,
Вы также можете добавить ограничения заполнителя в Интерфейсном Разработчике к представлениям, которые вы разместите программно. Я думаю, что IB автоматически ограничит представления их положением x/y, если ограничение заполнителя не установлено, но я не уверен на 100% в этом.
Важно знать, что результаты расчетов ограничений применяются в layoutSubviews
, Так что если вы хотите установить кадры, вы делаете это после вызова super
в layoutSubviews
или, по вашему мнению, контроллер viewDidLayoutSubviews
,
Сказав это, я только экспериментировал с этим. Я не делал этого в рабочем коде и не могу сказать, что у вас не возникнет проблем.
Я на самом деле не ясно, нормально ли устанавливать кадры вручную, как это. Единственная важная информация, с которой я столкнулся, - это следующая информация из документации Apple Auto Layout:
Вы не можете установить ограничение для пересечения иерархии представления, если иерархия включает представление, которое устанавливает кадры подпредставлений вручную в пользовательской реализации для метода layoutSubviews в UIView (или метода макета в NSView).
Здесь фраза "представление, которое устанавливает фреймы подпредставлений вручную", подразумевает, что ручная установка фреймов - это нормально. Мне было бы интересно узнать, есть ли у кого-нибудь более подробное обсуждение этого вопроса.
Вы не должны изменять фрейм, вы должны связать ограничение с iboulet, а в didRotateFromInterfaceOrientation вы можете изменить ограничение следующим образом:
- (void) didRotateFromInterfaceOrientation: (UIInterfaceOrientation) fromInterfaceOrientation {if (UIInterfaceOrientationIsLandscape (fromInterfaceOrientation)) {self.constraintTop.constant = 50; } else {self.constraintTop.constant = 100; }}