Skip to content

Instantly share code, notes, and snippets.

@NeedMoreDesu
Created May 26, 2016 14:16
Show Gist options
  • Save NeedMoreDesu/c4df4c87cbffb619c2c1ba1f57aedcbb to your computer and use it in GitHub Desktop.
Save NeedMoreDesu/c4df4c87cbffb619c2c1ba1f57aedcbb to your computer and use it in GitHub Desktop.
import UIKit
class ParentVC: UIViewController {
enum LeftItem {
case none
case backSystemDefault
case backGeneral
case backCustom(image: UIImage?, title: String?, leftSpaceCloseToDefault:Bool)
case backFn(visibilityFn:(() -> Bool), backFn:(() -> ()))
case backCustomFn(image: UIImage?, title: String?, leftSpaceCloseToDefault:Bool, visibilityFn:(() -> Bool), backFn:(() -> ()))
case customView(view: UIView)
}
var leftItem: LeftItem = LeftItem.backGeneral {
didSet {
self.updateNavigationBarUI()
}
}
lazy var backButtonImage = UIImage(named: "back_button")?.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)
func navigationControllerPop() {
self.navigationController?.popViewControllerAnimated(true)
}
func createEmptyButton() -> UIBarButtonItem {
return UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: self, action: nil)
}
func createCustomBackButton(image: UIImage?, title: String?, leftSpaceCloseToDefault:Bool, backFn: (() -> ())) -> [UIBarButtonItem] {
var arr: [UIBarButtonItem] = []
if leftSpaceCloseToDefault {
let negativeSpacer = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FixedSpace, target: nil, action: nil)
negativeSpacer.width = -8
arr.append(negativeSpacer)
}
if let image = image,
title = title {
let button = BlockBarButtonItem(image: image, title: title, actionHandler: backFn)
arr.append(button)
} else {
if let image = image {
let imageButton = BlockBarButtonItem(image: image, actionHandler: backFn)
imageButton.title = title
arr.append(imageButton)
}
if let title = title {
let titleButton = BlockBarButtonItem(title: title, actionHandler: backFn)
arr.append(titleButton)
}
}
return arr
}
func createBackButtonGeneral() -> [UIBarButtonItem] {
return createCustomBackButton(backButtonImage, title: nil, leftSpaceCloseToDefault: true, backFn: navigationControllerPop)
}
func createBackButtonWithFn(backFn: (() -> ()) ) -> [UIBarButtonItem] {
return createCustomBackButton(backButtonImage, title: nil, leftSpaceCloseToDefault: true, backFn: backFn)
}
func updateNavigationBarUI() {
self.navigationItem.backBarButtonItem = createEmptyButton()
self.navigationItem.leftBarButtonItem = nil
self.navigationItem.leftBarButtonItems = nil
self.navigationItem.hidesBackButton = true
switch self.leftItem {
case .none:
break;
case .backSystemDefault:
self.navigationItem.backBarButtonItem = nil
self.navigationItem.hidesBackButton = false
case .backGeneral:
if (self.navigationController?.viewControllers.count > 1) {
self.navigationItem.leftBarButtonItems = createBackButtonGeneral()
}
case .backFn(let visibilityFn, let backFn):
if (visibilityFn()) {
self.navigationItem.leftBarButtonItems = createBackButtonWithFn(backFn)
}
case .backCustom(let image, let title, let leftSpaceCloseToDefault):
if (self.navigationController?.viewControllers.count > 1) {
self.navigationItem.leftBarButtonItems = createCustomBackButton(image, title: title, leftSpaceCloseToDefault: leftSpaceCloseToDefault, backFn: navigationControllerPop)
}
case .backCustomFn(let image, let title, let leftSpaceCloseToDefault, let visibilityFn, let backFn):
if (visibilityFn()) {
self.navigationItem.leftBarButtonItems = createCustomBackButton(image, title: title, leftSpaceCloseToDefault: leftSpaceCloseToDefault, backFn: backFn)
}
case .customView(let view):
self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: view)
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.updateNavigationBarUI()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment