#swift #uidatepicker
#swift #uidatepicker
Вопрос:
привет, ребята, я пытаюсь создать средство выбора времени, часы которого указаны только с (2pm — 9pm), а минуты увеличиваются на 30. это изображение TimePicker, которое я хочу создать, вот мой код
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)
}
проблема в том, что час начинается с 1-12, а минута начинается с 00-59 в чем проблема? Спасибо
Комментарии:
1. установите минимальную дату «14:00» и максимальную дату «21:00», попробуйте это.
2. не сработало: (
Ответ №1:
Проблема в том, что вам нужно установить свойство date для выбора даты, чтобы оно также соответствовало минимальной дате. Вам также необходимо установить дату форматирования даты по умолчанию на сегодня и не забудьте установить для языкового стандарта значение «en_US_POSIX» при анализе строки даты время:
extension Formatter {
static let time: DateFormatter = {
let formatter = DateFormatter()
formatter.locale = .init(identifier: "em_US_POSIX")
formatter.dateFormat = "HH:mm"
return formatter
}()
}
let timePicker = UIDatePicker()
func creatTimePicker() {
Formatter.time.defaultDate = Calendar.current.startOfDay(for: Date())
let minimumDate = Formatter.time.date(from: "14:00")!
let maximumDate = Formatter.time.date(from: "21:00")!
timePicker.date = minimumDate
timePicker.datePickerMode = .time
timePicker.minuteInterval = 30
timePicker.minimumDate = minimumDate
timePicker.maximumDate = maximumDate
self.contentView.addSubview(timePicker)
}
Комментарии:
1. спасибо, Лео, за вашу помощь, но как я могу показывать ТОЛЬКО часы с 5-9??
2. Что вы имеете в виду?
minuteInterval = 60
и изменитеminimumDate
иmaximumDate
Ответ №2:
Вы можете использовать Calendar
для ограничения временного диапазона для 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
Это не позволит пользователю выбирать время за пределами указанного временного диапазона.
На случай, если вы хотите показывать только эти часы
Вы можете использовать UIPickerView
Пример:
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
}
}
Комментарии:
1. большое вам спасибо за вашу помощь единственное, что я рассматриваю сейчас, это диапазон часов, чтобы показывать только 5-9. вышеуказанные функции просто включают часы 5-9, но все еще показывают 1-12 !! ?
2. Вам придется создавать
UIPickerView
со строками компонента, которые вы добавляете вручную из 5-9. В противном случае вы не сможете скрыть их вUIDatePicker