Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Restricting hours and minutes in DatePicker- swift?

hi guys im trying to create a time picker which hours are only from (2pm - 9pm) and minutes are incremented by 30 this is the picture of timePicker that i want to create here is my code

func creatTimePicker() {
        timePicker.datePickerMode = .time
        timePicker.minuteInterval = 30
        let timeformatter = DateFormatter()
        timeformatter.dateFormat = "HH:mm"

        let min = timeformatter.date(from: "5:00")
        let max = timeformatter.date(from: "9:00")
        timePicker.minimumDate = min
        timePicker.maximumDate = max
        self.contentView.addSubview(timePicker)
    } 

the problem is hour starts 1-12 and minute starts 00-59 what is the problem? thank you

like image 732
David Harinson Avatar asked Nov 09 '25 02:11

David Harinson


1 Answers

You can use Calendar to constraint the time range for UIDatePicker()

        let picker = UIDatePicker()
        picker.datePickerMode = .time
        
        let minDate = Calendar.current.date(bySettingHour: 14, minute: 0, second: 0, of: Date()) // 2PM
        
        let maxDate = Calendar.current.date(bySettingHour: 21, minute: 0, second: 0, of: Date()) // 9PM
    
        picker.minimumDate = minDate
        picker.maximumDate = maxDate

This won't let user select time outside the specified time range.

In case you want to show only these hours

You can use UIPickerView

Example:

let picker = UIPickerView()
picker.dataSource = self
picker.delegate = self

let hoursRange = Array(5...9)

// Data source

func numberOfComponents(in: UIPickerView) -> Int {
        return 2
    }
    
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        print("Com :\(component)")
        if component == 0 {
            return hoursRange.count
        }
        
        return 1 // For the PM indicator
    }

// Delegate
    
func pickerView(_ pickerView: UIPickerView,
     titleForRow row: Int,
     forComponent component: Int) -> String? {
        switch component {
        case 0:
            return "\(hoursRange[row])"
        case 1:
            return "AM"
        default:
            return nil
        }
    }

like image 154
Patryk Budzinski Avatar answered Nov 12 '25 07:11

Patryk Budzinski



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!