PopUpView.swift 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. //
  2. // PopUpViewController.swift
  3. // TUIRoomKit
  4. //
  5. // Created by janejntang on 2023/1/12.
  6. // Copyright © 2023 Tencent. All rights reserved.
  7. //
  8. import Foundation
  9. import TUICore
  10. protocol PopUpViewResponder: AnyObject {
  11. func updateAlertTransitionPosition(position: AlertTransitionAnimator.AlertTransitionPosition)
  12. }
  13. class PopUpView: UIView {
  14. let viewModel: PopUpViewModel
  15. var rootView: UIView?
  16. weak var responder: PopUpViewResponder?
  17. private let arrowViewHeight: CGFloat = 35.0
  18. private var currentLandscape: Bool = isLandscape
  19. private let panelControl : UIControl = {
  20. let control = UIControl()
  21. control.backgroundColor = .clear
  22. return control
  23. }()
  24. private let dropArrowView : UIView = {
  25. let view = UIView()
  26. return view
  27. }()
  28. private let dropArrowImageView: UIImageView = {
  29. let view = UIImageView()
  30. view.image = UIImage(named: "room_drop_arrow",in:tuiRoomKitBundle(),compatibleWith: nil)
  31. return view
  32. }()
  33. private let rightArrowView : UIView = {
  34. let view = UIView()
  35. return view
  36. }()
  37. private let rightArrowImageView: UIImageView = {
  38. let view = UIImageView()
  39. view.image = UIImage(named: "room_right_arrow",in:tuiRoomKitBundle(),compatibleWith: nil)
  40. return view
  41. }()
  42. private let backgroundView: UIView = {
  43. let view = UIView()
  44. return view
  45. }()
  46. init(viewModel: PopUpViewModel) {
  47. self.viewModel = viewModel
  48. super.init(frame: .zero)
  49. }
  50. required init?(coder: NSCoder) {
  51. fatalError("init(coder:) has not been implemented")
  52. }
  53. private var isViewReady: Bool = false
  54. override func didMoveToWindow() {
  55. super.didMoveToWindow()
  56. guard !isViewReady else { return }
  57. isViewReady = true
  58. constructViewHierarchy()
  59. activateConstraints()
  60. bindInteraction()
  61. }
  62. func constructViewHierarchy() {
  63. addSubview(panelControl)
  64. addSubview(backgroundView)
  65. backgroundView.addSubview(dropArrowView)
  66. backgroundView.addSubview(rightArrowView)
  67. dropArrowView.addSubview(dropArrowImageView)
  68. rightArrowView.addSubview(rightArrowImageView)
  69. setupViewState()
  70. guard let rootView = rootView else { return }
  71. backgroundView.addSubview(rootView)
  72. backgroundView.layer.cornerRadius = 15
  73. }
  74. func activateConstraints() {
  75. panelControl.snp.makeConstraints { make in
  76. make.edges.equalToSuperview()
  77. }
  78. setupViewOrientation(isLandscape: isLandscape)
  79. dropArrowView.snp.makeConstraints { make in
  80. make.top.leading.trailing.equalToSuperview()
  81. make.height.equalTo(arrowViewHeight)
  82. }
  83. dropArrowImageView.snp.makeConstraints { make in
  84. make.centerX.centerY.equalToSuperview()
  85. make.width.equalTo(24.scale375())
  86. make.height.equalTo(3.scale375())
  87. }
  88. rightArrowView.snp.makeConstraints { make in
  89. make.top.leading.bottom.equalToSuperview()
  90. make.width.equalTo(arrowViewHeight)
  91. }
  92. rightArrowImageView.snp.makeConstraints { make in
  93. make.centerY.centerX.equalToSuperview()
  94. make.width.equalTo(3.scale375())
  95. make.height.equalTo(24.scale375())
  96. }
  97. }
  98. func bindInteraction() {
  99. backgroundView.backgroundColor = viewModel.backgroundColor
  100. let dropArrowTap = UITapGestureRecognizer(target: self, action: #selector(dropDownPopUpViewAction(sender:)))
  101. dropArrowView.addGestureRecognizer(dropArrowTap)
  102. dropArrowView.isUserInteractionEnabled = true
  103. let rightArrowTap = UITapGestureRecognizer(target: self, action: #selector(dropDownPopUpViewAction(sender:)))
  104. rightArrowView.addGestureRecognizer(rightArrowTap)
  105. rightArrowView.isUserInteractionEnabled = true
  106. panelControl.addTarget(self, action: #selector(panelControlAction), for: .touchUpInside)
  107. }
  108. func setupViewState() {
  109. switch viewModel.viewType {
  110. case .roomInfoViewType:
  111. let model = RoomInfoViewModel()
  112. rootView = RoomInfoView(viewModel: model)
  113. case .mediaSettingViewType:
  114. let model = MediaSettingViewModel()
  115. let view = MediaSettingView(viewModel: model)
  116. rootView = view
  117. case .userListViewType:
  118. let model = UserListViewModel()
  119. rootView = UserListView(viewModel: model)
  120. case .raiseHandApplicationListViewType:
  121. let model = RaiseHandApplicationListViewModel()
  122. rootView = RaiseHandApplicationListView(viewModel: model)
  123. case .transferMasterViewType:
  124. let model = TransferMasterViewModel()
  125. viewModel.viewResponder = model
  126. rootView = TransferMasterView(viewModel: model)
  127. case .QRCodeViewType:
  128. let model = QRCodeViewModel(urlString: "https://web.sdk.qcloud.com/component/tuiroom/index.html#/" + "#/room?roomId=" +
  129. EngineManager.shared.store.roomInfo.roomId)
  130. rootView = QRCodeView(viewModel: model)
  131. case .inviteViewType:
  132. rootView = InviteView()
  133. case .inviteMemberViewType:
  134. let model = MemberInviteViewModel()
  135. rootView = MemberInviteView(viewModel: model)
  136. default: break
  137. }
  138. }
  139. @objc func dropDownPopUpViewAction(sender: UIView) {
  140. RoomRouter.shared.dismissPopupViewController()
  141. }
  142. override func layoutSubviews() {
  143. super.layoutSubviews()
  144. guard currentLandscape != isLandscape else { return }
  145. setupViewOrientation(isLandscape: isLandscape)
  146. responder?.updateAlertTransitionPosition(position: isLandscape ? .right : .bottom)
  147. currentLandscape = isLandscape
  148. }
  149. func setupViewOrientation(isLandscape: Bool) {
  150. let width = min(kScreenHeight, kScreenWidth)
  151. let height = max(kScreenHeight, kScreenWidth)
  152. if isLandscape {
  153. backgroundView.snp.remakeConstraints { make in
  154. make.width.equalTo(width + arrowViewHeight)
  155. make.top.equalToSuperview()
  156. make.height.equalToSuperview()
  157. make.trailing.equalTo(safeAreaLayoutGuide.snp.trailing)
  158. }
  159. } else {
  160. let currentHeight = min(viewModel.height + arrowViewHeight, height - arrowViewHeight)
  161. backgroundView.snp.remakeConstraints { make in
  162. make.width.bottom.equalToSuperview()
  163. make.height.equalTo(currentHeight)
  164. }
  165. }
  166. rootView?.snp.remakeConstraints { make in
  167. if isLandscape {
  168. make.leading.equalToSuperview().offset(arrowViewHeight)
  169. make.trailing.top.bottom.equalToSuperview()
  170. } else {
  171. let currentHeight = min(viewModel.height, height - 2*arrowViewHeight)
  172. make.height.equalTo(currentHeight)
  173. make.trailing.leading.bottom.equalToSuperview()
  174. }
  175. }
  176. rightArrowView.isHidden = !isLandscape
  177. dropArrowView.isHidden = isLandscape
  178. }
  179. @objc func panelControlAction() {
  180. viewModel.panelControlAction()
  181. }
  182. deinit {
  183. debugPrint("deinit \(self)")
  184. }
  185. }