willAnimateRotationToInterfaceOrientation:duration:
は 非推奨 iOS8では、viewWillTransitionToSize:withTransitionCoordinator:
代わりに 。
ただし、iOS8のView Controllerではこのメソッドは呼び出されません。このコールバックが機能するためには、他に何か実装する必要がありますか?
ドキュメントに何も見つかりません。私が見つけることができた唯一のものは、それが新しいUIContentContainer
プロトコルに属しているということでした。ただし、これをコントローラーのプロトコルに明示的に追加しても、機能しません。
何か案は?
viewWillTransitionToSize:withTransitionCoordinator:
は、インターフェイスが実際にサイズを変更する場合、つまり90度回転した場合にのみ機能するようです。レイアウトにマスクがあり、180度回転しても横向きしか許可されていない場合、インターフェイスのサイズは変わらないため、このメソッドは呼び出されないようです。
代わりにUIDeviceOrientationDidChangeNotification
通知に登録することで、アプリでこれを回避しました:
(私のView ControllerのviewWillAppear
):
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientationDidChange:) name:UIDeviceOrientationDidChangeNotification object:nil];
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
(私のviewWillDisappear
にある[[登録解除]を忘れないでください])
[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];
俺の deviceOrientationDidChange:
は次のようになります。
- (void)deviceOrientationDidChange:(NSNotification *)notification {
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
[self willRotateToInterfaceOrientation:orientation duration:1.0];
}
docs に従って、super
を呼び出すことを忘れないでください
- (void)viewWillTransitionToSize:(CGSize)size
withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
// ...
}
そうしないと、子View Controllerはメッセージを転送しません。
私はこの質問がこの時点で少し古いことを知っていますが、問題に出くわすかもしれない人にとっては、この問題は別の方法で解決されると思います。 addSubview(controller.view)
を使用してDIFFERENTコントローラーの一部であるビューをロードしようとしている場合、そのコントローラーも親に追加する必要があります(おそらく、追加しているビューのコントローラー)。コントローラーを親に追加しない場合、サイズ変更の更新を受け取ることはありません。後で、AppleのAPIが変更された理由がわかりました。 iPad Proでは、マルチタスク機能により、SizeClassを回転させることなく変更できます。これにより、メソッドも呼び出されます。
viewWillTransitionToSize(size: CGSize,
withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)
親クラスで、上記のメソッドをオーバーライドする場合は、必ずsuperを呼び出してください。そうしないと、壁に頭を打つ別の方法が見つかります...