web-dev-qa-db-ja.com

iOS 8ローテーションメソッドの廃止-後方互換性

IOS 8では、インターフェイスの回転方法は 非推奨 です。これも:

  • willRotateToInterfaceOrientation:duration:
  • didRotateFromInterfaceOrientation:
  • willAnimateRotationToInterfaceOrientation:duration:

置換方法は次のとおりです。

  • willTransitionToTraitCollection:withTransitionCoordinator:
  • viewWillTransitionToSize:withTransitionCoordinator:

新しいローテーションメソッドが実装されておらず、プロジェクトがiOS 8 SDKでコンパイルされている場合、View Controllerは非推奨のローテーションメソッドへの呼び出しを受信しません-。

私の懸念はこれです:iOS 7 SDKで構築されたAppStoreにすでにあるアプリはどうなりますか?非推奨の回転メソッドはiOS 8デバイスで呼び出されますか?

編集:

回転メソッドは引き続き呼び出されますが、iOS 8にはいくつかの変更/問題/バグが存在します。

また、 UIScreenはインターフェイス指向になりました

52
fabb

ローテーションメソッドは、iOS 8 SDKで非推奨になりました。これは、iOS 7 SDKで構築されたアプリ、iOS 8およびおそらくiOSのいくつかの将来のバージョンで実行されているアプリにはまったく影響しません。

例として、fontUIButtonプロパティはiOS 3.0から廃止され、iOS 7.0でも引き続き使用可能です。

19
mluisbrown

私はこの問題を抱えていたので、以前に使用していたのと同じ方法を使用したかった(少なくとも今のところ)ので、これが私がしたことです。

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

    //The device has already rotated, that's why this method is being called.
    UIInterfaceOrientation toOrientation   = [[UIDevice currentDevice] orientation];
    //fixes orientation mismatch (between UIDeviceOrientation and UIInterfaceOrientation)
    if (toOrientation == UIInterfaceOrientationLandscapeRight) toOrientation = UIInterfaceOrientationLandscapeLeft;
    else if (toOrientation == UIInterfaceOrientationLandscapeLeft) toOrientation = UIInterfaceOrientationLandscapeRight;

    UIInterfaceOrientation fromOrientation = [[UIApplication sharedApplication] statusBarOrientation];

    [self willRotateToInterfaceOrientation:toOrientation duration:0.0];
    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
        [self willAnimateRotationToInterfaceOrientation:toOrientation duration:[context transitionDuration]];
    } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
        [self didRotateFromInterfaceOrientation:fromOrientation];
    }];

}

期間がないため、これをアニメーションブロックの外で使用する必要があるかどうかはまだわかりません。

    [self willRotateToInterfaceOrientation:toOrientation duration:0.0];
36
Camo

リストされている非推奨の回転メソッドは、iOS 8以降のデバイスでアプリが実行されるときに引き続き呼び出されます。 iOS 7をサポートしている場合は、引き続き問題なく使用できます。 iOS 8以降のみをサポートしている場合は、代わりに非推奨ではないメソッドを使用することをお勧めします。

ただし、同じView Controllerに新しい回転メソッドと非推奨メソッドを実装すると、iOS 7で実行すると非推奨メソッドが呼び出され、iOS 8+ではそれらを置き換える新しいメソッドのみが呼び出されることに注意してください非推奨です。

たとえば、willRotateToInterfaceOrientationのみを実装する場合、このメソッドはiOS 7および8で実行されるときに呼び出されます。その後、viewWillTransitionToSizeを追加すると、iOS 7はwillRotateToInterfaceOrientationを呼び出しますが、 iOS 8はそうではなく、代わりにviewWillTransitionToSizeを呼び出すだけです。

6
Jordan H

私はその特定のケースを100%の信頼度を持つようにチェックしますが、トラブルは発生しません。セッションを見ることもお勧めします216 Building Adaptive Apps with UIKit from WWDC 2014 詳細情報を取得します。減価償却されたメソッドは呼び出されないようですので、iOS 8を実行しているデバイスで正しく動作するようにアプリを更新する必要があります。

2
Julian Król

私にとって、ここではいくつかの計算とヘッダーのサイズなどを追跡するplistファイルを使用して「ものを手動で」回転させます(したがって、ボタンなどを変更したい場合は、個々のxibではなくこのplistのみを変更します) 。そして、すべての回転コードはwillLayoutSubviews内にあるので、新しいiOS8でもすべてが正しいです... Iを除いて、新しいios8 [[UIScreen mainScreen] bounds].size.widthは、デバイスの実際のサイズではなく、デバイスの向きに応じた幅を返すようになりました。

これを他のスレッドに投稿します。

- (BOOL) isIOS8OrAbove{
    float version802 = 1140.109985;
    float version8= 1139.100000; // there is no def like NSFoundationVersionNumber_iOS_7_1 for ios 8 yet?
    NSLog(@"la version actual es [%f]", NSFoundationVersionNumber);
    if (NSFoundationVersionNumber >= version8){
        return true;
    }
    return false;
}
1
tyoc213

回転方法は引き続き動作します[〜#〜] but [〜#〜]その他の問題があります:

1
fabb