自動レイアウトを使用していないUIViewが1つあり、一部のコンポーネントは、メインビューからのXおよびY座標のパーセントに基づいて表示されます。
以前は、didRotateFromInterfaceOrientationの位置を更新する関数を実行していましたが、これはiOS8で非推奨になりました。
ViewWillTransitionToSizeを見てみましたが、奇妙な結果が得られており、viewDidtransitionToSize関数はないようです。
デバイスの回転後に関数を実行する簡単な方法(Swift)はありますか?
viewWillTransitionToSize
デリゲートメソッドは、 UIViewControllerTransitionCoordinator
適合オブジェクトで呼び出されます。プロトコルが宣言するメソッドは animateAlongsideTransition(_:animation, completion:)
です。これを使用して、移行の完了後にコードを実行できます。
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
coordinator.animateAlongsideTransition(nil, completion: {
_ in
// Your code here
})
}
上記の答え https://stackoverflow.com/a/26944087/6583492 は、AceyとMoonwalkrのおかげで絶対に正しいです。ただし、Swift 3.0の場合、次のようになります
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
coordinator.animate(alongsideTransition: nil) { _ in
// Your code here
}
}
ここでは客観的なCバージョンを求めていませんが:
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) {
// change any properties on your views
} completion:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) {
UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
if( UIDeviceOrientationIsPortrait(orientation) ) {
NSLog(@"portrait");
} else {
NSLog(@"landscape");
}
}];
}