增加换肤功能
This commit is contained in:
@@ -0,0 +1,224 @@
|
||||
//
|
||||
// ExitRoomView.swift
|
||||
// TUIRoomKit
|
||||
//
|
||||
// Created by krabyu on 2023/8/23.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import RTCRoomEngine
|
||||
|
||||
class ExitRoomView: UIView {
|
||||
private let viewModel: ExitRoomViewModel
|
||||
private var isViewReady: Bool = false
|
||||
var currentUser: UserEntity {
|
||||
EngineManager.shared.store.currentUser
|
||||
}
|
||||
var roomInfo: TUIRoomInfo {
|
||||
EngineManager.shared.store.roomInfo
|
||||
}
|
||||
|
||||
let panelControl : UIControl = {
|
||||
let control = UIControl()
|
||||
control.backgroundColor = .clear
|
||||
return control
|
||||
}()
|
||||
|
||||
let contentView: UIView = {
|
||||
let view = UIView(frame: .zero)
|
||||
view.backgroundColor = UIColor(0x17181F)
|
||||
view.layer.cornerRadius = 12
|
||||
return view
|
||||
}()
|
||||
|
||||
lazy var titleLabel: UILabel = {
|
||||
let label = UILabel()
|
||||
label.textColor = UIColor(0x7C85A6)
|
||||
label.font = UIFont(name: "PingFangSC-Regular", size: 12)
|
||||
label.textAlignment = .center
|
||||
label.numberOfLines = 0
|
||||
label.lineBreakMode = .byWordWrapping
|
||||
label.text = viewModel.isShownDestroyRoomButton() && viewModel.isShownLeaveRoomButton() ? .appointOwnerText : .leaveRoomTipText
|
||||
return label
|
||||
}()
|
||||
|
||||
let boundary1View: UIView = {
|
||||
let view = UIView()
|
||||
view.backgroundColor = UIColor(0x4F586B,alpha: 0.3)
|
||||
return view
|
||||
}()
|
||||
|
||||
let leaveRoomButton: UIButton = {
|
||||
let button = UIButton(type: .custom)
|
||||
button.setTitle(.leaveRoomText, for: .normal)
|
||||
button.titleLabel?.font = UIFont(name: "PingFangSC-Regular", size: 18)
|
||||
button.setTitleColor(UIColor(0x006CFF), for: .normal)
|
||||
button.backgroundColor = UIColor(0x17181F)
|
||||
button.isEnabled = true
|
||||
return button
|
||||
}()
|
||||
|
||||
let boundary2View: UIView = {
|
||||
let view = UIView()
|
||||
view.backgroundColor = UIColor(0x4F586B,alpha: 0.3)
|
||||
return view
|
||||
}()
|
||||
|
||||
let destroyRoomButton: UIButton = {
|
||||
let button = UIButton(type: .custom)
|
||||
button.setTitle(.exitRoomText, for: .normal)
|
||||
button.titleLabel?.font = UIFont(name: "PingFangSC-Regular", size: 18)
|
||||
button.setTitleColor(UIColor(0xE5395C), for: .normal)
|
||||
button.backgroundColor = UIColor(0x17181F)
|
||||
button.isEnabled = true
|
||||
return button
|
||||
}()
|
||||
|
||||
init(viewModel: ExitRoomViewModel) {
|
||||
self.viewModel = viewModel
|
||||
super.init(frame: .zero)
|
||||
}
|
||||
|
||||
required init?(coder: NSCoder) {
|
||||
fatalError("init(coder:) has not been implemented")
|
||||
}
|
||||
|
||||
override func didMoveToWindow() {
|
||||
super.didMoveToWindow()
|
||||
guard !isViewReady else { return }
|
||||
constructViewHierarchy()
|
||||
activateConstraints()
|
||||
bindInteraction()
|
||||
isViewReady = true
|
||||
}
|
||||
|
||||
func constructViewHierarchy() {
|
||||
addSubview(panelControl)
|
||||
addSubview(contentView)
|
||||
contentView.addSubview(titleLabel)
|
||||
contentView.addSubview(boundary1View)
|
||||
contentView.addSubview(leaveRoomButton)
|
||||
contentView.addSubview(boundary2View)
|
||||
contentView.addSubview(destroyRoomButton)
|
||||
}
|
||||
|
||||
func activateConstraints() {
|
||||
let titleLabelHeight = 67.scale375Height()
|
||||
let leaveRoomButtonHeight = viewModel.isShownLeaveRoomButton() ? 57.scale375Height() : 0
|
||||
let destroyRoomButtonHeight = currentUser.userId == roomInfo.ownerId ? 57.scale375Height() : 0
|
||||
let space = 20.scale375Height()
|
||||
let contentViewHeight = titleLabelHeight + leaveRoomButtonHeight + destroyRoomButtonHeight + space
|
||||
panelControl.snp.makeConstraints { make in
|
||||
make.edges.equalToSuperview()
|
||||
}
|
||||
contentView.snp.makeConstraints { make in
|
||||
make.height.equalTo(contentViewHeight)
|
||||
make.trailing.equalTo(safeAreaLayoutGuide.snp.trailing)
|
||||
make.leading.equalTo(safeAreaLayoutGuide.snp.leading)
|
||||
make.bottom.equalToSuperview()
|
||||
}
|
||||
titleLabel.snp.makeConstraints { make in
|
||||
make.top.leading.trailing.equalToSuperview()
|
||||
make.height.equalTo(titleLabelHeight)
|
||||
}
|
||||
boundary1View.snp.makeConstraints { make in
|
||||
make.top.equalTo(titleLabel.snp.bottom)
|
||||
make.height.equalTo(1.scale375Height())
|
||||
make.leading.trailing.equalToSuperview()
|
||||
}
|
||||
leaveRoomButton.snp.makeConstraints { make in
|
||||
make.top.equalTo(boundary1View.snp.bottom)
|
||||
make.height.equalTo(leaveRoomButtonHeight)
|
||||
make.leading.trailing.equalToSuperview()
|
||||
}
|
||||
boundary2View.snp.makeConstraints { make in
|
||||
make.top.equalTo(leaveRoomButton.snp.bottom)
|
||||
make.height.equalTo(1.scale375Height())
|
||||
make.leading.trailing.equalToSuperview()
|
||||
}
|
||||
destroyRoomButton.snp.makeConstraints { make in
|
||||
make.top.equalTo(boundary2View.snp.bottom)
|
||||
make.height.equalTo(destroyRoomButtonHeight)
|
||||
make.leading.trailing.equalToSuperview()
|
||||
}
|
||||
}
|
||||
|
||||
func bindInteraction() {
|
||||
setupViewState()
|
||||
viewModel.viewResponder = self
|
||||
leaveRoomButton.addTarget(self, action: #selector(leaveRoomAction), for: .touchUpInside)
|
||||
destroyRoomButton.addTarget(self, action: #selector(destroyRoomAction), for: .touchUpInside)
|
||||
contentView.transform = CGAffineTransform(translationX: 0, y: kScreenHeight)
|
||||
panelControl.addTarget(self, action: #selector(clickBackgroundView), for: .touchUpInside)
|
||||
}
|
||||
|
||||
private func setupViewState() {
|
||||
destroyRoomButton.isHidden = !viewModel.isShownDestroyRoomButton()
|
||||
leaveRoomButton.isHidden = !viewModel.isShownLeaveRoomButton()
|
||||
boundary2View.isHidden = !viewModel.isShownDestroyRoomButton() || !viewModel.isShownLeaveRoomButton()
|
||||
}
|
||||
|
||||
@objc func clickBackgroundView() {
|
||||
dismiss()
|
||||
}
|
||||
|
||||
@objc func leaveRoomAction(sender: UIView) {
|
||||
viewModel.leaveRoomAction()
|
||||
}
|
||||
|
||||
@objc func destroyRoomAction(sender: UIView) {
|
||||
viewModel.destroyRoom()
|
||||
}
|
||||
|
||||
func show(rootView: UIView) {
|
||||
rootView.addSubview(self)
|
||||
self.snp.makeConstraints { make in
|
||||
make.edges.equalToSuperview()
|
||||
}
|
||||
UIView.animate(withDuration: 0.3) { [weak self] in
|
||||
guard let self = self else { return }
|
||||
self.alpha = 1
|
||||
self.contentView.transform = .identity
|
||||
}
|
||||
}
|
||||
|
||||
func dismiss() {
|
||||
UIView.animate(withDuration: 0.3) { [weak self] in
|
||||
guard let self = self else { return }
|
||||
self.alpha = 0
|
||||
self.contentView.transform = CGAffineTransform(translationX: 0, y: kScreenHeight)
|
||||
} completion: { [weak self] _ in
|
||||
guard let self = self else { return }
|
||||
self.removeFromSuperview()
|
||||
}
|
||||
}
|
||||
|
||||
deinit {
|
||||
debugPrint("deinit \(self)")
|
||||
}
|
||||
}
|
||||
|
||||
extension ExitRoomView: ExitRoomViewModelResponder {
|
||||
func makeToast(message: String) {
|
||||
makeToast(message)
|
||||
}
|
||||
|
||||
func dismissView() {
|
||||
dismiss()
|
||||
}
|
||||
}
|
||||
|
||||
private extension String {
|
||||
static var leaveRoomTipText: String {
|
||||
localized("Are you sure you want to leave the conference" )
|
||||
}
|
||||
static var appointOwnerText: String {
|
||||
localized("If you do not want to end the conference, please appoint a new moderator before leaving the conference." )
|
||||
}
|
||||
static var leaveRoomText: String {
|
||||
localized("Leave Conference")
|
||||
}
|
||||
static var exitRoomText: String {
|
||||
localized("End Conference")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user