RGNPageMenu 1.0.2

RGNPageMenu 1.0.2

TestsTested
LangLanguage SwiftSwift
License MIT
ReleasedLast Release Sep 2016
SPMSupports SPM

Maintained by Kohei Iwasaki.



  • By
  • Iwark

RGNPageMenu.swift

RGNPageMenu is easily customizable paging menu controller.

rgn-page-menu-sample-1

Example Usage

This is from Demo project.

  • Set the initial page index
  • Add non-page item (such as “Add Page Button”) to menu.
import UIKit

class ViewController: UIViewController {

    var titles = ["Python", "C++", "Ruby", "Swift", "Go", "Elixir"]
    var viewControllers:[String:UIViewController] = [:]
    var pageMenu: RGNPageMenu!

    override func viewDidLoad() {
        super.viewDidLoad()

        let options:[RGNPageMenuOption] = [
            .initialPageIndex(1),
            .menuHeight(80.0),
            .menuItemMargin(20.0),
            .menuItemPadding(20.0)
        ]
        self.pageMenu = RGNPageMenu(frame: self.view.frame, delegate: self, options: options)
        self.view.addSubview(self.pageMenu.view)

        self.pageMenu.menuScrollView.backgroundColor = UIColor(red: 250.0/255, green: 250.0/255, blue: 250.0/255, alpha: 1.0)
    }
}

// MARK: - RGNPageMenuDelegate
extension ViewController: RGNPageMenuDelegate {

    // Number of controllers
    func rgnNumberOfControllers() -> Int {
        return titles.count
    }

    // Controller at index
    func rgnController(atIndex index: Int) -> UIViewController {
        let t = titles[index]
        if let vc = self.viewControllers[t] {
            return vc
        } else {
            let vc = MyTableViewController()
            vc.title = t
            self.viewControllers[t] = vc
            return vc
        }
    }

    // Number of menu items
    func rgnNumberOfMenuItems() -> Int {
        return titles.count + 1
    }

    // Menu label at index
    func rgnMenuLabel(atIndex index: Int) -> UILabel {
        let label = UILabel()
        if index == titles.count {
            label.text = "Add Language"
        } else {
            label.text = titles[index]
        }
        label.font = UIFont.systemFont(ofSize: 13.0)
        if index == self.pageMenu.currentPageIndex {
            label.textColor = UIColor.white
            label.backgroundColor = UIColor(red: 236.0/255, green: 109.0/255, blue: 109.0/255, alpha: 1.0)
            label.layer.cornerRadius = 10.0
            label.layer.masksToBounds = true
        } else {
            label.textColor = UIColor(red: 116.0/255, green: 116.0/255, blue: 116.0/255, alpha: 1.0)
        }
        label.textAlignment = NSTextAlignment.center
        label.sizeToFit()
        if label.frame.size.width < 44 {
            label.frame.size.width = 44
        }
        label.frame.size.height += 8.0
        return label
    }

    // Tap handler for menu items (optional)
    func rgnMenuItemTapped(atIndex index: Int) {
        if index == titles.count {
            self.titles.append("New Language\(index)")
            self.pageMenu.reloadData(resetPosition: true)
        } else {
            self.pageMenu.moveToPage(index)
        }
    }

    // Page changed (optional)
    func rgnDidMoveTo(pageIndex index: Int) {
        let vc = self.rgnController(atIndex: index) as! MyTableViewController
        vc.viewDidPresent()
    }

}

Runtime Requirements

  • iOS 8.0 or later
  • Xcode 8.0 - Swift3.0

Contribution

Please file issues or submit pull requests for anything you’d like to see! We’re waiting! :)

License

RGNPageMenu is released under the MIT license.