Skip to content

Instantly share code, notes, and snippets.

@benjaminsnorris
Created December 17, 2015 23:50
Show Gist options
  • Save benjaminsnorris/baead59280f126175035 to your computer and use it in GitHub Desktop.
Save benjaminsnorris/baead59280f126175035 to your computer and use it in GitHub Desktop.
Page View Controller with Custom Tab Bar
//
// ListViewController.swift
// welbe
//
// Created by Ben Norris on 12/3/15.
// Copyright © 2015 O.C. Tanner Corporation. All rights reserved.
//
import UIKit
class ListViewController: UITableViewController {
enum ListType: Int {
case Upcoming
case Declined
case Completed
static var count: Int {
if _count > 0 { return _count }
while let _ = ListType(rawValue: ++_count) {}
return _count
}
private static var _count = 0
}
}
//
// RootViewController.swift
// welbe
//
// Created by Ben Norris on 12/8/15.
// Copyright © 2015 O.C. Tanner Corporation. All rights reserved.
//
import UIKit
class RootViewController: UIViewController, SegueHandlerType {
enum SegueIdentifier: String {
case EmbedPageViewController = "EmbedPageViewController"
}
private var pageViewController: UIPageViewController?
@IBOutlet weak var customTabBar: CustomTabBar!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let board = UIStoryboard(name: "Storyboard", bundle: nil)
guard let list = board.instantiateViewControllerWithIdentifier(ListViewController.storyboardIdentifier) as? ListViewController else { fatalError("Expected to get ListViewController") }
guard let pageViewController = pageViewController else { fatalError("Should have page view controller") }
pageViewController.setViewControllers([list], direction: .Forward, animated: false, completion: nil)
customTabBar.titles = ["Upcoming", "Declined", "Completed"]
customTabBar.delegate = self
}
// MARK: - Navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
switch segueIdentifierForSegue(segue) {
case .EmbedPageViewController:
guard let pageViewController = segue.destinationViewController as? UIPageViewController else { fatalError("Expected to get Page View Controller") }
pageViewController.dataSource = self
pageViewController.delegate = self
self.pageViewController = pageViewController
}
}
}
// MARK: - Page view controller data source
extension RootViewController: UIPageViewControllerDataSource {
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
guard let currentList = viewController as? ListViewController else { fatalError("Must have a list for page view controller functionality") }
if currentList.listType.rawValue > 0 {
let previousIndex = currentList.listType.rawValue - 1
return navigationTarget(previousIndex)
} else {
return nil
}
}
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
guard let currentList = viewController as? ListViewController else { fatalError("Must have a list for page view controller functionality") }
if currentList.listType.rawValue < ListViewController.ListType.count - 1 {
let endIndex = currentList.listType.rawValue + 1
return navigationTarget(endIndex)
} else {
return nil
}
}
}
// MARK: - Page view controller delegate
extension RootViewController: UIPageViewControllerDelegate {
func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
guard let list = pageViewController.viewControllers?.first as? ListViewController else { fatalError("Expected a list") }
customTabBar.selectedIndex = list.listType.rawValue
}
}
// MARK: - Custom tab bar delegate
extension RootViewController: CustomTabBarDelegate {
func tabBar(tabBar: CustomTabBar, didSelectTab tab: Int) {
guard let pageViewController = pageViewController, currentViewController = pageViewController.viewControllers?.first as? ListViewController else { fatalError("Must have pageViewController to scroll") }
guard let targetViewController = navigationTarget(tab) where targetViewController != currentViewController else { return }
let forward = currentViewController.listType.rawValue < tab
pageViewController.setViewControllers([targetViewController], direction: forward ? .Forward : .Reverse, animated: true, completion: nil)
}
}
// MARK: - Private methods
private extension RootViewController {
func navigationTarget(index: Int) -> UIViewController? {
let board = UIStoryboard(name: "Storyboard", bundle: nil)
if let newListType = ListViewController.ListType(rawValue: index), newList = board.instantiateViewControllerWithIdentifier(ListViewController.storyboardIdentifier) as? ListViewController {
newList.listType = newListType
return newList
}
return nil
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment