DateAndDurationSteppableTableViewCell.swift 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. //
  2. // DateAndDurationSteppableTableViewCell.swift
  3. // LoopKitUI
  4. //
  5. // Copyright © 2020 LoopKit Authors. All rights reserved.
  6. //
  7. import UIKit
  8. public class DateAndDurationSteppableTableViewCell: DatePickerTableViewCell {
  9. public weak var delegate: DatePickerTableViewCellDelegate?
  10. @IBOutlet public weak var titleLabel: UILabel!
  11. @IBOutlet public weak var dateLabel: UILabel! {
  12. didSet {
  13. dateLabel.textColor = .secondaryLabel
  14. }
  15. }
  16. @IBOutlet weak var incrementButton: UIButton!
  17. @IBOutlet weak var decrementButton: UIButton!
  18. public var timeStepSize: TimeInterval = .minutes(15)
  19. public override var isDatePickerHidden: Bool {
  20. didSet {
  21. dateLabel.textColor = isDatePickerHidden ? .secondaryLabel : window?.tintColor
  22. }
  23. }
  24. private lazy var durationFormatter: DateComponentsFormatter = {
  25. let formatter = DateComponentsFormatter()
  26. formatter.allowedUnits = [.hour, .minute]
  27. formatter.unitsStyle = .short
  28. return formatter
  29. }()
  30. private lazy var dateFormatter: DateFormatter = {
  31. let dateFormatter = DateFormatter()
  32. dateFormatter.doesRelativeDateFormatting = true
  33. dateFormatter.dateStyle = .none
  34. dateFormatter.timeStyle = .short
  35. return dateFormatter
  36. }()
  37. public override func updateDateLabel() {
  38. if dateFormatter.doesRelativeDateFormatting {
  39. dateFormatter.dateStyle = Calendar.current.isDateInToday(date) ? .none : .short
  40. }
  41. switch datePicker.datePickerMode {
  42. case .countDownTimer:
  43. dateLabel.text = durationFormatter.string(from: duration)
  44. case .date, .dateAndTime, .time:
  45. dateLabel.text = dateFormatter.string(from: date)
  46. @unknown default:
  47. break // Do nothing
  48. }
  49. updateButtonState()
  50. }
  51. public override func dateChanged(_ sender: UIDatePicker) {
  52. super.dateChanged(sender)
  53. delegate?.datePickerTableViewCellDidUpdateDate(self)
  54. }
  55. @IBAction func incrementTime(_ sender: UIButton) {
  56. date = date.addingTimeInterval(timeStepSize)
  57. }
  58. @IBAction func decrementTime(_ sender: UIButton) {
  59. date = date.addingTimeInterval(-timeStepSize)
  60. }
  61. private func updateButtonState() {
  62. // since the picker sets the seconds to 0, compare in the same way
  63. if let maximumDate = datePicker.maximumDate {
  64. let order = Calendar.current.compare(date, to: maximumDate, toGranularity: .minute)
  65. incrementButton.isEnabled = order == .orderedAscending
  66. }
  67. if let minimumDate = datePicker.minimumDate {
  68. let order = Calendar.current.compare(date, to: minimumDate, toGranularity: .minute)
  69. decrementButton.isEnabled = order == .orderedDescending
  70. }
  71. }
  72. }