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...

Спасибо


person AppsDev    schedule 01.10.2015    source источник
comment
Я также сталкиваюсь с той же проблемой.   -  person iChirag    schedule 14.10.2015


Ответы (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 ...
}
person Yuchen    schedule 13.01.2016

Люди уже объяснили, что нужно звонить super. Я хотел бы добавить часть информации, которая может помочь людям, которые столкнулись бы с тем, с чем столкнулся я.

Сценарий: Parent -> Child (viewWillTransition не вызывается в дочернем элементе)


Если ваш контроллер представления является дочерним контроллером представления, проверьте, вызывается ли родительский делегат контроллера представления и вызывается ли там 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
    }
}

P.S. Это случилось со мной, потому что код для родителя был написан кем-то другим, и они забыли позвонить super.

person Rakesha Shastri    schedule 30.11.2018
comment
Работал на меня! Спасибо. Но super обычно используется для superClass. Но здесь я вижу другую полезность для super. - person Nishu_Priya; 22.03.2019

Может показаться тривиальным случаем, но при использовании iPad убедитесь, что пользователь не активировал блокировку поворота в настройках, панели управления или боковой кнопке.

person Steve Brooker    schedule 14.04.2016

Может быть, это немного поздно, но я поместил это здесь для всех, кто наткнулся на эту разочаровывающую проблему.

Имейте в виду, что 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];
}
person Behdad    schedule 11.05.2018