ローテーションメソッドは非推奨で、「didRotateFromInterfaceOrientation」に相当しますか?


137

viewWillTransitionToSizeiOS 8で導入された新しいメソッドを実装しようとしています(他のローテーションメソッドはすべて非推奨になっています)。didRotateFromInterfaceOrientation実行する必要のあるクリーンアップタスクがいくつかありUIViewControllerTransitionCoordinator、新しいものに「遷移」するときに呼び出すために割り当てることができるブロックが表示されないので、今と同等のものを知りたいサイズ仕上がり。ありがとう。

回答:


255

さて、それを見つけました、animateAlongsideTransition:completion:渡されたのメソッドを使用する必要がありますUIViewControllerTransitionCoordinator

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{   
    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context)
    {
        UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
        // do whatever
    } completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
    { 

    }];

    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}

このメソッドは、didRotateFromInterfaceOrientationのように回転するたびに呼び出されますか?使用した方法を教えてください。ありがとう
ask123

2
はい、そうです。これは私がすることです: - (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) { UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; // do whatever } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) { }]; [super viewWillTransitionToSize: size withTransitionCoordinator: coordinator]; }
奇妙な

1
ありがとう-私は人々に時間を節約するための回答として迅速なバージョンを追加します
DogCoffee

3
statusbarorientationはiOS 9で廃止されました。他にどのようなオプションがありますか?
Deepak Sharma

1
@DeepakSharmaパーティーには少し遅れますが、を使用できます[UIDevice currentDevice].orientation。これをUIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation)またはにパイプすることもできUIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)ます。お役に立てれば!
ジェフ

70

奇妙な答えのスウィフトバージョン

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {

    coordinator.animateAlongsideTransition({ (UIViewControllerTransitionCoordinatorContext) -> Void in

        let orient = UIApplication.sharedApplication().statusBarOrientation

        switch orient {
        case .Portrait:
            println("Portrait")
            // Do something
        default:
            println("Anything But Portrait")
            // Do something else
        }

        }, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
            println("rotation completed")
    })

    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
}

これをViewControllerに配置したのは奇妙でprint、ログには何も記録されませんでした。このメソッドが呼び出されていないためだと思います。これが機能するために接続する必要がある他の何かを考えることができますか?
2016年

空のプロジェクト(ユニバーサルアプリ)に追加しただけで、何も追加しなくても問題なく動作します。メソッドの最初にログステートメントを置いて、呼び出されているかどうかを確認します。追加する必要があるとは思えません。どのiOSを実行していますか?
DogCoffee 2016年

@ DogCoffee..itsが呼び出されない。シミュレータと何か関係がありますか?
Saty

@Satyはシミュレータでも動作します-もう一度チェックします。期待どおりに動作します。
DogCoffee 2016年

1
statusbarorientationはiOS 9で廃止されました。他にどのようなオプションがありますか?
Deepak Sharma

10

iOS 10.3およびSwift 3

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {

        coordinator.animate(alongsideTransition: { (_) in
            let orient = newCollection.verticalSizeClass

            switch orient {
            case .compact:
                print("Lanscape")///Excluding iPads!!!

            default:
                print("Portrait")
            }
        }, completion: { _ in
            print("rotation completed")
        })

        super.willTransition(to: newCollection, with: coordinator)
    }

なぜアニメーションが必要なのですか?「newCollection」をすぐに確認できませんか?
シアン化物

@cyanideでアニメーションを自分と同期
Mike Glukhov

7

Swift 3で受け入れられた答え:

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
    coordinator.animate(alongsideTransition: { (_) in
        let orient = UIApplication.shared.statusBarOrientation

        switch orient {
        case .portrait:
            print("Portrait")
        // Do something
        default:
            print("Anything But Portrait")
            // Do something else
        }
    }, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
      print("rotation completed")
    })

    super.willTransition(to: newCollection, with: coordinator)
}

私にとってはうまくいきます👍


私にとってiOS 10では機能しません。新しい方向ではなく、古い方向を印刷します。
Vaddadi Kartick 2017年

1
@VaddadiKartick使用する必要があるためlet orient = newCollection.verticalSizeClass switch orient { case .compact: print("Lanscape") // Do something default: print("Portrait") // Do something else }
Mike Glukhov

5

質問は次のとおりでした: didRotateFromInterfaceOrientation

以下のコードを寄稿すると思いました。

@implementation ViewController
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
    if (previousTraitCollection.verticalSizeClass == UIUserInterfaceSizeClassRegular) {
        NSLog(@"User has rotated to landscape");
    } else if (previousTraitCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact) {
        NSLog(@"User has rotated to portrait");
    }
}
@end

シミュレーターでiPhoneをテストしていましたが、traitsCollectionが変更されないため、iPadを使用してテストした場合、printステートメントが実行されません。

これが奇妙なのは、これがまさにAppleが推奨していることだからです。

- (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection {
    [super traitCollectionDidChange: previousTraitCollection];
    if ((self.traitCollection.verticalSizeClass != previousTraitCollection.verticalSizeClass)
        || self.traitCollection.horizontalSizeClass != previousTraitCollection.horizontalSizeClass)) {
        // your custom implementation here
    }
}

第2のコードスニペットに欠落ブラケットがある
アントンDuzenko

これは、垂直方向と水平方向の両方のクラスがフルスクリーンで標準であるiPadで機能しますか?
Deepak Sharma

あなたのコードはアップルのものと同じではありません、あなたは垂直サイズのクラスをテストするだけです。
ADG

リンクのコンテンツが変更されたようです。
NYCテックエンジニア

3

[[UIApplication sharedApplication] statusBarOrientation]iOS9では非推奨です。さまざまなデバイスのUITraitCollectionに対してテストする必要があります。

  override func willTransitionToTraitCollection(newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {

    if newCollection.containsTraitsInCollection(UITraitCollection(verticalSizeClass: .Regular)) {
      ...
    }
  }

6
setterのみが非推奨になりました。Appleの従業員は、「ステータスバーの向きの読み取りは非推奨ではなく、書き込みのみです。ゲッターでこれが表示されている場合、ヘッダーの作成方法にエラーがある可能性があります」と投稿しました。(forums.developer.apple.com/thread/12937
グラハムパークス

ゲッターも非推奨ではありません。ドキュメントによると、それはそうです。
Groot

0

Ipadには特性コレクションの変更がないため、開始と完了から回転を検出する方法を次に示します。Swift 5の構文は次のとおりです。

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

    coordinator.animate(alongsideTransition: { [unowned self] _ in

        self.view.backgroundColor = UIColor.blue
        print("rotation in progress")

    }) { [unowned self] _ in
        self.view.backgroundColor = UIColor.green
        print("rotation complete")


    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.