SwiftUIの基本を身につけたい方はこちら

【Xcode/Swift】UIScreen.mainが非推奨になった。’main’ will be deprecated in a future version of iOS

事象

UIScreen.mainを使おうとすると、以下の警告が表示されます。画面の横幅を、UIScreen.main.bounds.widthとかで取れる便利なものですが、、非推奨になっちゃったみたいですね。

‘main’ will be deprecated in a future version of iOS:
Use a UlScreen instance found through context instead: i.e, view.window.windowScene.screen

対応方法

これからは、以下のように使います。

guard let window = UIApplication.shared.connectedScenes.first as? UIWindowScene else { return }
let screenSize = window.screen.bounds
let screenWidth = screenSize.width
let screenHeight = screenSize.height

ちょっと長いので、私は以下のような構造体を別ファイルで作成して使っています。

struct DisplayInfo {
    private static var window: UIWindowScene? {
        return UIApplication.shared.connectedScenes.first as? UIWindowScene
    }
    
    static var screenSize: CGRect {
        return window?.screen.bounds ?? CGRect.zero
    }
    
    static var width: CGFloat {
        return screenSize.width
    }
    
    static var height: CGFloat {
        return screenSize.height
    }
}

使い方は簡単で、以下のようにDisplayInfo.widthというふうに書けます。

struct SomeView: View {
    var body: some View {
        if DisplayInfo.width > 600 {
            // 600ピクセル以上の幅のデバイスに対してのビュー
        } else {
            // それ以下のデバイスに対してのビュー
        }
    }
}

評価