iOS 9: кадр больше не устанавливается в viewWillAppear после UINavigationController pushViewController

Я пытаюсь устранить ошибку размещения представления, возникшую в iOS 9. Я создаю экземпляр контроллера представления из xib-файла (неавтоматического размещения), а затем помещаю его в свой UINavigationController,

Проблема в том, что когда контроллер представления viewWillAppear метод вызван, его кадр еще не отрегулирован под размер контроллера навигации и по-прежнему является тем, что было установлено в файле xib. Это не будет установлено должным образом, пока viewDidAppear,

Это полностью портит мой код. Кто-нибудь знает точно, что изменилось, что вызывает это и как лучше всего справиться с этим? Я не хочу ждать, пока viewDidAppear потому что это будет выглядеть плохо и сделать для плохого пользовательского опыта.

4 ответа

Решение

Я также ищу лучшее решение.

Мой временный вариант - вызвать код, который был в "viewDidAppear" в "viewDidLayoutSubviews". Таким образом, мой код будет вызван, как только будут установлены кадры.

Но обязательно добавьте логическое значение или что-то подобное, чтобы ваш код не вызывался каждый раз, когда вызывается viewDidLayoutSubviews

-(void)viewDidLayoutSubviews{
   if (didLayoutSubviews == NO){
       didLayoutSubviews = YES;
       // perform code that was in viewWillAppear
   }
}

Попробуйте переместить код макета из viewWillAppear в viewWillLayoutSubviews,

Я тоже столкнулся с этой проблемой,

Попробуйте снять флажок "Изменить размер представления из NIB" из раскадровки

Немного обновленный ответ НикаПровоста:

private var loadViewToken: dispatch_once_t = 0

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    dispatch_once(&loadViewToken) { [weak self] in
        if let wSelf = self {
            wSelf.setupView()
        }
    }
}
Другие вопросы по тегам