GitPedia

SwiftPageMenu

Customizable Page Tab Menu Controller ๐Ÿ‘

From tamanyanยทUpdated June 14, 2026ยทView on GitHubยท

- Infinite Page Menu - Top / Bottom Position Menu - Custom Color Menu - Round Rect / Underline Page Cursor The project is written primarily in Swift, distributed under the MIT License license, first published in 2017. Key topics include: carthage, cocoapods, customizable, infinite, ios.

Latest release: 1.5.0

SwiftPageMenu

Carthage compatible

1
2
3
4

Customizable Page Menu ViewController in Swift

Features

  • Infinite Page Menu
  • Top / Bottom Position Menu
  • Custom Color Menu
  • Round Rect / Underline Page Cursor

This library is inspired by msaps/Pageboy, rechsteiner/Parchment, EndouMari/TabPageViewController

Requirements

  • iOS 12.0+
  • Swift 5+

How to use

Example

Here is an example of how to SwiftPageMenu.

PageMenuExample/Sources/PageTabMenuViewController.swift

swift
import UIKit import SwiftPageMenu // import Swift_PageMenu if you use cocoapods class PageTabMenuViewController: PageMenuController { let items: [[String]] let titles: [String] init(items: [[String]], titles: [String], options: PageMenuOptions? = nil) { self.items = items self.titles = titles super.init(options: options) } } extension PageTabMenuViewController: PageMenuControllerDataSource { func viewControllers(forPageMenuController pageMenuController: PageMenuController) -> [UIViewController] { return self.items.map(ChildViewController.init) } func menuTitles(forPageMenuController pageMenuController: PageMenuController) -> [String] { return self.titles } func defaultPageIndex(forPageMenuController pageMenuController: PageMenuController) -> Int { return 0 } } extension PageTabMenuViewController: PageMenuControllerDelegate { func pageMenuController(_ pageMenuController: PageMenuController, didScrollToPageAtIndex index: Int, direction: PageMenuNavigationDirection) { // The page view controller will begin scrolling to a new page. print("didScrollToPageAtIndex index:\(index)") } func pageMenuController(_ pageMenuController: PageMenuController, willScrollToPageAtIndex index: Int, direction: PageMenuNavigationDirection) { // The page view controller scroll progress between pages. print("willScrollToPageAtIndex index:\(index)") } func pageMenuController(_ pageMenuController: PageMenuController, scrollingProgress progress: CGFloat, direction: PageMenuNavigationDirection) { // The page view controller did complete scroll to a new page. print("scrollingProgress progress: \(progress)") } func pageMenuController(_ pageMenuController: PageMenuController, didSelectMenuItem index: Int, direction: PageMenuNavigationDirection) { print("didSelectMenuItem index: \(index)") } }

DataSource

SwiftPageMenu supports adding your own custom data sources.

swift
@objc public protocol PageMenuControllerDataSource: class { /// The view controllers to display in the page menu view controller. func viewControllers(forPageMenuController pageMenuController: PageMenuController) -> [UIViewController] /// The view controllers to display in the page menu view controller. func menuTitles(forPageMenuController pageMenuController: PageMenuController) -> [String] /// The default page index to display in the page menu view controller. func defaultPageIndex(forPageMenuController pageMenuController: PageMenuController) -> Int }

Delegate

SwiftPageMenu give you the events below code.

swift
@objc public protocol PageMenuControllerDelegate: class { /// The page view controller will begin scrolling to a new page. @objc optional func pageMenuController(_ pageMenuController: PageMenuController, willScrollToPageAtIndex index: Int, direction: PageMenuNavigationDirection) /// The page view controller scroll progress between pages. @objc optional func pageMenuController(_ pageMenuController: PageMenuController, scrollingProgress progress: CGFloat, direction: PageMenuNavigationDirection) /// The page view controller did complete scroll to a new page. @objc optional func pageMenuController(_ pageMenuController: PageMenuController, didScrollToPageAtIndex index: Int, direction: PageMenuNavigationDirection) /// The menu item of page view controller are selected. @objc optional func pageMenuController(_ pageMenuController: PageMenuController, didSelectMenuItem index: Int, direction: PageMenuNavigationDirection) }

Customization

It is easy to customize SwiftPageMenu. All customization is handled by the PageMenuOptions protocol.
You can create own struct that conforms to this protocol.

swift
import SwiftPageMenu struct RoundRectPagerOption: PageMenuOptions { var isInfinite: Bool = false var tabMenuPosition: TabMenuPosition = .top var menuItemSize: PageMenuItemSize { return .sizeToFit(minWidth: 80, height: 30) } var menuTitleColor: UIColor { return .white } var menuTitleSelectedColor: UIColor { return UIColor(red: 3/255, green: 125/255, blue: 233/255, alpha: 1) } var menuCursor: PageMenuCursor { return .roundRect(rectColor: .white, cornerRadius: 10, height: 22) } var font: UIFont { return .systemFont(ofSize: UIFont.systemFontSize) } var menuItemMargin: CGFloat { return 8 } var tabMenuBackgroundColor: UIColor { return UIColor(red: 3/255, green: 125/255, blue: 233/255, alpha: 1) } var tabMenuContentInset: UIEdgeInsets { return UIEdgeInsets(top: 0, left: 4, bottom: 0, right: 4) } public init(isInfinite: Bool = false, tabMenuPosition: TabMenuPosition = .top) { self.isInfinite = isInfinite self.tabMenuPosition = tabMenuPosition } }

Swift Package Manager

SwiftPageMenu is available through Swift Package Manager. Add SwiftPageMenu as a dependency to your Package.swift

swift
.package(url: "https://github.com/tamanyan/SwiftPageMenu", from: "1.5.0")

Carthage

To integrate SwiftPageMenu into your Xcode project using Carthage, specify it in your Cartfile:

ruby
github "tamanyan/SwiftPageMenu"

CocoaPods

target 'MyApp' do
  use_frameworks!
  pod 'Swift_PageMenu', '~> 1.4'
end

License

MIT license. See the LICENSE file for more info.

Contributors

Showing top 2 contributors by commit count.

View all contributors on GitHub โ†’

This article is auto-generated from tamanyan/SwiftPageMenu via the GitHub API.Last fetched: 6/14/2026