【发布时间】:2022-12-15 00:57:06
【问题描述】:
我想在我的主屏幕上切换暗模式和亮模式。我不想用 UISlider 来实现,而只是用一个按钮。你点击一次它的黑暗模式,你再次点击它的光。有可能吗?
【问题讨论】:
-
你使用的是 UIKit 还是 SwiftUi?
-
请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。
我想在我的主屏幕上切换暗模式和亮模式。我不想用 UISlider 来实现,而只是用一个按钮。你点击一次它的黑暗模式,你再次点击它的光。有可能吗?
【问题讨论】:
更新后的版本更可靠,它会检查 overrideUserInterfaceStyle,如果它是 .unspecified,则回退到 UIScreen.main.traitCollection.userInterfaceStyle
//
// ViewController.swift
// ToggleInterfaceStyle
//
// Created by Sebastian on 23.09.22.
//
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Here is the button
let toggleInterfaceStyleButton = UIButton()
toggleInterfaceStyleButton.setTitle("Toggle Color Scheme", for: .normal)
toggleInterfaceStyleButton.setTitleColor(.tintColor, for: .normal)
toggleInterfaceStyleButton.frame = CGRect(x: 15, y: -50, width: 250, height: 500)
toggleInterfaceStyleButton.addTarget(self, action: #selector(toggleInterfaceStyle), for: .touchUpInside)
self.view.addSubview(toggleInterfaceStyleButton)
}
@objc func toggleInterfaceStyle() {
let scenes = UIApplication.shared.connectedScenes
let windowScene = scenes.first as? UIWindowScene
let window = windowScene?.windows.first
let interfaceStyle = window?.overrideUserInterfaceStyle == .unspecified ? UIScreen.main.traitCollection.userInterfaceStyle : window?.overrideUserInterfaceStyle
if interfaceStyle != .dark {
window?.overrideUserInterfaceStyle = .dark
} else {
window?.overrideUserInterfaceStyle = .light
}
}
}
对于 SwiftUI,您可以使用 .preferredColorScheme 更改外观(浅色模式/深色模式),它会更改整个应用程序的外观。在此示例中,我添加了第二个视图和一个 navigationLink 以显示样式保持选中状态:
import SwiftUI
struct ContentView: View {
@State private var scheme: ColorScheme = .light
@State private var isShowingNewAccountView = false
func toggleScheme() {
if scheme == .light {
scheme = .dark
} else {
scheme = .light
}
}
var body: some View {
NavigationView() {
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundColor(.accentColor)
.padding()
Text("Hello, world!")
.padding()
NavigationLink(destination: SecondView()) {
Text("Second View")
}
Button(action: {
self.toggleScheme()
}) {
Text("Toggle Scheme")
}
.padding()
}
}
.preferredColorScheme(scheme)
}
}
struct SecondView: View {
var body: some View {
VStack {
Image(systemName: "airplane")
.imageScale(.large)
.foregroundColor(.accentColor)
.padding()
Text("Hello, second view!")
.padding()
}
}
}
【讨论】: