You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

135 lines
5.2 KiB

//
// HomeTabBarController.swift
// Lookfit
//
// Created by lemo. on 2020/3/7.
// Copyright © 2020 Sheldon. All rights reserved.
//
import UIKit
enum HomeTabBarItem: Int {
case health, sport, device, mine
private func controller(with viewModel: ViewModel, navigator: Navigator) -> UIViewController {
switch self {
case .health:
// let vc = HealthViewController(viewModel: viewModel, navigator: navigator)
let vc = HealthHomeViewControllers(viewModel: viewModel, navigator: navigator)
vc.isHiddenNavBar = true
return NavigationController(rootViewController: vc)
case .sport:
let vc = SportViewControllers(viewModel: viewModel, navigator: navigator)
return NavigationController(rootViewController: vc)
case .device:
let vc = DeviceViewControllers(viewModel: viewModel, navigator: navigator)
// vc.tongzhi();
return NavigationController(rootViewController: vc)
case .mine:
let vc = MineViewController(viewModel: viewModel, navigator: navigator)
vc.isHiddenNavBar = true
vc.isLightStatusBar = true
return NavigationController(rootViewController: vc)
}
}
var image: UIImage? {
switch self {
case .health: return R.image.icon_health_normal()
case .sport: return R.image.icon_sport_normal()
case .device: return R.image.icon_device_normal()
case .mine: return R.image.icon_mine_normal()
}
}
var selectedImage: UIImage? {
switch self {
case .health: return R.image.icon_health_selected()
case .sport: return R.image.icon_sport_selected()
case .device: return R.image.icon_device_selected()
case .mine: return R.image.icon_mine_selected()
}
}
var title: String {
switch self {
case .health: return MultiLanguageKey.health.localized
case .sport: return MultiLanguageKey.sport.localized
case .device: return MultiLanguageKey.device.localized
case .mine: return MultiLanguageKey.mine.localized
}
}
func getController(with viewModel: ViewModel, navigator: Navigator) -> UIViewController {
let vc = controller(with: viewModel, navigator: navigator)
let item = UITabBarItem(title: title, image: image?.withRenderingMode(.alwaysOriginal), selectedImage: selectedImage?.withRenderingMode(.alwaysOriginal)).then {
$0.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: kHexColor(0x2A2A2A)], for: .normal)
$0.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: kHexColor(0x004EFF)], for: .selected)
}
vc.tabBarItem = item
return vc
}
}
class HomeTabBarController: UITabBarController, Navigatable {
var viewModel: HomeTabBarViewModel?
var navigator: Navigator!
init(viewModel: ViewModel?, navigator: Navigator) {
self.viewModel = viewModel as? HomeTabBarViewModel
self.navigator = navigator
super.init(nibName: nil, bundle: nil)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
makeUI()
bindViewModel()
}
func makeUI() {
delegate = self
tabBar.isTranslucent = false
tabBar.barTintColor = ThemeManager.tabBarColor
tabBar.backgroundImage = UIImage()
tabBar.shadowImage = UIImage()
tabBar.layer.shadowColor = UIColor.lightGray.cgColor
tabBar.layer.shadowOffset = CGSize(width: 0, height: -5)
tabBar.layer.shadowOpacity = 0.3
if #available(iOS 13, *) {
let lineView = UIView(frame: CGRect(x: 0, y: -1, width: tabBar.bounds.width, height: 1))
lineView.backgroundColor = ThemeManager.tabBarColor
tabBar.addSubview(lineView)
}
if #available(iOS 15, *) {
let bar = UITabBarAppearance.init()
bar.backgroundColor = ThemeManager.tabBarColor
bar.shadowImage = UIImage()
let selTitleAttr = [
// NSAttributedString.Key.font: itemFont,
NSAttributedString.Key.foregroundColor: kHexColor(0x004EFF)
]
bar.stackedLayoutAppearance.selected.titleTextAttributes = selTitleAttr
self.tabBar.scrollEdgeAppearance = bar
self.tabBar.standardAppearance = bar
}
}
func bindViewModel() {
guard let viewModel = viewModel else { return }
let controllers = viewModel.tabBarItems.map { $0.getController(with: viewModel.viewModel(for: $0), navigator: navigator) }
setViewControllers(controllers, animated: false)
}
}
extension HomeTabBarController: UITabBarControllerDelegate {
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
return true
}
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
}
}