web-dev-qa-db-ja.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では呼び出されません...

ありがとう

21
AppsDev

現在のビューコントローラーで、viewWillTransitionToSize:withTransitionCoordinator:、必ずsuperを呼び出してください。それ以外の場合、このメッセージは子View Controllerに伝播されません。

Objective-Cの場合:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

    // Your other code ... 

そしてSwift

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    // Your other code ...
}
26
Yuchen Zhong

superを呼び出さなければならないことはすでに説明されています。私が直面したことを直面していた人々を助けるかもしれない情報を追加したいと思います。

シナリオ:親->子(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
    }
}

PS-これは私が親のコードを記述しなかったために起こりました。

5
Rakesha Shastri

少し遅いかもしれませんが、このイライラする問題に出くわした人のためにここに置いておきます。

それを念頭に置いて 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];
}
3
Behdad

些細なケースのように見えるかもしれませんが、iPadを使用している場合は、ユーザーが設定、コントロールパネル、またはサイドボタンで回転ロックを有効にしていないことを確認してください

3
Steve Brooker