2014-10-31 2 views
4

Я создал UIView программно и добавлю NSLayoutConstraint к нему, и он работает, а затем добавляет его в виде подвид представления представления контроллера. Прямо сейчас мне нужно удалить это представление из супервизора, а через некоторое время добавить его снова. Но макет больше не будет работать, если я добавлю его снова, используя self.view addSubview. Как сделать макет снова?UIView addSubview автоматический макет не работает

+0

Вам необходимо повторно добавить ограничения. Когда вы удаляете subview, любые ограничения для этого представления теряются. – rdelmar

ответ

3

Вам необходимо позаботиться о некоторых моментах при добавлении 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 
0

При создании ограничений присвоить переменным

@property (nonatomic, strong)NSLayoutConstraint *viewConstraintTop; 
self.viewConstraintTop = [Your Constraint]; 

Если вы хотите, чтобы удалить его из надтаблицы удалить ограничения

[self.viewConstraintTop autoRemove]; 

Удалить ваш взгляд и снова при добавлении назначить ограничение в

self.viewConstraintTop = [Your Constraint]; 
16

Проблема заключается в суб вид не наследует первоначальный вид в размер/кадр, и там добавляет вид, как будто он застрял в любом + Любой размер 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