MOLineCountTimeView.swift 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. //
  2. // MOLineCountTimeView.swift
  3. // MiMoLive
  4. //
  5. // Created by OneeChan on 2025/9/26.
  6. //
  7. import Foundation
  8. import UIKit
  9. @objc
  10. enum MOLineCountTimeViewType: Int {
  11. case lining
  12. case pking
  13. case punishing
  14. }
  15. @objcMembers
  16. class MOLineCountTimeView: UIView {
  17. private let titleLabel = UILabel()
  18. private let pkIcon = UIImageView()
  19. private let timeLabel = UILabel()
  20. private var timer: Timer?
  21. private var incr: Bool = false
  22. private var curTime: Int = 0
  23. override init(frame: CGRect) {
  24. super.init(frame: frame)
  25. setupViews()
  26. }
  27. required init?(coder: NSCoder) {
  28. fatalError("init(coder:) has not been implemented")
  29. }
  30. func update(viewType: MOLineCountTimeViewType) {
  31. switch viewType {
  32. case .lining:
  33. pkIcon.isHidden = true
  34. titleLabel.text = .init(key: "C70071")
  35. case .pking:
  36. pkIcon.isHidden = false
  37. titleLabel.text = ""
  38. case .punishing:
  39. pkIcon.isHidden = true
  40. titleLabel.text = .init(key: "C70072")
  41. }
  42. }
  43. func startCount(time: Int, incr: Bool) {
  44. self.incr = incr
  45. curTime = time
  46. updateTimeText()
  47. setupTimer()
  48. }
  49. deinit {
  50. stopTimer()
  51. }
  52. }
  53. extension MOLineCountTimeView {
  54. private func setupViews() {
  55. let icon = UIImageView()
  56. icon.image = .init(named: "icon_line_time_bg")?
  57. .resizableImage(withCapInsets: UIEdgeInsets(top: 2, left: 10, bottom: 2, right: 10))
  58. addSubview(icon)
  59. icon.snp.makeConstraints { make in
  60. make.edges.equalToSuperview()
  61. }
  62. titleLabel.font = .poppinsMediumFont(11)
  63. titleLabel.textColor = .white.withAlphaComponent(0.8)
  64. addSubview(titleLabel)
  65. titleLabel.snp.makeConstraints { make in
  66. make.leading.equalToSuperview().offset(10)
  67. make.centerY.equalToSuperview()
  68. }
  69. pkIcon.image = .init(named: "icon_live_pk_list_bg")
  70. addSubview(pkIcon)
  71. pkIcon.snp.makeConstraints { make in
  72. make.width.height.equalTo(16)
  73. make.leading.equalToSuperview().offset(10)
  74. make.centerY.equalToSuperview()
  75. }
  76. timeLabel.font = .poppinsMediumFont(12)
  77. timeLabel.textColor = .white
  78. addSubview(timeLabel)
  79. timeLabel.snp.makeConstraints { make in
  80. make.centerY.equalToSuperview()
  81. make.leading.greaterThanOrEqualTo(pkIcon.snp.trailing).offset(2)
  82. make.leading.equalTo(titleLabel.snp.trailing).offset(2)
  83. make.trailing.equalToSuperview().offset(-10)
  84. }
  85. }
  86. private func setupTimer() {
  87. stopTimer()
  88. timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] _ in
  89. guard let self else { return }
  90. if self.incr {
  91. self.curTime += 1
  92. updateTimeText()
  93. } else {
  94. self.curTime -= 1
  95. updateTimeText()
  96. if self.curTime == 0 {
  97. stopTimer()
  98. }
  99. }
  100. }
  101. }
  102. private func stopTimer() {
  103. timer?.invalidate()
  104. timer = nil
  105. }
  106. private func updateTimeText() {
  107. let hour = curTime / 3600
  108. let min = curTime % 3600 / 60
  109. let sec = curTime % 60
  110. if hour > 0 {
  111. timeLabel.text = String(format: "%d:%02d:%02d", hour, min, sec)
  112. } else {
  113. timeLabel.text = String(format: "%02d:%02d", min, sec)
  114. }
  115. }
  116. }
  117. //import SwiftUI
  118. //
  119. //struct MOLineCountTimeViewPreview: UIViewRepresentable {
  120. // func makeUIView(context: Context) -> some UIView {
  121. // let view = UIView()
  122. // let list = MOLineCountTimeView()
  123. // view.addSubview(list)
  124. // list.snp.makeConstraints { make in
  125. // make.center.equalToSuperview()
  126. // }
  127. //
  128. // let button = UIButton()
  129. // button.setTitle("test", for: .normal)
  130. // button.backgroundColor = .red
  131. // button.addAction(UIAction(handler: { _ in
  132. // list.update(.line(time: 3))
  133. // }), for: .touchUpInside)
  134. // view.addSubview(button)
  135. // button.snp.makeConstraints { make in
  136. // make.centerX.bottom.equalToSuperview()
  137. // }
  138. //
  139. // return view
  140. // }
  141. //
  142. // func updateUIView(_ uiView: UIViewType, context: Context) { }
  143. //}
  144. //
  145. //#Preview {
  146. // MOLineCountTimeViewPreview()
  147. //}