【问题标题】:iOS Swift Date Picker select next intervaliOS Swift 日期选择器选择下一个间隔
【发布时间】:2018-04-27 23:02:39
【问题描述】:

我想知道是否有办法将时间选择器的日期选择到下一个间隔而不是最近的时间间隔:如果是 1:47,我希望选择器显示 2:00 而不是 1:45.. 是UIDatePicker 有什么属性可以选择下一个Interval?

let datePicker = UIDatePicker()
datePicker.datePickerMode = UIDatePickerMode.time
datePicker.minuteInterval = 15

感谢您的帮助。

【问题讨论】:

  • 什么意思?
  • 我设置了 15 分钟的间隔,如果是 1:47,我希望选择器显示 2:00 而不是 1:45 .. UIDatePicker 是否有任何属性可以选择下一个间隔,不是最近的?对不起,如果我没有说清楚。
  • 您应该编辑您的问题以包含这些详细信息。
  • 设置最小日期就是这样,如果你选择了1:47,用户将无法选择1:45

标签: ios swift datepicker intervals


【解决方案1】:

您需要为 UIControlEvents .valueChanged 的日期选择器添加一个目标,并从所选日期获取分钟组件。要计算下一小时的一刻钟,您可以使用以下公式(x - x % 15 + 15) % 60

import UIKit
class ViewController: UIViewController {
    @IBOutlet weak var datePicker: UIDatePicker!
    override func viewDidLoad() {
        super.viewDidLoad()
        datePicker.addTarget(self, action: #selector(datePickerValueChanged), for: .valueChanged)
    }
    @objc func datePickerValueChanged(datePicker: UIDatePicker) {
        if datePicker.date.minute % 15 != 0 {
            if datePicker.date.minute > 45 {
                datePicker.date += 60*60
            }
            datePicker.date = datePicker.date.nextHourQuarter
        } 
    }
}

extension Int {
    var nextHourQuarter: Int {
        return (self - self % 15 + 15) % 60
    }
}

extension Date {
    var hour: Int { return Calendar.current.component(.hour, from: self) }
    var minute: Int { return Calendar.current.component(.minute, from: self) }
    var nextHourQuarter: Date {
        return  Calendar.current.date(bySettingHour: hour, minute: minute.nextHourQuarter, second: 0, of: self)!
    }
}

Sample

【讨论】:

  • 嗨 Leo,非常感谢您的回答。根据您的建议,我编写了一个函数,它完全符合我的意思:8:03 -> 选择器日期是 8:15; 8:23 -> 选择日期为 8:30; 8:38 -> 选择日期为 8:45; 8:46 -> 选择器日期是 9:00...我对 swift 很陌生,所以我希望我的功能是正确的,至少它可以工作
  • @N.Beer 我已经发布了一个示例项目,因此您可以查看测试它。如果您有不明白的地方,请告诉我。
【解决方案2】:

UIDatePicker 类没有该功能。您只能锁定选择器以允许某些值(例如,如果您设置 datePicker.minuteInterval = 15,则可用的选择将从初始时间开始并以 15 分钟为单位)。

您可以通过收听值更改通知并手动设置时间(最好使用动画)来自己实现此行为。

【讨论】:

    【解决方案3】:

    我想我的意思还不清楚。 我编写了这个函数,它将选择器时间设置为下一个间隔。 我不知道它是否正确,但它有效:

    • 日期 8:03 -> 选择器日期为 8:15
    • 日期 8:23 -> 选择器日期为 8:30
    • 日期 8:38 -> 选择器日期为 8:45
    • 日期 8:46 -> 选择器日期为 9:00

    viewDidLoad:

    let datePicker = UIDatePicker()
    datePicker.datePickerMode = UIDatePickerMode.time
    datePicker.minuteInterval = 15
    datePicker.date = setDatePickerTime(datePicker: datePicker)
    

    将 DatePicker 时间设置为下一个 15 分钟间隔

    func setDatePickerTime(datePicker: UIDatePicker) -> Date {
      let calendar = Calendar.current
      let currentHour = calendar.component(.hour, from: Date())
      let currentMinute = calendar.component(.minute, from: Date())
    
      let dateFormatter = DateFormatter()
      dateFormatter.dateFormat =  "HH:mm"
    
      var pickerOutHour = ""
      var pickerOutMinute = ""
    
      if (currentMinute > 45 && currentMinute < 60){
          pickerOutMinute = "00"
          pickerOutHour = String((Int(currentHour) + 1) % 24)
      } else if (currentMinute > -1 && currentMinute < 16){
          pickerOutMinute = "15"
          pickerOutHour = String(currentHour)
      } else if (currentMinute > 15 && currentMinute < 31){
          pickerOutMinute = "30"
          pickerOutHour = String(currentHour)
      } else if (currentMinute > 30 && currentMinute < 46){
          pickerOutMinute = "45"
          pickerOutHour = String(currentHour)
      }
    
      let pickerOutDate = dateFormatter.date(from: pickerOutHour + ":" + pickerOutMinute)
      return pickerOutDate!
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-22
      • 2016-06-02
      • 2019-01-20
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      相关资源
      最近更新 更多