Files
featherVoice/TUIKit/TUIRoomKit/Source/View/Page/Widget/PopUpControlPanel/PopUpView.swift

208 lines
7.3 KiB
Swift
Raw Normal View History

2025-08-08 10:49:36 +08:00
//
// PopUpViewController.swift
// TUIRoomKit
//
// Created by janejntang on 2023/1/12.
// Copyright © 2023 Tencent. All rights reserved.
//
import Foundation
import TUICore
protocol PopUpViewResponder: AnyObject {
func updateAlertTransitionPosition(position: AlertTransitionAnimator.AlertTransitionPosition)
}
class PopUpView: UIView {
let viewModel: PopUpViewModel
var rootView: UIView?
weak var responder: PopUpViewResponder?
private let arrowViewHeight: CGFloat = 35.0
private var currentLandscape: Bool = isLandscape
private let panelControl : UIControl = {
let control = UIControl()
control.backgroundColor = .clear
return control
}()
private let dropArrowView : UIView = {
let view = UIView()
return view
}()
private let dropArrowImageView: UIImageView = {
let view = UIImageView()
view.image = UIImage(named: "room_drop_arrow",in:tuiRoomKitBundle(),compatibleWith: nil)
return view
}()
private let rightArrowView : UIView = {
let view = UIView()
return view
}()
private let rightArrowImageView: UIImageView = {
let view = UIImageView()
view.image = UIImage(named: "room_right_arrow",in:tuiRoomKitBundle(),compatibleWith: nil)
return view
}()
private let backgroundView: UIView = {
let view = UIView()
return view
}()
init(viewModel: PopUpViewModel) {
self.viewModel = viewModel
super.init(frame: .zero)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private var isViewReady: Bool = false
override func didMoveToWindow() {
super.didMoveToWindow()
guard !isViewReady else { return }
isViewReady = true
constructViewHierarchy()
activateConstraints()
bindInteraction()
}
func constructViewHierarchy() {
addSubview(panelControl)
addSubview(backgroundView)
backgroundView.addSubview(dropArrowView)
backgroundView.addSubview(rightArrowView)
dropArrowView.addSubview(dropArrowImageView)
rightArrowView.addSubview(rightArrowImageView)
setupViewState()
guard let rootView = rootView else { return }
backgroundView.addSubview(rootView)
backgroundView.layer.cornerRadius = 15
}
func activateConstraints() {
panelControl.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
setupViewOrientation(isLandscape: isLandscape)
dropArrowView.snp.makeConstraints { make in
make.top.leading.trailing.equalToSuperview()
make.height.equalTo(arrowViewHeight)
}
dropArrowImageView.snp.makeConstraints { make in
make.centerX.centerY.equalToSuperview()
make.width.equalTo(24.scale375())
make.height.equalTo(3.scale375())
}
rightArrowView.snp.makeConstraints { make in
make.top.leading.bottom.equalToSuperview()
make.width.equalTo(arrowViewHeight)
}
rightArrowImageView.snp.makeConstraints { make in
make.centerY.centerX.equalToSuperview()
make.width.equalTo(3.scale375())
make.height.equalTo(24.scale375())
}
}
func bindInteraction() {
backgroundView.backgroundColor = viewModel.backgroundColor
let dropArrowTap = UITapGestureRecognizer(target: self, action: #selector(dropDownPopUpViewAction(sender:)))
dropArrowView.addGestureRecognizer(dropArrowTap)
dropArrowView.isUserInteractionEnabled = true
let rightArrowTap = UITapGestureRecognizer(target: self, action: #selector(dropDownPopUpViewAction(sender:)))
rightArrowView.addGestureRecognizer(rightArrowTap)
rightArrowView.isUserInteractionEnabled = true
panelControl.addTarget(self, action: #selector(panelControlAction), for: .touchUpInside)
}
func setupViewState() {
switch viewModel.viewType {
case .roomInfoViewType:
let model = RoomInfoViewModel()
rootView = RoomInfoView(viewModel: model)
case .mediaSettingViewType:
let model = MediaSettingViewModel()
let view = MediaSettingView(viewModel: model)
rootView = view
case .userListViewType:
let model = UserListViewModel()
rootView = UserListView(viewModel: model)
case .raiseHandApplicationListViewType:
let model = RaiseHandApplicationListViewModel()
rootView = RaiseHandApplicationListView(viewModel: model)
case .transferMasterViewType:
let model = TransferMasterViewModel()
viewModel.viewResponder = model
rootView = TransferMasterView(viewModel: model)
case .QRCodeViewType:
let model = QRCodeViewModel(urlString: "https://web.sdk.qcloud.com/component/tuiroom/index.html#/" + "#/room?roomId=" +
EngineManager.shared.store.roomInfo.roomId)
rootView = QRCodeView(viewModel: model)
case .inviteViewType:
rootView = InviteView()
case .inviteMemberViewType:
let model = MemberInviteViewModel()
rootView = MemberInviteView(viewModel: model)
default: break
}
}
@objc func dropDownPopUpViewAction(sender: UIView) {
RoomRouter.shared.dismissPopupViewController()
}
override func layoutSubviews() {
super.layoutSubviews()
guard currentLandscape != isLandscape else { return }
setupViewOrientation(isLandscape: isLandscape)
responder?.updateAlertTransitionPosition(position: isLandscape ? .right : .bottom)
currentLandscape = isLandscape
}
func setupViewOrientation(isLandscape: Bool) {
let width = min(kScreenHeight, kScreenWidth)
let height = max(kScreenHeight, kScreenWidth)
if isLandscape {
backgroundView.snp.remakeConstraints { make in
make.width.equalTo(width + arrowViewHeight)
make.top.equalToSuperview()
make.height.equalToSuperview()
make.trailing.equalTo(safeAreaLayoutGuide.snp.trailing)
}
} else {
let currentHeight = min(viewModel.height + arrowViewHeight, height - arrowViewHeight)
backgroundView.snp.remakeConstraints { make in
make.width.bottom.equalToSuperview()
make.height.equalTo(currentHeight)
}
}
rootView?.snp.remakeConstraints { make in
if isLandscape {
make.leading.equalToSuperview().offset(arrowViewHeight)
make.trailing.top.bottom.equalToSuperview()
} else {
let currentHeight = min(viewModel.height, height - 2*arrowViewHeight)
make.height.equalTo(currentHeight)
make.trailing.leading.bottom.equalToSuperview()
}
}
rightArrowView.isHidden = !isLandscape
dropArrowView.isHidden = isLandscape
}
@objc func panelControlAction() {
viewModel.panelControlAction()
}
deinit {
debugPrint("deinit \(self)")
}
}