SleepTimeViewController.swift 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. //
  2. // SleepTimeViewController.swift
  3. // ColorfulWallpaper
  4. //
  5. // Created by nkl on 2024/9/26.
  6. //
  7. import Combine
  8. import Foundation
  9. import KLExtension
  10. let kSleepModelKey = "SleepModelKey"
  11. class SleepTimeViewController: LWBaseViewController, UIPickerViewDataSource, UIPickerViewDelegate {
  12. lazy var bgView: UIView = .simpleView(color: .hexColor("#01143C"))
  13. lazy var titleLabel: UILabel = .simpleLabel(text: "Sleep Mode".localized(), font: .boldSystemFont18, color: .white)
  14. lazy var dismissControl: UIControl = {
  15. let control = UIControl()
  16. control.addTarget(self, action: #selector(dismissCurrentVc), for: .touchUpInside)
  17. return control
  18. }()
  19. lazy var switchButton: UISwitch = {
  20. let btn = UISwitch()
  21. btn.onTintColor = UIColor.hexColor("#56A4E9")
  22. btn.addTarget(self, action: #selector(startSleepCountDown(sender:)), for: .valueChanged)
  23. return btn
  24. }()
  25. lazy var customPickerView: UIPickerView = {
  26. let pick = UIPickerView()
  27. pick.dataSource = self
  28. pick.delegate = self
  29. return pick
  30. }()
  31. lazy var timeView: UIButton = {
  32. let btn = UIButton()
  33. btn.setTitle("00:00:00", for: .normal)
  34. btn.setTitleColor(.white, for: .normal)
  35. btn.titleLabel?.font = .systemFont(ofSize: 18)
  36. btn.setImage(UIImage(named: "ic_clock_time_large"), for: .normal)
  37. let spacing: CGFloat = 10.0
  38. btn.imageEdgeInsets = UIEdgeInsets(top: 0, left: -spacing / 2, bottom: 0, right: spacing / 2)
  39. btn.titleEdgeInsets = UIEdgeInsets(top: 0, left: spacing / 2, bottom: 0, right: -spacing / 2)
  40. btn.contentEdgeInsets = UIEdgeInsets(top: 0, left: spacing / 2, bottom: 0, right: spacing / 2)
  41. return btn
  42. }()
  43. let hours = Array(0 ... 23)
  44. let minutes = Array(0 ... 59)
  45. private var cancellables: [AnyCancellable] = []
  46. override func viewDidLoad() {
  47. super.viewDidLoad()
  48. view.backgroundColor = .black.withAlphaComponent(0.6)
  49. addNotifaction()
  50. /// 默认为1分钟
  51. if PlayerManager.shared.sleepModel.countTime == 0 {
  52. PlayerManager.shared.sleepModel.countTime = 0
  53. }
  54. }
  55. @objc func startSleepCountDown(sender: UISwitch) {
  56. if PlayerManager.shared.sleepModel.countTime == 0 {
  57. sender.isOn = false
  58. return
  59. }
  60. PlayerManager.shared.sleepModel.isOpen = sender.isOn
  61. if sender.isOn {
  62. PlayerManager.shared.player?.countDownTime()
  63. } else {
  64. PlayerManager.shared.player?.stopTimer()
  65. }
  66. dismissCurrentVc()
  67. }
  68. func selectTime(time: TimeInterval) {
  69. timeView.setTitle(time.hhmmss, for: .normal)
  70. let hour = Int(time) / 3600
  71. let minute = (Int(time) % 3600) / 60
  72. if let index = hours.firstIndex(of: hour) {
  73. customPickerView.selectRow(index, inComponent: 0, animated: false)
  74. } else {
  75. customPickerView.selectRow(0, inComponent: 0, animated: false)
  76. }
  77. if let minIndex = minutes.firstIndex(of: minute) {
  78. customPickerView.selectRow(minIndex, inComponent: 1, animated: false)
  79. } else {
  80. customPickerView.selectRow(0, inComponent: 1, animated: false)
  81. }
  82. }
  83. override func addNotifaction() {
  84. super.addNotifaction()
  85. PlayerManager.shared.$sleepModel.receive(on: DispatchQueue.main).sink { model in
  86. self.selectTime(time: model.countTime)
  87. self.switchButton.isOn = model.isOpen
  88. }.store(in: &cancellables)
  89. }
  90. override func addChildren() {
  91. super.addChildren()
  92. view.addSubview(bgView)
  93. view.addSubview(dismissControl)
  94. bgView.addSubview(titleLabel)
  95. bgView.addSubview(switchButton)
  96. bgView.addSubview(customPickerView)
  97. bgView.addSubview(timeView)
  98. }
  99. override func makeConstarints() {
  100. super.makeConstarints()
  101. dismissControl.snp.makeConstraints { make in
  102. make.top.leading.trailing.equalToSuperview()
  103. make.bottom.equalTo(bgView.snp.top)
  104. }
  105. bgView.snp.makeConstraints { make in
  106. make.leading.trailing.equalToSuperview()
  107. make.bottom.equalToSuperview()
  108. }
  109. titleLabel.snp.makeConstraints { make in
  110. make.leading.equalToSuperview().offset(16)
  111. make.bottom.equalTo(timeView.snp.top).offset(-30)
  112. make.top.equalToSuperview().offset(30)
  113. }
  114. switchButton.snp.makeConstraints { make in
  115. make.trailing.equalToSuperview().offset(-16)
  116. make.centerY.equalTo(titleLabel)
  117. }
  118. timeView.snp.makeConstraints { make in
  119. make.bottom.equalTo(customPickerView.snp.top).offset(-30)
  120. make.centerX.equalToSuperview()
  121. }
  122. customPickerView.snp.makeConstraints { make in
  123. make.leading.trailing.equalToSuperview()
  124. make.bottom.equalToSuperview().offset(-(view.safeAreaInsets.bottom + 20))
  125. }
  126. }
  127. @objc func dismissCurrentVc() {
  128. dismiss(animated: true)
  129. }
  130. // MARK: - UIPickerViewDataSource
  131. func numberOfComponents(in pickerView: UIPickerView) -> Int {
  132. return 2 // 两个组件:小时和分钟
  133. }
  134. func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
  135. if component == 0 {
  136. return hours.count // 小时的行数
  137. } else {
  138. return minutes.count // 分钟的行数
  139. }
  140. }
  141. // MARK: - UIPickerViewDelegate
  142. func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
  143. if component == 0 {
  144. return "\(hours[row]) hours" // 显示小时
  145. } else {
  146. return String(format: "%2d min", minutes[row]) // 显示分钟
  147. }
  148. }
  149. func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
  150. let selectedHour = pickerView.selectedRow(inComponent: 0)
  151. let selectedMinute = pickerView.selectedRow(inComponent: 1)
  152. let totalScends = hours[selectedHour] * 60 * 60 + minutes[selectedMinute] * 60
  153. PlayerManager.shared.sleepModel.countTime = TimeInterval(totalScends)
  154. print("Selected time: \(hours[selectedHour]):\(minutes[selectedMinute])")
  155. }
  156. func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
  157. 40
  158. }
  159. func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
  160. let label = (view as? UILabel) ?? UILabel()
  161. if component == 0 {
  162. label.text = "\(hours[row]) hours"
  163. } else {
  164. label.text = String(format: "%2d min", minutes[row])
  165. }
  166. label.textAlignment = .center
  167. label.font = .boldSystemFont(ofSize: 18)
  168. label.textColor = .white // 自定义文字颜色
  169. return label
  170. }
  171. deinit {
  172. cancellables.removeAll()
  173. }
  174. }