Я создал UIView программно и добавлю NSLayoutConstraint к нему, и он работает, а затем добавляет его в виде подвид представления представления контроллера. Прямо сейчас мне нужно удалить это представление из супервизора, а через некоторое время добавить его снова. Но макет больше не будет работать, если я добавлю его снова, используя self.view addSubview
. Как сделать макет снова?UIView addSubview автоматический макет не работает
ответ
Вам необходимо позаботиться о некоторых моментах при добавлении nd удаление просмотров из автоматического макета.
Есть два метода доступен в UIView.h
классе
// Allows you to perform layout before the drawing cycle happens.
// -layoutIfNeeded forces layout early
- (void)setNeedsLayout;
- (void)layoutIfNeeded;
Используйте эти методы в соответствии с вашими требованиями. Поэтому я предлагаю, когда вы удаляете subview из представления, установите ограничение на улучшенное представление, если это необходимо. А затем вызовите метод ниже, чтобы отразить изменения макета.
[self.view layoutIfNeeded];
В большинстве случаев выше метод решает все проблемы, связанные с компоновкой. Однако какое-то время, если сложная структура существует, я имею в виду время выполнения изменений представлений.
Затем переопределите ниже метод в UIViewController
, выполните все изменения, связанные с фреймом, в этом методе.
- (void)viewDidLayoutSubviews
При создании ограничений присвоить переменным
@property (nonatomic, strong)NSLayoutConstraint *viewConstraintTop;
self.viewConstraintTop = [Your Constraint];
Если вы хотите, чтобы удалить его из надтаблицы удалить ограничения
[self.viewConstraintTop autoRemove];
Удалить ваш взгляд и снова при добавлении назначить ограничение в
self.viewConstraintTop = [Your Constraint];
Проблема заключается в суб вид не наследует первоначальный вид в размер/кадр, и там добавляет вид, как будто он застрял в любом + Любой размер 600x600. Мое решение состоит в том, чтобы установить рамку исходного вида, а затем позволить iOS выполнять оставшуюся часть работы.
[self.myOtherView setFrame:self.view.frame]; //Replace frame size with already resized view
[self.myOtherView setNeedsLayout]; //Tell iOS to autolayout the new sub view
[self.addSubView:self.myOtherView]; //Add it
Вам необходимо повторно добавить ограничения. Когда вы удаляете subview, любые ограничения для этого представления теряются. – rdelmar