web-dev-qa-db-ja.com

iOS:デバイスが回転した後に機能を実行する方法(Swift)

自動レイアウトを使用していないUIViewが1つあり、一部のコンポーネントは、メインビューからのXおよびY座標のパーセントに基づいて表示されます。

以前は、didRotateFromInterfaceOrientationの位置を更新する関数を実行していましたが、これはiOS8で非推奨になりました。

ViewWillTransitionToSizeを見てみましたが、奇妙な結果が得られており、viewDidtransitionToSize関数はないようです。

デバイスの回転後に関数を実行する簡単な方法(Swift)はありますか?

58
Richard

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
    })
}
144
Acey

上記の答え 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
    }
}
25
daxh

ここでは客観的な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");
    }  
}];
}
13