"viewWillTransitionToSize:" не вызывается в iOS 9, когда контроллер представления представлен модально
Я представляю контроллер вида из другого:
- (void)showModalView
{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
MySecViewController *mySecViewController = [storyboard instantiateViewControllerWithIdentifier:@"secController"];
mySecViewController.delegate = self;
[self presentViewController:mySecViewController animated:YES completion:nil];
}
Тогда в представленном UIViewController
, метод viewWillTransitionToSize:withTransitionCoordinator:
называется в iOS 8
но не в iOS 9
...
Спасибо
4 ответа
В вашем текущем контроллере представления, если вы переопределите viewWillTransitionToSize:withTransitionCoordinator:
обязательно позвони super
, В противном случае это сообщение не будет распространено на дочерние контроллеры представления.
Для Objective-C:
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
// Your other code ...
И Свифт:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
// Your other code ...
}
Люди уже объяснили, что надо звонить супер. Я хотел бы добавить информацию, которая может помочь людям, которые столкнулись бы с тем, с чем я столкнулся.
Сценарий: Parent -> Child (viewWillTransition не вызывается в child)
Если ваш контроллер представления является дочерним контроллером представления, то проверьте, вызывается ли родительский контроллер представления, и вызывается ли там super. В противном случае он не будет передан в дочерний контроллер вида!
class ParentViewController: UIViewController {
func presentChild() {
let child = ChildViewController()
present(child, animated: false, compeltion: nil)
}
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator) // If this line is missing your child will not get the delegate call in it's viewWillTransition
// Do something
}
}
class ChildViewController: UIViewController {
// This method will not get called if presented from parent view controller and super is not called inside the viewViewWillTransition available there.
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
//Do something
}
}
PS - Это случилось со мной, потому что я не написал код для родителя.
Может показаться тривиальным случаем, но при использовании iPad убедитесь, что у пользователя не активирована блокировка поворота в настройках либо панели управления, либо боковой кнопки
Может быть, уже немного поздно, но я разместил это здесь для тех, кто наткнулся на эту неприятную проблему.
Имейте в виду, что viewWillTransitionToSize:withTransitionCoordinator:
иногда вызывается на presentingViewController
контроллера представления вы ожидаете это. (И если этот контроллер представления имеет presentingViewController
на это тоже можно будет призвать)
Я не мог действительно понять логику этого, но это был смысл в моем случае. Поэтому мне пришлось переопределить viewWillTransitionToSize:withTransitionCoordinator:
во многих из моих контроллеров представления, как это:
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
[self.presentedViewController viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}