web-dev-qa-db-ja.com

'statusBarOrientation'は、アプリの向きを取得しようとしたときにiOS 13.0で廃止されました

簡単に言うと、アプリケーションの向きを提供するために次のコードに依存していました。これは、アプリケーション内のいくつかの理由で利用されます。

  • UX仕様に従って、スタックビューのレイアウトはiPadの向きに基づいて設定されます(横向きの場合は横向き、縦向きの場合は縦向き)
  • 前のアイテムに基づいて、スタックビューは画面の左(縦)または上(横)に配置されます
  • ステータスに応じて異なる応答をするカスタムローテーションロジックがあります。 tl; drは、iPadでは、向きが大きく異なるアプリです。

私はこのシナリオでメンテナンスを担当しているだけで、現在の(そして適切に機能している)レイアウトロジックから外れた大きな変更を加える機能はありません。

現在のところ、アプリケーションの向きを把握するために以下に依存しています。

var isLandscape: Bool {
    return UIApplication.shared.statusBarOrientation.isLandscape
}

ただし、Xcode 11 GMバージョンでは、次の非推奨の警告が表示されます。

'statusBarOrientation'はiOS 13.0で廃止されました:代わりにウィンドウシーンのinterfaceOrientationプロパティを使用してください。

ステータスバーからアプリケーションの向きを取得するにはどうすればよいですか?

6
CodeBender

Objective C、iOS 13、および古いバージョンとの互換性:

+ (BOOL)isLandscape
{
    if (@available(iOS 13.0, *)) {
        UIWindow *firstWindow = [[[UIApplication sharedApplication] windows] firstObject];
        if (firstWindow == nil) { return NO; }

        UIWindowScene *windowScene = firstWindow.windowScene;
        if (windowScene == nil){ return NO; }

        return UIInterfaceOrientationIsLandscape(windowScene.interfaceOrientation);
    } else {
        return (UIInterfaceOrientationIsLandscape(UIApplication.sharedApplication.statusBarOrientation));
    }
}

これをUIWindowカテゴリに追加しました。

0
banana1

これは簡単ではありませんか? (Swift 5、iPadOS 13.4でテスト済み)

var isLandscape: Bool {
    return UIDevice.current.orientation.isLandscape
} 

または基本的に:

let o = UIDevice.current.orientation
if o == .landscapeLeft || o == .landscapeRight {
    // Use interfaceOrientation
}

2番目のバリエーション:

if UIDevice.current.orientation.isLandscape {
    // Use interfaceOrientation
}
0
Flori