添加登录流程、会话路由和对齐参考 UI 的主 Tab 框架
This commit is contained in:
73
suixinkan/UI/MainTab/TabNavigationController.swift
Normal file
73
suixinkan/UI/MainTab/TabNavigationController.swift
Normal file
@ -0,0 +1,73 @@
|
||||
//
|
||||
// TabNavigationController.swift
|
||||
// suixinkan
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
/// 单个 Tab 的导航栈。
|
||||
final class TabNavigationController: UINavigationController {
|
||||
|
||||
let appTab: AppTab
|
||||
|
||||
init(tab: AppTab) {
|
||||
self.appTab = tab
|
||||
super.init(nibName: nil, bundle: nil)
|
||||
delegate = self
|
||||
navigationBar.prefersLargeTitles = false
|
||||
setViewControllers([tab.makeRootViewController()], animated: false)
|
||||
}
|
||||
|
||||
@available(*, unavailable)
|
||||
required init?(coder: NSCoder) {
|
||||
fatalError("init(coder:) has not been implemented")
|
||||
}
|
||||
|
||||
override func pushViewController(_ viewController: UIViewController, animated: Bool) {
|
||||
viewController.hidesBottomBarWhenPushed = viewControllers.count > 0
|
||||
updateNavigationBarVisibility(for: viewController, animated: animated)
|
||||
super.pushViewController(viewController, animated: animated)
|
||||
}
|
||||
|
||||
override func setViewControllers(_ viewControllers: [UIViewController], animated: Bool) {
|
||||
if let topViewController = viewControllers.last {
|
||||
updateNavigationBarVisibility(for: topViewController, animated: animated)
|
||||
}
|
||||
super.setViewControllers(viewControllers, animated: animated)
|
||||
}
|
||||
|
||||
override func popViewController(animated: Bool) -> UIViewController? {
|
||||
let poppedViewController = super.popViewController(animated: animated)
|
||||
if !animated, let topViewController {
|
||||
updateNavigationBarVisibility(for: topViewController, animated: false)
|
||||
}
|
||||
return poppedViewController
|
||||
}
|
||||
|
||||
override func popToRootViewController(animated: Bool) -> [UIViewController]? {
|
||||
let poppedViewControllers = super.popToRootViewController(animated: animated)
|
||||
if !animated, let topViewController {
|
||||
updateNavigationBarVisibility(for: topViewController, animated: false)
|
||||
}
|
||||
return poppedViewControllers
|
||||
}
|
||||
|
||||
private func shouldHideNavigationBar(for viewController: UIViewController) -> Bool {
|
||||
viewController is HomeViewController
|
||||
}
|
||||
|
||||
private func updateNavigationBarVisibility(for viewController: UIViewController, animated: Bool) {
|
||||
setNavigationBarHidden(shouldHideNavigationBar(for: viewController), animated: animated)
|
||||
}
|
||||
}
|
||||
|
||||
extension TabNavigationController: UINavigationControllerDelegate {
|
||||
|
||||
func navigationController(
|
||||
_ navigationController: UINavigationController,
|
||||
willShow viewController: UIViewController,
|
||||
animated: Bool
|
||||
) {
|
||||
updateNavigationBarVisibility(for: viewController, animated: animated)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user