"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];
}
Другие вопросы по тегам