15
Apr
2022
SwiftUI Device Orientation Change Observer
Reading time: 1 min
This recipe shows how to detect device orientation in SwiftUI. You can also use a binding to detect orientation changes.
The end result looks like this:
The recipe relies on listening to UIDevice.orientationDidChangeNotification
notifications, which are automatically posted whenever device orientation changes. Here's the code:
struct OrientationDetector: ViewModifier {
@Binding var orientation: UIDeviceOrientation
func body(content: Content) -> some View {
content
.onReceive(NotificationCenter.default.publisher(for: UIDevice.orientationDidChangeNotification)) { _ in
orientation = UIDevice.current.orientation
}
}
}
extension View {
func detectOrientation(_ binding: Binding<UIDeviceOrientation>) -> some View {
self.modifier(OrientationDetector(orientation: binding))
}
}
Then, building an orientation-aware view is as easy as this:
struct OrientationTest: View {
@State private var orientation = UIDevice.current.orientation
var body: some View {
Group {
if orientation.isLandscape {
Text("I'm in landscape!")
} else {
Text("I'm in portrait!")
}
}
.detectOrientation($orientation)
}
}