Skip to content

hsoi/RGPageViewController

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

73 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

RGPageViewController

RGPageViewController is a custom UIPageViewController written in Swift. It is inspired by ICViewPager by Ilter Cengiz but with some modifications. It combines an Android-like ViewPager with the blur effect introduced in iOS7. It is fully customizable and can also be used as a replacement for UITabBar.

Screenshots

Installation

Simply copy RGPageViewController.swift to your project.

Usage

Subclass RGPageViewController and implement it's datasource and delegate methods.

class MainViewController: RGPageViewController, RGPageViewControllerDataSource, RGPageViewControllerDelegate {
    var tabTitles: NSArray = NSArray()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let dateFormatter = NSDateFormatter()
        tabTitles = dateFormatter.monthSymbols

        self.datasource = self
        self.delegate = self
    }
}

RGPageViewControllerDataSource

func numberOfPagesForViewController(pageViewController: RGPageViewController) -> Int

Description:  Asks the datasource about the number of pages.
Parameters:  pageViewController
                       the RGPageViewController instance that's subject to.
Returns:        the total number of pages.

func tabViewForPageAtIndex(pageViewController: RGPageViewController, index: Int) -> UIView

Description:  Asks the datasource to give a view to display as a tab item.
Parameters:  pageViewController
                       the RGPageViewController instance that's subject to.
                       index
                       the index of the tab whose view is asked.
Returns:        a UIView instance that will be shown as tab at the given index.

func viewControllerForPageAtIndex(pageViewController: RGPageViewController, index: Int) -> UIViewController?

Description:  Asks the datasource to give a ViewController to display as a page.
Parameters:  pageViewController
                       the RGPageViewController instance that's subject to.
                       index
                       the index of the content whose view is asked.
Returns:        a UIViewController instance whose view will be shown as content at the given index.

RGPageViewControllerDelegate

optional func willChangePageToIndex(index: Int, fromIndex from: Int)

Description:  Delegate objects can implement this method if they want to be informed when a page
                       is about to change.
Parameters:  index
                       the index of the new page.
                      from
                       the index of the old page.

optional func didChangePageToIndex(index: Int)

Description:  Delegate objects can implement this method if they want to be informed when a page
                       changed.
Parameters:  index
                       the index of the current page.

optional func widthForTabAtIndex(index: Int) -> CGFloat

Description:  Delegate objects can implement this method if tabs use dynamic width
                       or to overwrite the default width for tabs.
Parameters:  index
                       the index of the tab.
Returns:        the width for the tab at the given index.

optional func heightForTabAtIndex(index: Int) -> CGFloat

Description:  Delegate objects can implement this method if tabs use dynamic height
                       or to overwrite the default height for tabs.
Parameters:  index
                       the index of the tab.
Returns:        the height for the tab at the given index.

Examples

All RGPageViewControllerDataSource protocol methods must be implemented. All RGPageViewControllerDelegate protocol methods are optional.

Basic Configuration

// MARK: - RGPageViewController Data Source
func numberOfPagesForViewController(pageViewController: RGPageViewController) -> Int {
    // return the total number of pages
    return self.tabTitles.count
}
    
func tabViewForPageAtIndex(pageViewController: RGPageViewController, index: Int) -> UIView {
    // return a simple label for the tab view
    let title: String = self.tabTitles.objectAtIndex(index) as String
    let label: UILabel = UILabel()
    
    label.text = title
    
    label.sizeToFit()
        
    return label
}
    
func viewControllerForPageAtIndex(pageViewController: RGPageViewController, index: Int) -> UIViewController? {
    // Create a new view controller and pass suitable data.
    let dataViewController = self.storyboard!.instantiateViewControllerWithIdentifier("DataViewController") as DataViewController
        
    dataViewController.dataObject = self.tabTitles[index]
        
    return dataViewController
}

UITabBar replacement

If you need something similar to a UITabBar but with the features of a UIPageViewController, change your tabViewForPageAtIndex(pageViewController: RGPageViewController, index: Int) and implement heightForTabbar() and override the default position RGTabbarPosition.Top.

// MARK: - RGTabbarPosition
override var tabbarPosition: RGTabbarPosition {
    get {
        return .Bottom
    }
}

// MARK: - TabbarHeight
override var tabbarHeight: CGFloat {
    get {
        return 49
    }
}

// MARK: - RGPageViewController Data Source
func tabViewForPageAtIndex(pageViewController: RGPageViewController, index: Int) -> UIView {
    let title: String = self.tabTitles.objectAtIndex(index) as String
    // create a RGTabBarItem and pass a title, an image and a color
    // the color will be used for tinting image and text
    let tabView: RGTabBarItem = RGTabBarItem(frame: CGRectMake(0.0, 0.0, self.view.bounds.width / 6.0, 49.0), text: title, image: UIImage(named: "Grid"), color: nil)
    
    // if you want to adjust the color for selected state of the item, adjust the tintColor
    tabView.tintColor = UIColor.redColor()
        
    return tabView
}

Additional Options

UIPageViewControllerNavigationOrientation

Change the default orientation of the pageView by overriding pagerOrientation.
Default:   UIPageViewControllerNavigationOrientation.Horizontal
Options:  Horizontal | Vertical

// MARK: - UIPageViewControllerNavigationOrientation
override var pagerOrientation: UIPageViewControllerNavigationOrientation {
    get {
        return .Vertical
    }
}
RGTabbarPosition

Change the default position of the Tabbar by overriding tabbarPosition.
Default:   RGTabbarPosition.Top
Options:  Top | Bottom | Left | Right

// MARK: - RGTabbarPosition
override var tabbarPosition: RGTabbarPosition {
    get {
        return .Left
    }
}
RGTabbarStyle

Change the default style of the Tabbar by overriding tabbarStyle.
Default:   RGTabbarStyle.Blurred
Options:  Blurred | Solid

// MARK: - RGTabbarStyle
override var tabbarStyle: RGTabbarStyle {
    get {
        return .Solid
    }
}
RGTabStyle

Change the default style of the Tabs by overriding tabStyle.
Default:   RGTabStyle.None
Options:  None | InactiveFaded

// MARK: - RGTabStyle
override var tabStyle: RGTabStyle {
    get {
        return .InactiveFaded
    }
}

License

The MIT License (MIT)

Copyright (c) 2014 Ronny Gerasch

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

About

A custom UIPageViewController written in Swift

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Swift 100.0%