Saltar al contenido

Implementar el cambio de modo oscuro en la aplicación SwiftUI

Este post ha sido evaluado por expertos así se garantiza la exactitud de nuestro tutorial.

Solución:

Vista única

Para cambiar el esquema de color de una sola vista (podría ser la principal ContentView de la aplicación), puede utilizar el siguiente modificador:

.environment(.colorScheme, .light) // or .dark

o

.preferredColorScheme(.dark)

Además, puedes aplicarlo a la ContentView para oscurecer toda tu aplicación.

Asumiendo que no cambiaste el ContentView nombre en escena delegado o @main


Toda la aplicación (incluida la UIKit partes y el SwiftUI)

Primero debe acceder a la ventana para cambiar el esquema de color de la aplicación que llamó UserInterfaceStyle en UIKit.

Usé esto en SceneDelegate:

private(set) static var shared: SceneDelegate?

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) 
    Self.shared = self
    ...

Luego, debe vincular una acción a la palanca. Así que necesitas un modelo para ello.

struct ToggleModel 
    var isDark: Bool = true 
        didSet  
            SceneDelegate.shared?.window!.overrideUserInterfaceStyle = isDark ? .dark : .light 
        
    

Por último, solo necesita alternar el interruptor:

struct ContentView: View 
     @State var model = ToggleModel()

     var body: some View 
         Toggle(isOn: $model.isDark) 
             Text("is Dark")
        
    


Desde la parte UIKit de la aplicación

Cada UIView tiene acceso a la ventana, por lo que puede usarlo para configurar el . overrideUserInterfaceStyle valor a cualquier esquema que necesite.

myView.window?.overrideUserInterfaceStyle = .dark

Una demostración de uso @AppStorage para cambiar el modo oscuro

PD: para el cambio global, el modificador debe agregarse a WindowGroup/MainContentView

import SwiftUI

struct SystemColor: Hashable 
    var text: String
    var color: Color


let backgroundColors: [SystemColor] = [.init(text: "Red", color: .systemRed), .init(text: "Orange", color: .systemOrange), .init(text: "Yellow", color: .systemYellow), .init(text: "Green", color: .systemGreen), .init(text: "Teal", color: .systemTeal), .init(text: "Blue", color: .systemBlue), .init(text: "Indigo", color: .systemIndigo), .init(text: "Purple", color: .systemPurple), .init(text: "Pink", color: .systemPink), .init(text: "Gray", color: .systemGray), .init(text: "Gray2", color: .systemGray2), .init(text: "Gray3", color: .systemGray3), .init(text: "Gray4", color: .systemGray4), .init(text: "Gray5", color: .systemGray5), .init(text: "Gray6", color: .systemGray6)]

struct DarkModeColorView: View 

    @AppStorage("isDarkMode") var isDarkMode: Bool = true

    var body: some View 
        Form 
            Section(header: Text("Common Colors")) 
                ForEach(backgroundColors, id: .self) 
                    ColorRow(color: $0)
                
            
        
        .toolbar 
            ToolbarItem(placement: .principal)  // navigation bar
               Picker("Color", selection: $isDarkMode) 
                    Text("Light").tag(false)
                    Text("Dark").tag(true)
                
                .pickerStyle(SegmentedPickerStyle())
            
        
        .modifier(DarkModeViewModifier())
    


private struct ColorRow: View 

    let color: SystemColor

    var body: some View 
        HStack 
            Text(color.text)
            Spacer()
            Rectangle()
                .foregroundColor(color.color)
                .frame(width: 30, height: 30)
        
    


public struct DarkModeViewModifier: ViewModifier 

    @AppStorage("isDarkMode") var isDarkMode: Bool = true

    public func body(content: Content) -> some View 
        content
            .environment(.colorScheme, isDarkMode ? .dark : .light)
            .preferredColorScheme(isDarkMode ? .dark : .light) // tint on status bar
    


struct DarkModeColorView_Previews: PreviewProvider 
    static var previews: some View 
        NavigationView 
            DarkModeColorView()
        
    

ingrese la descripción de la imagen aquí

Te mostramos las reseñas y valoraciones de los usuarios

Tienes la opción de asistir nuestra investigación añadiendo un comentario o puntuándolo te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *