【SwiftUI】画面の向きの変化の履歴を取る方法

こんにちはコーヤです。

このページでは、SwiftUIで画面の向きの変化の履歴を取る方法をご紹介します。

以下のバージョンで動作確認しています。

  • Xcode 14.2
  • Swift 5.7.2

このページは下記ページの続きです。

1つ前の画面の向きを保存する方法

画面の向きを格納する変数を2つ用意して、画面の向きが変わるたびに変数を上書きします。

struct ContentView: View {
    
    @State var currentOrientation: UIDeviceOrientation
    @State var previousOrientation: UIDeviceOrientation
    
    var body: some View {
        //
        }
        .onReceive(NotificationCenter.default.publisher(for: UIDevice.orientationDidChangeNotification)) { _ in
            self.previousOrientation = currentOrientation
            currentOrientation = UIDevice.current.orientation
        }
    }
}

例えば画面が縦から横に変わったとき、previousOrientationは縦、currentOrientationは横となります。

ソースコード

import SwiftUI

struct ContentView: View {
    
    @State var currentOrientation: UIDeviceOrientation
    @State var previousOrientation: UIDeviceOrientation
    
    var body: some View {
        ZStack {
            if previousOrientation.isLandscape && currentOrientation.isPortrait  {
                BlueView()
            } else if previousOrientation.isFlat && currentOrientation.isLandscape {
                RedView()
            } else {
                GreenView()
            }
        }
        .onReceive(NotificationCenter.default.publisher(for: UIDevice.orientationDidChangeNotification)) { _ in
            self.previousOrientation = currentOrientation
            currentOrientation = UIDevice.current.orientation
        }
    }
}

struct BlueView: View {
    var body: some View {
        Text("Blue")
            .font(.largeTitle)
            .frame(width: longLength, height: longLength)
            .background(Color.blue)
    }
}

struct RedView: View {
    var body: some View {
        Text("Red")
            .font(.largeTitle)
            .frame(width: longLength, height: shortLength)
            .background(Color.red)
    }
}

struct GreenView: View {
    var body: some View {
        Text("Green")
            .font(.largeTitle)
            .frame(width: longLength, height: shortLength)
            .background(Color.green)
    }
}

let longLength: CGFloat = 300
let shortLength: CGFloat = longLength * 0.5

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView(currentOrientation: .unknown, previousOrientation: .unknown)
    }
}

このコードでは、画面が横から縦に変わったときは青色、平らから横に変わったときは赤色、それ以外は緑色が表示されます。

以上です。ご参考になれば幸いです。

コメント欄