PoC를 진행하며, iPad에서 가로 및 세로 모드를 모두 지원해야 했고, 이를 위해 디바이스의 방향을 감지하는 기능이 필요했습니다. Combine
과 NotificationCenter
를 활용하여 회전을 감지하고 화면에 반영하는 방법을 사용했습니다.
목표
SwiftUI에서 화면 방향을 일관되게 감지하고 관리할 수 있도록 DeviceManager
라는 싱글톤 클래스를 구현합니다. DeviceManager
는 앱 전역에서 기기의 화면 회전을 감지하고, 이를 SwiftUI 뷰에서 구독하여 UI를 업데이트할 수 있도록 합니다.
1. DeviceManager
싱글톤 클래스 만들기
DeviceManager
는 화면 회전 상태를 관리하는 @Published
변수를 포함한 싱글톤 객체로, 방향이 바뀔 때마다 UIDevice.current.orientation
값을 업데이트하여 SwiftUI 뷰가 이를 자동으로 감지할 수 있도록 합니다.
import SwiftUI
import Combine
class DeviceManager: ObservableObject {
// 기기의 방향을 저장하는 변수
@Published var orientation: UIDeviceOrientation = UIDevice.current.orientation
static let shared = DeviceManager()
private var cancellables: Set<AnyCancellable> = []
init() {
NotificationCenter.default
.publisher(for: UIDevice.orientationDidChangeNotification)
.sink { [weak self] _ in
// 현재 기기 방향을 업데이트
self?.orientation = UIDevice.current.orientation
}
.store(in: &cancellables)
}
}
2. SwiftUI에서 DeviceManager
사용하기
DeviceManager
를 SwiftUI에서 사용하여 화면 회전 상태에 따라 UI가 업데이트되도록 만들어보겠습니다. DeviceManager.shared
를 @ObservedObject
로 구독하여 뷰가 기기의 방향 변화를 감지할 수 있도록 설정합니다.
회전할 때마다 텍스트가 가로/세로 모드로 변경되어 사용자에게 현재 방향을 표시해줍니다.
struct ContentView: View {
// DeviceManager의 싱글톤을 구독
@ObservedObject private var deviceManager = DeviceManager.shared
var body: some View {
VStack {
Text(deviceManager.orientation.isLandscape ? "Landscape" : "Portrait")
.font(.largeTitle)
.padding()
}
}
}
결론
이번 글에서는 Combine
과 NotificationCenter
를 사용하여 SwiftUI에서 화면 회전을 감지하고 관리하는 방법을 알아보았습니다. DeviceManager
클래스를 싱글톤으로 구현하여 앱 전반에서 일관되게 화면 회전 상태를 관리할 수 있게 되었고, Combine을 통해 @Published
속성의 변화를 SwiftUI 뷰가 자동으로 감지하도록 구성했습니다.
'iOS > SwiftUI' 카테고리의 다른 글
SwiftUI에서 각 탭마다 독립적인 네비게이션 스택 유지하기 (0) | 2024.11.08 |
---|---|
SwiftUI에서 UIKit의 `UINavigationController`로 화면 전환 구현하기 (0) | 2024.11.07 |
SwiftUI에서 RestAPI를 통해 서버의 데이터를 화면에 보여주기 (1) | 2024.11.07 |