DurationPicker.swift 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. //
  2. // DurationPicker.swift
  3. // LoopKitUI
  4. //
  5. // Created by Michael Pangburn on 7/15/20.
  6. // Copyright © 2020 LoopKit Authors. All rights reserved.
  7. //
  8. import SwiftUI
  9. public struct DurationPicker: UIViewRepresentable {
  10. @Binding public var duration: TimeInterval
  11. public var validDurationRange: ClosedRange<TimeInterval>
  12. public var minuteInterval: Int
  13. public init(duration: Binding<TimeInterval>, validDurationRange: ClosedRange<TimeInterval>, minuteInterval: Int = 15) {
  14. self._duration = duration
  15. self.validDurationRange = validDurationRange
  16. self.minuteInterval = minuteInterval
  17. }
  18. public func makeUIView(context: Context) -> UIDatePicker {
  19. let picker = UIDatePicker()
  20. picker.datePickerMode = .countDownTimer
  21. picker.addTarget(context.coordinator, action: #selector(Coordinator.pickerValueChanged(_:)), for: .valueChanged)
  22. return picker
  23. }
  24. public func updateUIView(_ picker: UIDatePicker, context: Context) {
  25. picker.countDownDuration = duration.clamped(to: validDurationRange)
  26. picker.minuteInterval = minuteInterval
  27. }
  28. public func makeCoordinator() -> Coordinator {
  29. Coordinator(self)
  30. }
  31. final public class Coordinator {
  32. var parent: DurationPicker
  33. init(_ parent: DurationPicker) {
  34. self.parent = parent
  35. }
  36. @objc func pickerValueChanged(_ picker: UIDatePicker) {
  37. parent.duration = picker.countDownDuration.clamped(to: parent.validDurationRange)
  38. }
  39. }
  40. }