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.

¿Cómo puedo cambiar el color de selección del rango de calendario en Swift?

Quiero cambiar el color de fondo de la fecha de selección desde la primera hasta la última fecha oscura y entre un color claro. He investigado otras preguntas pero no está funcionando. Todo lo que quiero hacer es cambiar el color de la fecha de inicio y de fin. Me resulta difícil creer que no pueda hacer una tarea aparentemente simple. Estoy intentando cambiar el color en el rango de fechas pero tengo dificultades. Estoy compartiendo una imagen de referencia.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para cambiar el color de fondo del rango de fechas seleccionado en el UIDatePicker, necesitamos utilizar el método delegado datePicker(_:didSelectDates:). Este método se llama cuando un usuario selecciona una fecha y pasa un array de fechas seleccionadas como parámetro. Utilizando este método, podemos establecer el color de fondo del rango de fechas seleccionado.

    Aquí está cómo lograrlo:

    1. Declarar una propiedad para almacenar la fecha de inicio y la fecha de fin del rango seleccionado:
    var selectedStartDate: Date?
    var selectedEndDate: Date?
    
    1. Implementar el método datePicker(_:didSelectDates:) y establecer el color de fondo del rango de fechas:
    func datePicker(_ datePicker: UIDatePicker, didSelectDates dates: [Date]) {
        guard dates.count > 1 else {
            selectedStartDate = nil
            selectedEndDate = nil
            return
        }
    
        // Ordenar el array de fechas en orden ascendente
        let sortedDates = dates.sorted()
    
        // Establecer la fecha de inicio y fin del rango seleccionado
        selectedStartDate = sortedDates.first
        selectedEndDate = sortedDates.last
    
        // Recorrer las celdas visibles y establecer el color de fondo de las fechas
        for i in 0...datePicker.numberOfComponents - 1 {
            let view = datePicker.subviews[i].subviews.first(where: { String(describing: $0.classForCoder) == "UIDatePickerWeekMonthDayView" })
    
            let startRow = datePicker.selectedRow(inComponent: i)
            let endRow = datePicker.selectedRow(inComponent: i + 1)
    
            for j in startRow...endRow {
                if let dayView = view?.subviews[j] as? UILabel, let date = dayView.date {
                    if date == selectedStartDate {
                        dayView.backgroundColor = UIColor.darkGray
                        dayView.textColor = UIColor.white
                    } else if date == selectedEndDate {
                        dayView.backgroundColor = UIColor.darkGray
                        dayView.textColor = UIColor.white
                    } else if date > selectedStartDate! && date < selectedEndDate! {
                        dayView.backgroundColor = UIColor.lightGray
                        dayView.textColor = UIColor.black
                    } else {
                        dayView.backgroundColor = UIColor.clear
                        dayView.textColor = UIColor.darkGray
                    }
                }
            }
        }
    }
    

    Primero verificamos si hay al menos dos fechas seleccionadas. Si no es así, restablecemos las fechas de inicio y fin a nil. Si hay dos o más fechas seleccionadas, las ordenamos en orden ascendente y establecemos las propiedades de fecha de inicio y fin en consecuencia.

    A continuación, recorremos las celdas visibles del picker de fechas y establecemos el color de fondo y el color de texto de las fechas según su posición con respecto a las fechas de inicio y fin.

    Si la fecha es la fecha de inicio o fin, establecemos el color de fondo como gris oscuro y el color de texto como blanco.

    Si la fecha está entre las fechas de inicio y fin, establecemos el color de fondo como gris claro y el color de texto como negro.

    De lo contrario, establecemos el color de fondo como transparente y el color de texto como gris oscuro.

    Ten en cuenta que esta solución depende de la estructura interna de UIDatePicker, que puede cambiar en futuras versiones de iOS. Úsalo bajo tu propio riesgo.

Comments are closed.