176 lines
5.5 KiB
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()
|
|
}
|
|
}
|
|
}
|