UIScreen.main.brightness を使えば画面輝度の取得と設定ができます。
値としては0から1をfloatで取れるようなので、
UIScreen.main.brightness = 1.0 // 最大輝度
UIScreen.main.brightness = 0 // 最低輝度
というような感じで設定できます。
試しに、かつてつくった WKWebViewを設置しただけのiOSアプリ に組み込んでみましょう。
ソースコード
ContentView.swift
import SwiftUI var urlString = "https://google.co.jp" struct ContentView: View { var body: some View { WebView(urlString: urlString).onAppear { print("appear") UIScreen.main.brightness = 1.0 // 追加 }.onDisappear { print("disapper") } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
WebView.swift(前回から変更なし)
import SwiftUI import WebKit struct WebView: UIViewRepresentable { var urlString: String func makeUIView(context: Context) -> WKWebView { let config = WKWebViewConfiguration() config.allowsInlineMediaPlayback = true return WKWebView(frame: .zero, configuration: config) } func updateUIView(_ uiView: WKWebView, context: Context) { guard let url = URL(string: urlString) else { return } uiView.load(URLRequest(url: url)) } }
コードとしてはContentView.swiftに1行追加したのみです。
これだけで、アプリを起動した際に画面輝度が最大になります。
ただし、一旦アプリを裏に回してからフォアグラウンドに戻した際には実行されません。
フォアグラウンドにも対応しようとすると、
ContentView.swift
import SwiftUI var urlString = "https://google.co.jp" struct ContentView: View { @Environment(\.scenePhase) private var scenePhase @State private var defaultBrightness: CGFloat = UIScreen.main.brightness var body: some View { WebView(urlString: urlString).onAppear { print("appear") }.onDisappear { print("disapper") }.onChange(of: scenePhase) { phase in if phase == .background { print("background") } if phase == .active { print("active") self.defaultBrightness = UIScreen.main.brightness; // ❶ 現在の画面輝度を保持 UIScreen.main.brightness = 1.0 // ❷ 画面の明るさを最大にする } if phase == .inactive { print("inactive") UIScreen.main.brightness = defaultBrightness; // ❸ 画面輝度を保持したものに戻す } } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
という感じで、
❶ アクティブになった際に画面輝度を取得し保持する
❷ 画面輝度を最大に変更
❷ 表裏が切り替わる直前に画面輝度を保持したものに戻す
という処理が必要になります。
ウェブサイトからだと画面輝度の取得・設定はできないので、ネイティブアプリでラップした意味が出てきますね。