问题描述
嗨,我正在尝试创建一个时间选择器,该时间选择器仅从(2pm-9pm)开始,而分钟则增加30
GroupBy.transform
这是我的代码
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是什么问题?谢谢
解决方法
您可以使用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,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
}
}
,
问题是您还需要将日期选择器的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)
}