es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se puede arrastrar o eliminar la vista de seleccionador de colores (UIColorPickerViewController).

Estoy mostrando un UIColorPickerViewController como una vista utilizando el método sheet(), todo funciona bien pero no puedo arrastrar o cerrar la vista.

“`
import Foundation
import SwiftUI

struct ColorPickerView: UIViewControllerRepresentable {
private var selectedColor: UIColor!

init(selectedColor: UIColor) {
    self.selectedColor = selectedColor
}

func makeUIViewController(context: Context) -> UIColorPickerViewController {
    let colorPicker = UIColorPickerViewController()
    colorPicker.selectedColor = self.selectedColor

    return colorPicker
}

func updateUIViewController(_ uiViewController: UIColorPickerViewController, context: Context) {
    // Silencioso
}

}

.sheet(isPresented: self.$viewManager.showSheet, onDismiss: {
ColorPickerView()
})

¿Alguna idea sobre cómo hacer que el gesto de arrastrar/cerrar funciona?

¡Gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para habilitar el gesto de arrastrar/bajar para deshacer una hoja que muestra un UIColorPickerViewController, necesitas agregar un UIHostingController a la jerarquía de vistas de SwiftUI, y luego presentar el UIColorPickerViewController en forma modal encima de ésta.

    Aquí te presentamos una versión actualizada de tu ColorPickerView que implementa esto:

    struct ColorPickerView: View {
        @Binding var selectedColor: UIColor
        @Environment(\.presentationMode) private var presentationMode
    
        var body: some View {
            ZStack {
                Color.white // Este es sólo un color de relleno, sustitúyelo con el color de fondo de tu preferencia
    
                VStack {
                    Spacer()
    
                    ColorPicker("Selecciona un color", selection: $selectedColor)
    
                    Spacer()
    
                    Button("Listo") {
                        presentationMode.wrappedValue.dismiss()
                    }
                }
                .padding()
            }
        }
    }
    
    struct ContentView: View {
        @State private var selectedColor = UIColor.red
        @State private var showColorPicker = false
    
        var body: some View {
            Button(action: {
                showColorPicker = true
            }) {
                Text("Escoge un color")
                    .foregroundColor(Color(selectedColor))
            }
            .sheet(isPresented: $showColorPicker) {
                // Crea un UIHostingController para el ColorPickerView
                let hostingController = UIHostingController(rootView: ColorPickerView(selectedColor: $selectedColor))
    
                // Presenta el controlador de alojamiento en forma modal
                if let window = UIApplication.shared.windows.first {
                    hostingController.modalPresentationStyle = .popover
                    window.rootViewController?.present(hostingController, animated: true)
                }
            }
        }
    }
    

    En esta implementación, la hoja es activada por un botón, y el ColorPickerView se presenta en forma modal usando un UIHostingController. El ColorPickerView es simplemente una vista de SwiftUI que envuelve un ColorPicker, e incluye un botón de Listo para descartar la vista cuando el usuario termina de seleccionar un color.

    Ten en cuenta que cuando presentas una vista en forma modal, necesitas especificar un modalPresentationStyle, que en este caso se establece en .popover. Esto permite al usuario deshacer la vista arrastrando hacia abajo.

    Espero que esto te ayude. Hazme saber si tienes más preguntas.

Comments are closed.