iOS Swift Date Picker выберите следующий интервал - PullRequest
0 голосов
/ 28 апреля 2018

Мне было интересно, есть ли способ выбрать дату выбора времени для следующего интервала, а не для ближайшего: если это 1:47, я хочу, чтобы средство выбора отображало 2:00, а не 1:45 .. есть ли атрибут для UIDatePicker для выбора следующего интервала?

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

Спасибо за любую помощь.

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

Вам нужно добавить цель для вашего средства выбора даты для 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

0 голосов
/ 28 апреля 2018

Полагаю, не совсем понятно, что я имею в виду. Я написал эту функцию, которая устанавливает время выбора следующего интервала. Я не знаю, правильно ли это, но это работает:

  • Дата 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 Time на следующий 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!
}
0 голосов
/ 28 апреля 2018

Класс UIDatePicker не имеет функциональности. Вы можете заблокировать селектор только для того, чтобы разрешить определенные значения (например, если вы установите datePicker.minuteInterval = 15, доступные выборы начнутся с начального времени и начнутся через 15 минут).

Вы можете реализовать это поведение самостоятельно, прослушивая уведомление об изменении значения и устанавливая время вручную (желательно с анимацией).

...