208 lines
7.3 KiB
Swift
208 lines
7.3 KiB
Swift
//
|
|
// 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)")
|
|
}
|
|
}
|