こんにちはコーヤです。
このページでは、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)
}
}
このコードでは、画面が横から縦に変わったときは青色、平らから横に変わったときは赤色、それ以外は緑色が表示されます。
以上です。ご参考になれば幸いです。
コメント欄