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()
}
}
}