{"id":13396478,"url":"https://github.com/kitasuke/PagingMenuController","last_synced_at":"2025-03-13T23:31:20.695Z","repository":{"id":31804242,"uuid":"35370819","full_name":"kitasuke/PagingMenuController","owner":"kitasuke","description":"Paging view controller with customizable menu in Swift","archived":true,"fork":false,"pushed_at":"2022-02-09T13:22:51.000Z","size":740,"stargazers_count":2496,"open_issues_count":78,"forks_count":449,"subscribers_count":67,"default_branch":"master","last_synced_at":"2024-09-26T22:21:12.964Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kitasuke.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-05-10T12:51:39.000Z","updated_at":"2024-09-25T07:42:14.000Z","dependencies_parsed_at":"2022-07-29T21:49:03.085Z","dependency_job_id":null,"html_url":"https://github.com/kitasuke/PagingMenuController","commit_stats":null,"previous_names":[],"tags_count":52,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kitasuke%2FPagingMenuController","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kitasuke%2FPagingMenuController/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kitasuke%2FPagingMenuController/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kitasuke%2FPagingMenuController/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kitasuke","download_url":"https://codeload.github.com/kitasuke/PagingMenuController/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":221421545,"owners_count":16817827,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-30T18:00:54.525Z","updated_at":"2024-10-25T11:30:41.248Z","avatar_url":"https://github.com/kitasuke.png","language":"Swift","funding_links":[],"categories":["UI","Libs","Swift","UI and SwiftUI"],"sub_categories":["UI","Layout"],"readme":"![](https://raw.githubusercontent.com/wiki/kitasuke/PagingMenuController/images/logo.png)\n\n[![CI Status](http://img.shields.io/travis/kitasuke/PagingMenuController.svg?style=flat)](https://travis-ci.org/kitasuke/PagingMenuController)\n[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/kitasuke/PagingMenuController)\n[![Version](https://img.shields.io/cocoapods/v/PagingMenuController.svg?style=flat)](http://cocoapods.org/pods/PagingMenuController)\n[![License](https://img.shields.io/cocoapods/l/PagingMenuController.svg?style=flat)](http://cocoapods.org/pods/PagingMenuController)\n[![Platform](https://img.shields.io/cocoapods/p/PagingMenuController.svg?style=flat)](http://cocoapods.org/pods/PagingMenuController)\n![Swift 3.0.x](https://img.shields.io/badge/Swift-3.0.x-orange.svg)\n\nThis library is inspired by [PageMenu](https://github.com/uacaps/PageMenu)\n\n## Updates\n\nSee [CHANGELOG](https://github.com/kitasuke/PagingMenuController/blob/master/CHANGELOG.md) for details\n\n## Description\n\n### Standard mode with flexible item width\n\n\u003cimg src=\"https://raw.githubusercontent.com/wiki/kitasuke/PagingMenuController/images/demo4.gif\" width=\"160\" height=\"284\"\u003e\n\n### Segmented control mode\n\n\u003cimg src=\"https://raw.githubusercontent.com/wiki/kitasuke/PagingMenuController/images/demo2.gif\" width=\"284\" height=\"160\"\u003e\n\n### Infinite mode with fixed item width\n\n\u003cimg src=\"https://raw.githubusercontent.com/wiki/kitasuke/PagingMenuController/images/demo3.gif\" width=\"160\" height=\"284\"\u003e\n\n## Customization\n\n### PagingMenuControllerCustomizable\n\n* default page index to show as a first view\n```Swift\ndefaultPage: Int\n```\n\n* duration for paging view animation\n```Swift\nanimationDuration: TimeInterval\n```\n\n* isScrollEnabled for paging view. **Set false in case of using swipe-to-delete on your table view**\n```swift\nisScrollEnabled: Bool\n```\n\n* background color for paging view\n```Swift\nbackgroundColor: UIColor\n```\n\n* number of lazy loading pages\n```swift\nlazyLoadingPage: LazyLoadingPage\npublic enum LazyLoadingPage {\n    case one // Currently sets false to isScrollEnabled at this moment. Should be fixed in the future.\n    case three\n    case all // Currently not available for Infinite mode\n}\n```\n\n* a set of menu controller\n```swift\nmenuControllerSet: MenuControllerSet\npublic enum MenuControllerSet {\n        case single\n        case multiple\n    }\n```\n\n* component type of PagingMenuController\n```swift\ncomponentType: ComponentType\npublic enum ComponentType {\n    case menuView(menuOptions: MenuViewCustomizable)\n    case pagingController(pagingControllers: [UIViewController])\n    case all(menuOptions: MenuViewCustomizable, pagingControllers: [UIViewController])\n}\n```\n\n### MenuViewCustomizable\n\n* background color for menu view\n```Swift\nbackgroundColor: UIColor\n```\n\n* background color for selected menu item\n```Swift\nselectedBackgroundColor: UIColor\n```\n\n* height for menu view\n```Swift\nheight: CGFloat\n```\n\n* duration for menu view animation\n```Swift\nanimationDuration: TimeInterval\n```\n\n* decelerating rate for menu view\n```swift\ndeceleratingRate: CGFloat\n```\n\n* menu item position\n```swift\nmenuSelectedItemCenter: Bool\n```\n\n* menu mode and scrolling mode\n\n```swift\ndisplayMode: MenuDisplayMode\n\npublic enum MenuDisplayMode {\n    case standard(widthMode: MenuItemWidthMode, centerItem: Bool, scrollingMode: MenuScrollingMode)\n    case segmentedControl\n    case infinite(widthMode: MenuItemWidthMode, scrollingMode: MenuScrollingMode) // Requires three paging views at least\n}\n\npublic enum MenuItemWidthMode {\n    case flexible\n    case fixed(width: CGFloat)\n}\n\npublic enum MenuScrollingMode {\n  case scrollEnabled\n  case scrollEnabledAndBouces\n  case pagingEnabled\n}\n```\n\nif `centerItem` is true, selected menu item is always on center\n\nif `MenuScrollingMode` is `ScrollEnabled` or `ScrollEnabledAndBouces`, menu view allows scrolling to select any menu item\nif `MenuScrollingMode` is `PagingEnabled`, menu item should be selected one by one\n\n* menu item focus mode\n```Swift\nfocusMode: MenuFocusMode\npublic enum MenuFocusMode {\n    case none\n    case underline(height: CGFloat, color: UIColor, horizontalPadding: CGFloat, verticalPadding: CGFloat)\n    case roundRect(radius: CGFloat, horizontalPadding: CGFloat, verticalPadding: CGFloat, selectedColor: UIColor)\n}\n```\n\n* dummy item view number for Infinite mode\n```swift\ndummyItemViewsSet: Int\n```\n\n* menu position\n\n```swift\nmenuPosition: MenuPosition\n\npublic enum MenuPosition {\n    case top\n    case bottom\n}\n```\n\n* divider image to display right aligned in each menu item  \n\n```swift\ndividerImage: UIImage?\n```\n\n### MenuItemViewCustomizable\n\n* horizontal margin for menu item\n```swift\nhorizontalMargin: CGFloat\n```\n\n* menu item mode\n```swift\ndisplayMode: MenuItemDisplayMode\npublic enum MenuItemDisplayMode {\n    case text(title: MenuItemText)\n    case multilineText(title: MenuItemText, description: MenuItemText)\n    case image(image: UIImage, selectedImage: UIImage?)\n    case custom(view: UIView)\n}\n```\n\n## Usage\n\n`import PagingMenuController` to use PagingMenuController in your file.\n\n### Using Storyboard\n\n```Swift\nstruct MenuItem1: MenuItemViewCustomizable {}\nstruct MenuItem2: MenuItemViewCustomizable {}\n\nstruct MenuOptions: MenuViewCustomizable {\n    var itemsOptions: [MenuItemViewCustomizable] {\n        return [MenuItem1(), MenuItem2()]\n    }\n}\n\nstruct PagingMenuOptions: PagingMenuControllerCustomizable {\n    var componentType: ComponentType {\n        return .all(menuOptions: MenuOptions(), pagingControllers: [UIViewController(), UIViewController()])\n    }\n}\n\nlet pagingMenuController = self.childViewControllers.first as! PagingMenuController\npagingMenuController.setup(options)\npagingMenuController.onMove = { state in\n    switch state {\n    case let .willMoveController(menuController, previousMenuController):\n        print(previousMenuController)\n        print(menuController)\n    case let .didMoveController(menuController, previousMenuController):\n        print(previousMenuController)\n        print(menuController)\n    case let .willMoveItem(menuItemView, previousMenuItemView):\n        print(previousMenuItemView)\n        print(menuItemView)\n    case let .didMoveItem(menuItemView, previousMenuItemView):\n        print(previousMenuItemView)\n        print(menuItemView)\n    case .didScrollStart:\n        print(\"Scroll start\")\n    case .didScrollEnd:\n        print(\"Scroll end\")\n    }\n}\n```\n* You should add `ContainerView` into your view controller's view and set `PagingMenuController` as the embedded view controller's class\n\nSee `PagingMenuControllerDemo` target in demo project for more details\n\n### Coding only\n```Swift\nstruct MenuItem1: MenuItemViewCustomizable {}\nstruct MenuItem2: MenuItemViewCustomizable {}\n\nstruct MenuOptions: MenuViewCustomizable {\n    var itemsOptions: [MenuItemViewCustomizable] {\n        return [MenuItem1(), MenuItem2()]\n    }\n}\n\nstruct PagingMenuOptions: PagingMenuControllerCustomizable {\n    var componentType: ComponentType {\n        return .all(menuOptions: MenuOptions(), pagingControllers: [UIViewController(), UIViewController()])\n    }\n}\n\nlet options = PagingMenuOptions()\nlet pagingMenuController = PagingMenuController(options: options)\n\naddChildViewController(pagingMenuController)\nview.addSubview(pagingMenuController.view)\npagingMenuController.didMove(toParentViewController: self)\n```\n\nSee `PagingMenuControllerDemo2` target in demo project for more details\n\n### Menu move handler (optional)\n\n```Swift\npublic enum MenuMoveState {\n    case willMoveController(to: UIViewController, from: UIViewController)\n    case didMoveController(to: UIViewController, from: UIViewController)\n    case willMoveItem(to: MenuItemView, from: MenuItemView)\n    case didMoveItem(to: MenuItemView, from: MenuItemView)\n    case didScrollStart\n    case didScrollEnd\n}\n\npagingMenuController.onMove = { state in\n    switch state {\n    case let .willMoveController(menuController, previousMenuController):\n        print(previousMenuController)\n        print(menuController)\n    case let .didMoveController(menuController, previousMenuController):\n        print(previousMenuController)\n        print(menuController)\n    case let .willMoveItem(menuItemView, previousMenuItemView):\n        print(previousMenuItemView)\n        print(menuItemView)\n    case let .didMoveItem(menuItemView, previousMenuItemView):\n        print(previousMenuItemView)\n        print(menuItemView)\n    case .didScrollStart:\n        print(\"Scroll start\")\n    case .didScrollEnd:\n        print(\"Scroll end\")\n    }\n}\n```\n\n### Moving to a menu tag programmatically\n\n```swift\n// if you pass a nonexistent page number, it'll be ignored\npagingMenuController.move(toPage: 1, animated: true)\n```\n\n### Changing PagingMenuController's option\n\nCall `setup` method with new options again.\nIt creates a new paging menu controller. Do not forget to cleanup properties in child view controller.\n\n## Requirements\n\niOS9+  \nSwift 3.0+  \nXcode 8.0+\n\n[v1.4.0](https://github.com/kitasuke/PagingMenuController/releases/tag/1.4.0) for iOS 8 in Swift 3.0  \n[v1.2.0](https://github.com/kitasuke/PagingMenuController/releases/tag/1.2.0) for iOS 8 in Swift 2.3\n\n## Installation\n\n### CocoaPods\nPagingMenuController is available through [CocoaPods](http://cocoapods.org). To install\nit, simply add the following line to your Podfile:\n\n```ruby\nsource 'https://github.com/CocoaPods/Specs.git'\nplatform :ios, '9.0'\nuse_frameworks!\n\npod \"PagingMenuController\"\n\npost_install do |installer|\n installer.pods_project.targets.each do |target|\n   target.build_configurations.each do |config|\n     config.build_settings['SWIFT_VERSION'] = '3.0'\n   end\n end\nend\n```\n\nThen, run `pod install`\n\nIn case you haven't installed CocoaPods yet, run the following command\n\n```ruby\n$ gem install cocoapods\n```\n\n### Carthage\nPagingMenuController is available through [Carthage](https://github.com/Carthage/Carthage).\n\nTo install PagingMenuController into your Xcode project using Carthage, specify it in your Cartfile:\n\n```ruby\ngithub \"kitasuke/PagingMenuController\"\n```\n\nThen, run `carthage update --toolchain com.apple.dt.toolchain.Swift_3_0`\n\nYou can see `Carthage/Build/iOS/PagingMenuController.framework` now, so drag and drop it to `Linked Frameworks and Libraries` in General menu tab with your project.\nAdd the following script to `New Run Script Phase` in Build Phases menu tab.\n```ruby\n/usr/local/bin/carthage copy-frameworks\n```\n\nAlso add the following script in `Input Files`\n```ruby\n$(SRCROOT)/Carthage/Build/iOS/PagingMenuController.framework\n```\n\nIn case you haven't installed Carthage yet, download the latest pkg from [Carthage](https://github.com/Carthage/Carthage/releases)\n\n### Manual\n\nCopy all the files in `Pod/Classes` directory into your project.\n\n## License\n\nPagingMenuController is available under the MIT license. See the [LICENSE](https://github.com/kitasuke/PagingMenuController/blob/master/LICENSE) file for more info.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkitasuke%2FPagingMenuController","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkitasuke%2FPagingMenuController","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkitasuke%2FPagingMenuController/lists"}