Veloria/Veloria/Base/Controller/VPTabBarController.swift

176 lines
5.5 KiB
Swift

//
// VPTabBarController.swift
// Veloria
//
// Created by Veloria on 2025/5/19.
//
import UIKit
class VPTabBarController: UITabBarController {
private var ignoreNextSelection = false
override var selectedViewController: UIViewController? {
willSet {
guard let newValue = newValue else {
// if newValue == nil ...
return
}
guard !ignoreNextSelection else {
ignoreNextSelection = false
return
}
guard let tabBar = self.tabBar as? VPTabBar, let index = viewControllers?.firstIndex(of: newValue) else {
return
}
tabBar.select(itemAtIndex: index, animated: false)
}
}
override var selectedIndex: Int {
willSet {
guard let tabBar = self.tabBar as? VPTabBar else {
return
}
guard !ignoreNextSelection else {
ignoreNextSelection = false
return
}
tabBar.select(itemAtIndex: newValue, animated: false)
}
}
override func viewDidLoad() {
super.viewDidLoad()
let tabBar = VPTabBar()
tabBar.delegate = self
self.setValue(tabBar, forKey: "tabBar")
view.backgroundColor = .color000000()
vp_setup()
self.tabBar.isTranslucent = true
}
//MARK:-------------- --------------
override var childForStatusBarStyle: UIViewController? {
return self.selectedViewController
}
override var childForStatusBarHidden: UIViewController? {
return self.selectedViewController
}
}
extension VPTabBarController {
private func vp_setup() {
let appearance = UITabBarAppearance()
appearance.backgroundImage = UIImage(color: .clear)
appearance.backgroundColor = .colorFFFFFF(alpha: 0.1)
appearance.shadowImage = UIImage()
appearance.shadowColor = .clear
appearance.backgroundEffect = UIBlurEffect(style: .dark)
tabBar.standardAppearance = appearance
tabBar.scrollEdgeAppearance = appearance
let nav1 = createNavigationController(viewController: VPHomePageViewController(), title: "Home".localized, image: UIImage(named: "tabbar_icon_01"), selectedImage: UIImage(named: "tabbar_icon_01_selected"))
let nav2 = createNavigationController(viewController: VPExploreViewController(), title: "Explore".localized, image: UIImage(named: "tabbar_icon_02"), selectedImage: UIImage(named: "tabbar_icon_02_selected"))
let nav3 = createNavigationController(viewController: VPMyListViewController(), title: "My List".localized, image: UIImage(named: "tabbar_icon_03"), selectedImage: UIImage(named: "tabbar_icon_03_selected"))
let nav4 = createNavigationController(viewController: VPMeViewController(), title: "Me".localized, image: UIImage(named: "tabbar_icon_04"), selectedImage: UIImage(named: "tabbar_icon_04_selected"))
viewControllers = [nav1, nav2, nav3, nav4]
}
private func createNavigationController(viewController: UIViewController, title: String?, image: UIImage?, selectedImage: UIImage?) -> UINavigationController {
let tabBarItem = VPTabBarItem()
tabBarItem.title = title
tabBarItem.image = image
tabBarItem.selectedImage = selectedImage
let nav = VPNavigationController(rootViewController: viewController)
nav.tabBarItem = tabBarItem
return nav
}
}
extension VPTabBarController {
override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
guard let idx = tabBar.items?.firstIndex(of: item) else {
return;
}
if let vc = viewControllers?[idx] {
ignoreNextSelection = true
selectedIndex = idx
delegate?.tabBarController?(self, didSelect: vc)
}
}
override func tabBar(_ tabBar: UITabBar, willBeginCustomizing items: [UITabBarItem]) {
if let tabBar = tabBar as? VPTabBar {
tabBar.updateLayout()
}
}
override func tabBar(_ tabBar: UITabBar, didEndCustomizing items: [UITabBarItem], changed: Bool) {
if let tabBar = tabBar as? VPTabBar {
tabBar.updateLayout()
}
}
}
extension VPTabBarController {
func openHistoryPage() {
var index: Int?
var viewController: VPMyListViewController?
self.viewControllers?.enumerated().forEach({
guard let nav = $1 as? UINavigationController else { return }
if let vc = nav.viewControllers.first as? VPMyListViewController {
index = $0
viewController = vc
}
})
if let index = index {
self.selectedIndex = index
viewController?.showHistoryPage()
}
}
func openCollectPage() {
var index: Int?
var viewController: VPMyListViewController?
self.viewControllers?.enumerated().forEach({
guard let nav = $1 as? UINavigationController else { return }
if let vc = nav.viewControllers.first as? VPMyListViewController {
index = $0
viewController = vc
}
})
if let index = index {
self.selectedIndex = index
viewController?.showCollectPage()
}
}
}