みかづきブログ・カスタム

基本的にはちょちょいのほいです。

UIScreen.main.brightnessを使って、iOSデバイスの画面輝度を取得・設定する 📱

UIScreen.main.brightness を使えば画面輝度の取得と設定ができます。

developer.apple.com

値としては0から1をfloatで取れるようなので、

UIScreen.main.brightness = 1.0 // 最大輝度
UIScreen.main.brightness = 0 // 最低輝度

というような感じで設定できます。

試しに、かつてつくった WKWebViewを設置しただけのiOSアプリ に組み込んでみましょう。

blog.kimizuka.org


ソースコード

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()
    }
}

という感じで、

❶ アクティブになった際に画面輝度を取得し保持する
❷ 画面輝度を最大に変更
❷ 表裏が切り替わる直前に画面輝度を保持したものに戻す

という処理が必要になります。

ウェブサイトからだと画面輝度の取得・設定はできないので、ネイティブアプリでラップした意味が出てきますね。