VolumeView.swift 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. //
  2. // VolumeView.swift
  3. // Pods
  4. //
  5. // Created by janejntang on 2024/12/24.
  6. //
  7. struct VolumeViewScale {
  8. let topWidthScale = 6.0 / 14.0
  9. let topHightScale = 10.0 / 14.0
  10. let bottomWidthScale = 11.2 / 14.0
  11. let bottomHightScale = 7.5 / 14.0
  12. }
  13. class VolumeView: UIView {
  14. private let maxVolume = 100.0
  15. private let minVolume = 0.0
  16. private let volumeViewScale = VolumeViewScale()
  17. let muteImageLayer: CALayer = {
  18. let image = UIImage(named: "room_mute_audio_red", in: tuiRoomKitBundle(), compatibleWith: nil)
  19. let imageLayer = CALayer()
  20. imageLayer.contents = image?.cgImage
  21. imageLayer.masksToBounds = true
  22. imageLayer.cornerRadius = 3
  23. return imageLayer
  24. }()
  25. let unmuteImageLayer: CALayer = {
  26. return CALayer()
  27. }()
  28. let micTopImageLayer: CALayer = {
  29. let imageLayer = CALayer()
  30. imageLayer.backgroundColor = UIColor(0x99A0AE).cgColor
  31. imageLayer.masksToBounds = true
  32. imageLayer.cornerRadius = 3
  33. return imageLayer
  34. }()
  35. let micBottomImageLayer: CALayer = {
  36. let image = UIImage(named: "mic_bottom", in: tuiRoomKitBundle(), compatibleWith: nil)
  37. let imageLayer = CALayer()
  38. imageLayer.contents = image?.cgImage
  39. return imageLayer
  40. }()
  41. let colorLayer: CALayer = {
  42. let colorLayer = CALayer()
  43. colorLayer.backgroundColor = UIColor(0x14D89D).cgColor
  44. return colorLayer
  45. }()
  46. private var isViewReady: Bool = false
  47. override func layoutSubviews() {
  48. super.layoutSubviews()
  49. guard !isViewReady else { return }
  50. isViewReady = true
  51. setupSublayer()
  52. handleSublayerLayout()
  53. }
  54. private func setupSublayer() {
  55. layer.addSublayer(muteImageLayer)
  56. layer.addSublayer(unmuteImageLayer)
  57. unmuteImageLayer.addSublayer(micBottomImageLayer)
  58. unmuteImageLayer.addSublayer(micTopImageLayer)
  59. }
  60. private func handleSublayerLayout() {
  61. muteImageLayer.frame = bounds
  62. unmuteImageLayer.frame = bounds
  63. let width = unmuteImageLayer.frame.width
  64. let height = unmuteImageLayer.frame.height
  65. let micTopWidth = width * volumeViewScale.topWidthScale
  66. let micTopHight = height * volumeViewScale.topHightScale
  67. let micTopX = (width - micTopWidth) / 2.0
  68. let micTopY = 0.0
  69. micTopImageLayer.frame = CGRect(x: micTopX, y: micTopY, width: micTopWidth, height: micTopHight)
  70. micTopImageLayer.anchorPoint = CGPoint(x: 0, y: 1)
  71. micTopImageLayer.transform = CATransform3DMakeScale(1, -1, 1)
  72. micTopImageLayer.position = CGPoint(x: micTopX, y: micTopY)
  73. colorLayer.position = CGPoint(x: 0, y: 0)
  74. colorLayer.frame.size.width = micTopImageLayer.bounds.width
  75. micTopImageLayer.addSublayer(colorLayer)
  76. let micBottomWidth = width * volumeViewScale.bottomWidthScale
  77. let micBottomHight = height * volumeViewScale.bottomHightScale
  78. let micBottomX = (width - micBottomWidth) / 2.0
  79. let micBottomY = height - micBottomHight
  80. micBottomImageLayer.frame = CGRect(x: micBottomX, y: micBottomY, width: micBottomWidth, height: micBottomHight)
  81. }
  82. func updateVolume(_ volume: CGFloat) {
  83. var volume = min(volume, maxVolume)
  84. volume = max(volume,minVolume)
  85. self.colorLayer.frame.size.height = micTopImageLayer.frame.height * (volume / maxVolume)
  86. }
  87. func updateAudio(_ hasAudio: Bool) {
  88. muteImageLayer.isHidden = hasAudio
  89. unmuteImageLayer.isHidden = !hasAudio
  90. }
  91. deinit {
  92. debugPrint("deinit \(self)")
  93. }
  94. }