Open2

001. Swift 非アクティブになった時にUIを隠す

phihashphihash

Model

import SwiftUI

@MainActor
class AppStateObserver: ObservableObject {
    @Published var shouldHideContent = false

    init() {
        // アプリが非アクティブになる直前(Appスイッチャーなど)
        NotificationCenter.default.addObserver(forName: UIScene.willDeactivateNotification, object: nil, queue: .main) { _ in
            self.shouldHideContent = true
        }
        // アプリがアクティブ状態に戻ったとき
        NotificationCenter.default.addObserver(forName: UIScene.didActivateNotification, object: nil, queue: .main) { _ in
            self.shouldHideContent = false
        }
    }
}

import SwiftUI

struct ContentView: View {
    @StateObject private var appState = AppStateObserver()

    var body: some View {
        ZStack {
            // メインのUI
            VStack {
                Text("Hello World")
            }

            // 非アクティブ時に画面を覆う黒いビュー
            if appState.shouldHideContent {
                Color.black
                    .ignoresSafeArea()
            }
        }
    }
}

phihashphihash

init内に、通知を送ったり受け取ったりする司令塔的な存在NotificationCenterのdefaultのaddObserverでリスナーを登録する処理をかく
forName: は「どの通知か」を「UIScene.hogehoge」で指定する
object: nil,
queue: .main

通知名 タイミング
willDeactivateNotification アプリが バックグラウンドに行く直前
didEnterBackgroundNotification 完全にバックグラウンドになったとき
willEnterForegroundNotification バックから戻ってくる直前
didActivateNotification フォアグラウンド(操作可能)になったとき