我們知道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/
這是視頻鏈接,隨便剪輯的,哈哈哈