Files
midi_ios/TUIKit/TUIRoomKit/Source/View/Page/Widget/BottomNavigationBar/BottomView.swift
2025-08-14 10:07:49 +08:00

246 lines
7.5 KiB
Swift

//
// BottomView.swift
// TUIRoomKit
//
// Created by aby on 2022/12/21.
// Copyright © 2022 Tencent. All rights reserved.
//
import UIKit
class BottomView: UIView {
// MARK: - store property
let viewModel: BottomViewModel
private var viewArray: [BottomItemView] = []
var isUnfold: Bool = false
let unfoldHeight = Float(130.scale375Height())
let packUpHeight = Float(68.scale375Height())
let baseButtonMenuView: UIStackView = {
let view = UIStackView()
view.axis = .horizontal
view.alignment = .center
view.distribution = .equalSpacing
view.spacing = 10
return view
}()
let moreButtonMenuView: UIStackView = {
let view = UIStackView()
view.axis = .horizontal
view.alignment = .center
view.distribution = .equalSpacing
view.spacing = 10
return view
}()
let buttonMenuView: UIView = {
let view = UIView()
view.backgroundColor = UIColor(0x0F1014)
view.layer.cornerRadius = 12
return view
}()
let backgroundView: UIView = {
let view = UIView()
view.backgroundColor = UIColor(0x0F1014)
return view
}()
// MARK: - initialized function
init(viewModel: BottomViewModel) {
self.viewModel = viewModel
super.init(frame: .zero)
backgroundColor = .clear
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// MARK: - view layout
private var isViewReady: Bool = false
override func didMoveToWindow() {
super.didMoveToWindow()
guard !isViewReady else { return }
constructViewHierarchy()
activateConstraints()
bindInteraction()
isViewReady = true
}
func constructViewHierarchy() {
addSubview(backgroundView)
addSubview(buttonMenuView)
buttonMenuView.addSubview(moreButtonMenuView)
buttonMenuView.addSubview(baseButtonMenuView)
moreButtonMenuView.isHidden = true
setupMenuStackView(items: viewModel.viewItems)
layoutMoreButtonMenu()
}
func setupMenuStackView(items: [ButtonItemData]) {
for i in 0...(items.count - 1) {
guard let item = viewModel.viewItems[safe: i] else { continue }
let view = BottomItemView(itemData: item)
let size = item.size ?? CGSize(width: 52.scale375(), height: 52.scale375())
view.snp.makeConstraints { make in
make.height.equalTo(size.height)
make.width.equalTo(size.width)
}
view.backgroundColor = item.backgroundColor ?? UIColor(0x2A2D38)
viewArray.append(view)
if i < 6 {
baseButtonMenuView.addArrangedSubview(view)
} else {
moreButtonMenuView.addArrangedSubview(view)
}
}
}
func layoutMoreButtonMenu() {
let emptyViewCount = baseButtonMenuView.subviews.count - moreButtonMenuView.subviews.count
if emptyViewCount <= 0 {return}
for _ in 1...emptyViewCount {
let emptyView = BottomItemView(itemData: ButtonItemData())
emptyView.snp.makeConstraints { make in
make.height.equalTo(52.scale375())
make.width.equalTo(52.scale375())
moreButtonMenuView.addArrangedSubview(emptyView)
}
viewArray.append(emptyView)
}
}
func activateConstraints() {
backgroundView.snp.makeConstraints { make in
make.bottom.leading.trailing.equalToSuperview()
make.height.equalTo(packUpHeight)
}
let width = min(kScreenWidth, kScreenHeight)
buttonMenuView.snp.makeConstraints { make in
make.width.equalTo(width)
make.bottom.centerX.height.equalToSuperview()
}
baseButtonMenuView.snp.makeConstraints { make in
make.top.equalToSuperview().offset(8.scale375())
make.height.equalTo(52.scale375())
make.leading.equalToSuperview().offset(16.scale375())
make.trailing.equalToSuperview().offset(-16.scale375())
}
moreButtonMenuView.snp.makeConstraints { make in
make.bottom.equalToSuperview()
make.height.equalTo(52.scale375())
make.leading.trailing.equalTo(baseButtonMenuView)
}
}
func bindInteraction() {
viewModel.viewResponder = self
}
deinit {
debugPrint("deinit \(self)")
}
}
extension BottomView: BottomViewModelResponder {
func updateButtonView(item: ButtonItemData) {
guard let view = viewArray.first(where: { $0.itemData.buttonType == item.buttonType }) else { return }
view.setupViewState(item: item)
}
func showAlert(title: String?, message: String?, sureTitle: String?, declineTitle: String?, sureBlock: (() -> ())?, declineBlock: (() -> ())?) {
RoomRouter.presentAlert(title: title, message: message, sureTitle: sureTitle, declineTitle: declineTitle, sureBlock: sureBlock, declineBlock: declineBlock)
}
func updateStackView(items: [ButtonItemData]) {
viewArray.forEach { view in
view.removeFromSuperview()
}
viewArray = []
setupMenuStackView(items: items)
layoutMoreButtonMenu()
}
func makeToast(text: String) {
RoomRouter.makeToastInCenter(toast: text, duration: 1)
}
private func updateBottomViewConstraints(isUnfold: Bool, completion: @escaping () -> Void) {
UIView.animate(withDuration: 0.3) { [weak self] () in
guard let self = self else { return }
self.snp.updateConstraints { make in
make.height.equalTo(isUnfold ? self.unfoldHeight : self.packUpHeight)
}
self.superview?.layoutIfNeeded()
} completion: { _ in
completion()
}
}
func updataBottomView(isUp: Bool) {
buttonMenuView.backgroundColor = isUp ? UIColor(0x2A2D38) : UIColor(0x0F1014)
self.isUnfold = isUp
if isUp {
updateBottomViewConstraints(isUnfold: true) { [weak self] in
guard let self = self else { return }
self.moreButtonMenuView.isHidden = false
}
} else {
moreButtonMenuView.isHidden = true
updateBottomViewConstraints(isUnfold: false) {}
}
}
}
private extension String {
static var leaveRoomTitle: String {
localized("Are you sure you want to leave the conference?")
}
static var destroyRoomTitle: String {
localized("Are you sure you want to end the conference?")
}
static var destroyRoomCancelTitle: String {
localized("Wait")
}
static var logoutOkText: String {
localized("OK")
}
static var dismissMeetingTitle: String {
localized("If you don't want to end the conference")
}
static var appointNewHostText: String {
localized("Please appoint a new host before leaving the conference")
}
static var leaveMeetingText: String {
localized("Leave conference")
}
static var dismissMeetingText: String {
localized("End conference")
}
static var cancelText: String {
localized("Cancel")
}
static var toastTitleText: String {
localized("Share Screen")
}
static var toastMessageText: String {
localized("Stop TUIRoom screen sharing screen live?")
}
static var toastStopText: String {
localized("Stop")
}
}