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()
}