Files
featherVoice/TUIKit/TUIRoomKit/Source/View/ConferenceOptions/ScheduleConference/View/ScheduleConferenceTableView.swift
2025-08-08 10:49:36 +08:00

138 lines
4.9 KiB
Swift

//
// ScheduleConferenceTableView.swift
// TUIRoomKit
//
// Created by janejntang on 2024/6/24.
//
import Foundation
import Factory
class ScheduleConferenceTableView: UIView {
var menus: [Int: [CellConfigItem]]
lazy var tableView: UITableView = {
let tableView = UITableView(frame: .zero, style: .grouped)
tableView.separatorStyle = .none
tableView.delegate = self
tableView.dataSource = self
tableView.backgroundColor = .clear
tableView.sectionFooterHeight = 20.scale375Height()
tableView.sectionHeaderHeight = 0
tableView.register(ScheduleTabCell.self, forCellReuseIdentifier: ScheduleTabCell.identifier)
tableView.register(SwitchCell.self, forCellReuseIdentifier: SwitchCell.identifier)
tableView.register(TextFieldCell.self, forCellReuseIdentifier: TextFieldCell.identifier)
tableView.register(ButtonCell.self, forCellReuseIdentifier: ButtonCell.identifier)
return tableView
}()
private var isViewReady: Bool = false
override func didMoveToWindow() {
super.didMoveToWindow()
guard !isViewReady else { return }
isViewReady = true
constructViewHierarchy()
activateConstraints()
backgroundColor = UIColor(0xF8F9FB)
}
init(menus: [Int : [CellConfigItem]]) {
self.menus = menus
super.init(frame: .zero)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func constructViewHierarchy() {
addSubview(tableView)
}
private func activateConstraints() {
tableView.snp.makeConstraints { make in
make.top.equalToSuperview()
make.leading.equalToSuperview().offset(16.scale375())
make.trailing.equalToSuperview().offset(-16.scale375())
make.bottom.equalToSuperview().offset(-10.scale375Height())
}
}
}
extension ScheduleConferenceTableView: UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return menus.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
guard let value = menus[section] else { return 0 }
return value.count
}
}
extension ScheduleConferenceTableView: UITableViewDelegate {
func tableView(_ tableView: UITableView,
cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let items = menus[indexPath.section] ?? []
let item = items[indexPath.row]
let identifier = item.cellType.cellIdentifier
let cell = tableView.dequeueReusableCell(withIdentifier:identifier, for: indexPath)
if let scheduleTabCell = cell as? ScheduleTabCell {
scheduleTabCell.updateView(item: item)
} else if let switchCell = cell as? SwitchCell {
switchCell.updateView(item: item)
} else if let textFieldCell = cell as? TextFieldCell {
textFieldCell.updateView(item: item)
} else if let buttonCell = cell as? ButtonCell {
buttonCell.updateView(item: item)
}
if let baseCell = cell as? ScheduleBaseCell {
item.bindStateClosure?(baseCell, &baseCell.cancellableSet)
}
cell.selectionStyle = .none
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let items = menus[indexPath.section] ?? []
let item = items[indexPath.row]
let cell = tableView.cellForRow(at: indexPath)
if cell is ScheduleTabCell {
item.selectClosure?()
}
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
let normalHeight = 45.scale375Height()
if indexPath.section == 0 {
return normalHeight
}
guard let itemArray = menus[indexPath.section], let item = itemArray[safe: indexPath.item] else { return normalHeight }
switch item.cellType {
case .switcher, .textField:
return 54.scale375Height()
case .button:
return 44.scale375Height()
default:
return normalHeight
}
}
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let rows = tableView.numberOfRows(inSection: indexPath.section)
if indexPath.row == 0 || indexPath.row == rows - 1 {
var corner = UIRectCorner()
if rows == 1 {
corner = .allCorners
} else if indexPath.row == 0 {
corner = [.topLeft, .topRight]
} else if indexPath.row == rows - 1 {
corner = [.bottomLeft, .bottomRight]
}
cell.roundedRect(rect: cell.bounds,
byRoundingCorners: corner,
cornerRadii: CGSize(width: 12, height: 12))
}
}
}