【问题标题】:How to make button for Dark Mode如何为暗模式制作按钮
【发布时间】:2022-12-15 00:57:06
【问题描述】:

我想在我的主屏幕上切换暗模式和亮模式。我不想用 UISlider 来实现,而只是用一个按钮。你点击一次它的黑暗模式,你再次点击它的光。有可能吗?

【问题讨论】:

  • 你使用的是 UIKit 还是 SwiftUi?
  • 请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。

标签: swift xcode uikit


【解决方案1】:

UI工具包

更新

更新后的版本更可靠,它会检查 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()
        }
    }
}

【讨论】:

  • 我认为这是 UIKit 而不是 SwiftUI。至少“UISlider”暗示了这一点。
  • 你是对的,对不起,我错过了。
  • 谢谢! @塞巴斯蒂安福克斯。但是我错误地写了我的问题。这个按钮应该改变每个屏幕的亮/暗样式,不仅是主屏幕,我总共有 4 个 VC。怎么做?我猜它是 objc func 中的东西?
  • 嗨@Sirius,我更新了 UIKit 部分。现在它应该改变整个应用程序中的样式。它不是当前视图的样式,而是更改窗口的样式。在我的测试代码中它运行良好(在 gif 中没有看到,它仍然是旧的 gif)。
猜你喜欢
  • 1970-01-01
  • 2021-08-12
  • 2022-01-23
  • 2021-02-18
  • 1970-01-01
  • 2020-08-05
  • 2022-08-16
  • 1970-01-01
  • 2020-08-22
相关资源
最近更新 更多