EntryController.swift 3.1 KB
//
//  EntryController.swift
//  NumberCube
//
//  Created by ilCode on 2025/3/27.
//

import UIKit

//MARK: - life
class EntryController: UITabBarController {
    private var curIndex: Int = 0
    private lazy var tabBarItemViews = [UIView]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 设置tabbar背景色 && 隐藏tabbar分割线
        tabBar.backgroundImage = UIImage()
        tabBar.shadowImage = UIImage()
        tabBar.backgroundColor = .white
        
        // 设置tabbar选中及未选中的文字颜色
        tabBar.tintColor = kMasterColor
        tabBar.unselectedItemTintColor = hexColor("AAAAAA")
        
        addController(rootVC: HomeController(), title: "魔方", image: R.image.ic_cube_normal(), selectedImage: R.image.ic_cube_selected())
        addController(rootVC: ParaController(), title: "参数", image: R.image.ic_para_normal(), selectedImage: R.image.ic_para_selected())
        addController(rootVC: SettingController(), title: "设置", image: R.image.ic_set_normal(), selectedImage: R.image.ic_set_selected())
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        // 保存tabBarItemView
        for tabBarItemView in tabBar.subviews {
            if tabBarItemView.isKind(of: NSClassFromString("UITabBarButton")!) {
                tabBarItemViews.append(tabBarItemView)
            }
        }
    }
}

//MARK: - UITabBarDelegate
extension EntryController {
    override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
        guard let itemIndex = tabBar.items?.firstIndex(of: item),
              itemIndex != curIndex else { return }
        
        zoomAnimate(itemViews: tabBarItemViews, index: itemIndex)
        curIndex = itemIndex
    }
}

//MARK: - Private
extension EntryController {
    /// 添加缩放动画
    /// - Parameters:
    ///   - itemViews: itemViews
    ///   - index: index
    private func zoomAnimate(itemViews: [UIView], index: Int) {
        guard itemViews.count > 0 else { return }
        
        let zoomAni = CABasicAnimation(keyPath: "transform.scale")
        zoomAni.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
        zoomAni.duration = 0.2;
        zoomAni.repeatCount = 1;
        zoomAni.autoreverses = true;
        zoomAni.fromValue = 0.9
        zoomAni.toValue = 1.1
        itemViews[index].layer.add(zoomAni, forKey: nil)
    }
    
    /// 添加子控制器
    /// - Parameters:
    ///   - rootVC: rootVC
    ///   - title: title
    ///   - image: image
    ///   - selectedImage: selectedImage
    private func addController(rootVC: UIViewController, title: String, image: UIImage?, selectedImage: UIImage?) {
        let navi = UINavigationController(rootVC: rootVC)
        navi.tabBarItem = UITabBarItem(title: title, image: image, selectedImage: selectedImage)
        navi.tabBarItem.image = navi.tabBarItem.image?.withRenderingMode(.alwaysOriginal)
        navi.tabBarItem.selectedImage = navi.tabBarItem.selectedImage?.withRenderingMode(.alwaysOriginal)
        addChild(navi)
    }
}