Swift: 导航条 Push 和 Pop 均分层次效果功能

2017-07-12  本文已影响68人  伯wen
第一步效果
override func viewDidLoad() {
    super.viewDidLoad()

    // 隐藏默认的NavigationBar
    self.navigationBar.isHidden = true
    
}
第二步 第三步
import UIKit
class BWBaseViewController: UIViewController {
    // 自定义导航条
    lazy var navigationBar = UINavigationBar(frame: CGRect(x: 0, y: 0, width: UIScreen.width(), height: 64))
    lazy var navItem: UINavigationItem = UINavigationItem()
    // 重写 title 的 didSet方法
    override var title: String? {
        didSet {
            navItem.title = title
        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.cz_random()
        // 将导航条 添加到 view上
        view.addSubview(navigationBar)
        // 将 navItem 设置给 navigationBar
        navigationBar.items = [navItem]
        // 设置 navBar 的渲染颜色
        navigationBar.barTintColor = UIColor.white
    }
}
第四步
override func pushViewController(_ viewController: UIViewController, animated: Bool) {

    if childViewControllers.count > 0 {
        // 判断控制器类型 (多态)
        if let viewController = viewController as? BWBaseViewController {

            // 获取 导航控制器栈里最后一个控制器, 这里第一个控制器也是BWBaseViewController类型
            let vc = childViewControllers[childViewControllers.count - 1] as! BWBaseViewController;

            // 获取标题, 没有就是用 "返回", 这个标题在返回按钮上使用
            var title = vc.navItem.title ?? "返回"

            // 设置返回按钮, 使用 "上一个界面的标题", 没有就是用 "返回"
            viewController.navItem.leftBarButtonItem = UIBarButtonItem.item(
                imageName: "navigationbar_back_withtext",
                highlightedImageName: "navigationbar_back_withtext_highlighted",
                title : title,
                titleColor : UIColor.color(red: 96, green: 96, blue: 96),
                highlightedTitleColor : UIColor.color(red: 253, green: 130, blue: 36),
                font : UIFont.systemFont(ofSize: 19),
                target: self,
                action: #selector(back))
        }
        // 隐藏底部tabBar
        viewController.hidesBottomBarWhenPushed = true
    }
    super.pushViewController(viewController, animated: animated)
}
@objc private func back() {
    popViewController(animated: true)
}
override func pushViewController(_ viewController: UIViewController, animated: Bool) {
    
    if childViewControllers.count > 0 {
        
        // 判断控制器类型 (多态)
        if let viewController = viewController as? BWBaseViewController {
            
            // 获取 导航控制器栈里最后一个控制器, 这里第一个控制器也是BWBaseViewController类型
            let vc = childViewControllers[childViewControllers.count - 1] as! BWBaseViewController;
            
            // 获取标题, 没有就使用 "返回", 这个标题在返回按钮上使用
            var title = vc.navItem.title ?? "返回"
            
            // 第二层开始, 统一用 "返回"
            if childViewControllers.count > 1 {
                title = "返回"
            }

            // 设置返回按钮, 使用 "上一个界面的标题", 没有就是用 "返回"
            viewController.navItem.leftBarButtonItem = UIBarButtonItem.item(
                imageName: "navigationbar_back_withtext",
                highlightedImageName: "navigationbar_back_withtext_highlighted",
                title : title,
                titleColor : UIColor.color(red: 96, green: 96, blue: 96),
                highlightedTitleColor : UIColor.color(red: 253, green: 130, blue: 36),
                font : UIFont.systemFont(ofSize: 19),
                target: self,
                action: #selector(back))
        }
        // 隐藏底部tabBar
        viewController.hidesBottomBarWhenPushed = true
    }
    super.pushViewController(viewController, animated: animated)
}
上一篇 下一篇

猜你喜欢

热点阅读