harin
6/19/2015 - 5:55 AM

Custom NavigationController Subclass

Custom NavigationController Subclass

//
//  TabbedNavigationController.swift
//  CustomerNavigationBar
//
//  Created by Harin Sanghirun on 13/6/58.
//  Copyright (c) พ.ศ. 2558 Harin Sanghirun. All rights reserved.
//

import UIKit


class TabbedNavigationController: UINavigationController {

    // tabbarcontroller properties
    var selectedIndex = 0
    var navigationViewHeight = 0.0 as CGFloat;

    
    init(viewControllers: [TabViewController]) {
        // Add customer tab bar style
        println("init rootview")
        super.init(nibName: nil, bundle: nil)
        setViewControllers([viewControllers[0]], animated: false)
        for viewController in viewControllers {
            addTabViewController(viewController)
        }
    }
    
    override func viewDidLoad() {
        log.debug("")
        setupTab()
        navigationBar.setBackgroundImage(UIImage(named: "navbar-i5"), forBarMetrics: .Default)
        UINavigationBar.appearance().tintColor = selectedButtonColor
    }

    required init(coder aDecoder: NSCoder) {
        println("init coder")
        
        super.init(coder: aDecoder)
        setupTab()
    }
    
    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        println("init nibName")
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    }
    
    func setupMenuButton(viewController: TabViewController) {
        println("Setting up menu button")
        
        var menuButton = UIButton(frame: CGRect(x: 0, y: 0, width: 22, height: 22))
        menuButton.setImage(UIImage(named: "nav-menu.png"), forState: .Normal)
        var rightBarButton = UIBarButtonItem(customView: menuButton)
        menuButton.addTarget(self, action: "menuButtonAction:", forControlEvents: .TouchUpInside)
        
        viewController.navigationItem.rightBarButtonItem = rightBarButton
    }
    
    func menuButtonAction(sender: UIButton) {
        // home button
        selectHomeViewController()
    }
    
    private func setupTab() {
        tabView.image = UIImage(named: "tabbar-i5")
        tabView.userInteractionEnabled = true

        self.view.addSubview(tabView)
    }
    
    private func setupTitleView( viewController: TabViewController ) {
        
        // Set Default Title View
        if viewController.navigationItem.titleView == nil {
            var customTitleLabel = UILabel(frame: CGRectZero)
            customTitleLabel.text = viewController.title
            customTitleLabel.textColor = pageTitleColor
            customTitleLabel.font = UIFont(name: pageTitleFont, size: 32)
            
            viewController.navigationItem.titleView = customTitleLabel
            customTitleLabel.sizeToFit()
        }

    }
    
    override func viewDidLayoutSubviews() {
        log.debug("")
        super.viewDidLayoutSubviews()
        
        tabView.frame = CGRect(x: 0, y: self.navigationBar.frame.origin.y + self.navigationBar.frame.height, width: self.view.frame.size.width, height: 40.0)
        navigationViewHeight = tabView.frame.origin.y + tabView.frame.size.height
        
        // layout the buttons
        var rightSide = tabView.frame.size.width
        for (index,button) in enumerate(tabButtonList) {
            var buttonSize = button.frame.size
            rightSide = rightSide - buttonSize.width
            
            button.frame = CGRect(x: rightSide , y: 0, width: buttonSize.width, height: tabView.frame.size.height)
            tabView.addSubview(button)
            
            button.sizeToFit()
            button.frame = CGRect(x: button.frame.origin.x, y: button.frame.origin.y, width: button.frame.size.width + 12, height: tabView.frame.size.height)
            button.addTarget(self, action: "selectTab:", forControlEvents: .TouchUpInside)
        }
        
    }
    
    override func showViewController(vc: UIViewController, sender: AnyObject!) {
        
        if vc is TabViewController {
            setupMenuButton(vc as! TabViewController)
        }
        super.showViewController(vc, sender: sender)
    }
    
    // MARK: Home View Controller
    
    func setHomeViewController(viewController: TabViewController) {
        homeViewController = viewController
        setupMenuButton(homeViewController)
        setupTitleView(homeViewController)
        
    }
    
    func selectHomeViewController() {
        setViewControllers([homeViewController], animated: false)
        if selectedIndex >= 0 && selectedIndex < tabButtonList.count {
            tabButtonList[selectedIndex].selected = false
        }
        selectedIndex = -1
    }
    
    // MARK: Tab Methods
    
    func addTabViewController( viewController: TabViewController ) {
        tabViewControllers.append(viewController)
        //Create new Button for this view controller and add to view
        
        let button = UIButton(frame: CGRectZero)
        if let image = viewController.tabImage, let imageActive = viewController.tabImageActive {
            button.setImage(image, forState: .Normal)
            button.setImage(imageActive, forState: .Selected)
        } else {
            if let title = viewController.title {
                button.setTitle(title, forState: .Normal)
                button.setTitleColor(unselectedButtonColor, forState: .Normal)
                button.setTitleColor(selectedButtonColor, forState: .Selected)
            } else {
                println("View Controller Title not setted")
            }
        }
        
        button.setTitleColor( unselectedButtonColor, forState: .Normal )
        button.setTitleColor( selectedButtonColor, forState: .Selected )
        button.backgroundColor = UIColor.clearColor()
        button.imageView?.contentMode = UIViewContentMode.ScaleAspectFit
        
        setupMenuButton( viewController )
        setupTitleView( viewController )
        
        tabButtonList.append(button)
    }
    
    func selectTab(sender: UIButton) {
        // Find the selected button
        for ( index, button ) in enumerate( tabButtonList ) {
            if sender == button {
                selectViewControllerAtIndex(index)
                return
            }
        }
    }
    
    func selectViewControllerAtIndex(index: Int) {
        
        var previousSelectedIndex = selectedIndex
        
        if previousSelectedIndex != index {
            
            if previousSelectedIndex >= 0 && previousSelectedIndex < tabButtonList.count {
                tabButtonList[previousSelectedIndex].selected = false;
            }
            selectedIndex = index
            
            setViewControllers( [tabViewControllers[selectedIndex]], animated: false)
            tabButtonList[selectedIndex].selected = true;
        } else {
            println("Selected same tab")
        }
    }
    
    private let selectedButtonColor = UIColor(red: 0.992, green: 0.710, blue: 0.0, alpha: 1.0)
    private let unselectedButtonColor = UIColor.whiteColor()
    private let defaultButtonFrame = CGRectMake(0, 0, 60, 40)
    private let pageTitleColor = UIColor.whiteColor()
    
    private let pageTitleFont = "HelveticaNeue-Bold"

    private var tabButtonList: [UIButton] = []
    private var tabViewControllers: [TabViewController] = []
    private let tabView = UIImageView(frame: CGRectZero)
    private var homeViewController: TabViewController = TabViewController()
    
}