提交
This commit is contained in:
@@ -0,0 +1,207 @@
|
||||
//
|
||||
// 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)")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user