it-roy-ru.com

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

Спасибо

18
AppsDev

В вашем текущем контроллере представления, если вы переопределяете 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 ...
}
23
Yuchen Zhong

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

2
Steve Brooker

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

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

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

Сценарий: Parent -> Child (viewWillTransition не вызывается в child)


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

П.С. - Это случилось со мной, потому что я не написал код для родителя.

0
Rakesha Shastri