SwiftUI 實現(xiàn)在app內(nèi)動態(tài)更改淺色或者深色模式

我們知道swiftUI基本可以跟隨系統(tǒng)設置的淺色或者深色模式,但是有時我們需要用戶對自己應用作出自己喜歡的模式,不受系統(tǒng)影響。
大致實現(xiàn)效果如下


屏幕錄制2020-09-09 16.10.56.gif

動畫效果就不展現(xiàn)了,動畫也是一個github庫找到的,通過修改實現(xiàn),這里講實現(xiàn)模式切換不隨系統(tǒng)
1:首先如果你想你的app只有一種模式,可以在info.plist文件中設置User Interface Style 值為light或者dark

2:這種方法就是圖片展示的方法
在SceneDelegate文件中有一開始進入app觸發(fā)的方法

  func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
      
        if let windowScene = scene as? UIWindowScene {
            
            let window = UIWindow(windowScene: windowScene)
            
            let contentView = TranserView(window: window).environment(\.managedObjectContext, context)//這個本來是寫在外面的,拿進來
            
            let style = userDefault.string(forKey: "style")//獲取我們存的值,判斷進入app使用什么樣式,存值,在接下來的代碼展示
            
            switch style {
            case "dark":
                window.overrideUserInterfaceStyle = .dark//黑暗模式
            case "light":
                window.overrideUserInterfaceStyle = .light//淺色模式
            default:
                window.overrideUserInterfaceStyle = .unspecified//跟隨系統(tǒng)
            }
            
            
            window.rootViewController = MyHontingController(rootView: AnyView(contentView))
            self.window = window
            window.makeKeyAndVisible()
        }
        
      
    }

上訴代碼可以看出window是有個overrideUserInterfaceStyle方法可以用來設置我們的界面,這樣我們只要把這個值傳到我們需要更改的他的界面即可

 @State var window: UIWindow//這個定義完在按鈕中更改他的樣式
 @Environment(\.colorScheme) var colorScheme //可以用來判斷當前的模式
 Button(action: {
                            
                            self.changeModel = false
                            self.window.overrideUserInterfaceStyle = .light //更改方法
             
                            userDefault.set("light", forKey: "style") //定義的全局變量,用來存儲我們更改的樣式
                            
                        }) {
                            
                            Image(systemName: self.colorScheme == .dark ?  "circle" :"checkmark.circle.fill")
                                .foregroundColor(self.colorScheme == .dark ? .gray : .yellow)//三元表達式,用來適配黑暗模式與淺色模式切換時來更改展示的顏色
                        }.transition(.opacity)
                        

在更改后一定要寫一個本地簡單存儲,userDefault,在第一進入的時候獲取這個值,然后根據(jù)你獲取的值來判斷樣式,這樣就記住你改的樣式

https://www.bilibili.com/video/BV1ui4y1u7Kt/
這是視頻鏈接,隨便剪輯的,哈哈哈

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容