LocalAudioView.swift 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. //
  2. // LocalAudioView.swift
  3. // TUIRoomKit
  4. //
  5. // Created by janejntang on 2024/1/5.
  6. //
  7. import Foundation
  8. import Factory
  9. import Combine
  10. class LocalAudioView: UIView {
  11. @Injected(\.localAudioStore) var localAudioStore: LocalAudioStore
  12. private var cancellables = Set<AnyCancellable>()
  13. let muteAudioButton : UIButton = {
  14. let button = UIButton()
  15. button.backgroundColor = UIColor(0x2A2D38)
  16. button.layer.cornerRadius = 12
  17. return button
  18. }()
  19. let volumeView : VolumeView = {
  20. let volumeView = VolumeView()
  21. volumeView.micTopImageLayer.borderWidth = 1.7
  22. volumeView.micTopImageLayer.borderColor = UIColor(0xD5E0F2).cgColor
  23. volumeView.micTopImageLayer.backgroundColor = UIColor.clear.cgColor
  24. volumeView.micTopImageLayer.cornerRadius = 5
  25. volumeView.muteImageLayer.contents = UIImage(named: "room_mute_audio1", in: tuiRoomKitBundle(), compatibleWith: nil)?.cgImage
  26. volumeView.isUserInteractionEnabled = false
  27. return volumeView
  28. }()
  29. init() {
  30. super.init(frame: .zero)
  31. self.transform = CGAffineTransform(translationX: 0, y: kScreenHeight)
  32. }
  33. required init?(coder: NSCoder) {
  34. fatalError("init(coder:) has not been implemented")
  35. }
  36. // MARK: - view layout
  37. private var isViewReady: Bool = false
  38. override func didMoveToWindow() {
  39. super.didMoveToWindow()
  40. guard !isViewReady else { return }
  41. constructViewHierarchy()
  42. activateConstraints()
  43. bindInteraction()
  44. isViewReady = true
  45. }
  46. private func constructViewHierarchy() {
  47. addSubview(muteAudioButton)
  48. muteAudioButton.addSubview(volumeView)
  49. }
  50. private func activateConstraints() {
  51. muteAudioButton.snp.makeConstraints { make in
  52. make.edges.equalToSuperview()
  53. }
  54. volumeView.snp.makeConstraints { make in
  55. make.center.equalToSuperview()
  56. make.width.height.equalTo(24)
  57. }
  58. }
  59. private func bindInteraction() {
  60. muteAudioButton.addTarget(self, action: #selector(muteAudioAction(sender:)), for: .touchUpInside)
  61. subscribeSubject()
  62. }
  63. private func subscribeSubject() {
  64. localAudioStore.subscribe(Selector(keyPath: \LocalAudioState.volume))
  65. .removeDuplicates()
  66. .receive(on: RunLoop.main)
  67. .sink { [weak self] volume in
  68. guard let self = self else { return }
  69. self.volumeView.updateVolume(CGFloat(volume))
  70. }
  71. .store(in: &cancellables)
  72. localAudioStore.subscribe(Selector(keyPath: \LocalAudioState.hasAudio))
  73. .removeDuplicates()
  74. .receive(on: RunLoop.main)
  75. .sink { [weak self] hasAudio in
  76. guard let self = self else { return }
  77. self.muteAudioButton.isSelected = !hasAudio
  78. self.volumeView.updateAudio(hasAudio)
  79. }
  80. .store(in: &cancellables)
  81. localAudioStore.subscribe(Selector(keyPath: \LocalAudioState.isHidden))
  82. .removeDuplicates()
  83. .receive(on: RunLoop.main)
  84. .sink { [weak self] isHidden in
  85. guard let self = self else { return }
  86. self.isHidden = isHidden
  87. }
  88. .store(in: &cancellables)
  89. }
  90. @objc func muteAudioAction(sender: UIButton) {
  91. if localAudioStore.localAudioState.hasAudio {
  92. localAudioStore.muteLocalAudio()
  93. } else {
  94. localAudioStore.unmuteLocalAudio()
  95. }
  96. }
  97. func show() {
  98. UIView.animate(withDuration: 0.3) { [weak self] () in
  99. guard let self = self else { return }
  100. self.transform = .identity
  101. } completion: { _ in
  102. }
  103. }
  104. func hide() {
  105. self.transform = CGAffineTransform(translationX: 0, y: kScreenHeight)
  106. }
  107. deinit {
  108. debugPrint("deinit:\(self)")
  109. }
  110. }