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

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

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

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

Ответы

Ответ 1

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

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

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

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

Ответ 2

Я тоже ошибся,

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

Ответ 3

Попробуйте переместить код макета с viewWillAppear на viewWillLayoutSubviews.

Ответ 4

Немного обновленный ответ NickProvost:

private var loadViewToken: dispatch_once_t = 0

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    dispatch_once(&loadViewToken) { [weak self] in
        if let wSelf = self {
            wSelf.setupView()
        }
    }
}