{"id":13466877,"url":"https://github.com/YuigaWada/PolioPager","last_synced_at":"2025-03-26T00:31:39.095Z","repository":{"id":56680787,"uuid":"205153926","full_name":"YuigaWada/PolioPager","owner":"YuigaWada","description":"A flexible TabBarController with search tab like SNKRS. ","archived":false,"fork":false,"pushed_at":"2020-10-25T17:27:55.000Z","size":4051,"stargazers_count":178,"open_issues_count":4,"forks_count":14,"subscribers_count":12,"default_branch":"master","last_synced_at":"2024-10-29T20:33:50.810Z","etag":null,"topics":["animation","carthage","cocoapods","ios-library","ios-ui","pager-controller","pagertabstrip","snkrs","swift","tab","tabbar"],"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/YuigaWada.png","metadata":{"files":{"readme":"README.md","changelog":null,"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":"2019-08-29T12:00:45.000Z","updated_at":"2024-06-04T07:53:35.000Z","dependencies_parsed_at":"2022-08-15T23:10:39.865Z","dependency_job_id":null,"html_url":"https://github.com/YuigaWada/PolioPager","commit_stats":null,"previous_names":[],"tags_count":21,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/YuigaWada%2FPolioPager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/YuigaWada%2FPolioPager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/YuigaWada%2FPolioPager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/YuigaWada%2FPolioPager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/YuigaWada","download_url":"https://codeload.github.com/YuigaWada/PolioPager/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245566099,"owners_count":20636391,"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":["animation","carthage","cocoapods","ios-library","ios-ui","pager-controller","pagertabstrip","snkrs","swift","tab","tabbar"],"created_at":"2024-07-31T15:00:50.962Z","updated_at":"2025-03-26T00:31:37.357Z","avatar_url":"https://github.com/YuigaWada.png","language":"Swift","funding_links":[],"categories":["Libs","UI [🔝](#readme)"],"sub_categories":["UI"],"readme":"# PolioPager\n[![License][license-image]][license-url]\n[![Swift Version][swift-image]][swift-url]\n[![CocoaPods Compatible](https://img.shields.io/cocoapods/v/EZSwiftExtensions.svg)](https://img.shields.io/cocoapods/v/LFAlertController.svg)\n[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)\n\n\u003cbr\u003e\nPolioPager is  the easiest way to use PagerTabStrip including search tab in iOS. Written in pure swift.\n\n(日本語は[こちら](https://qiita.com/yuwd/items/d69ab626d823bf16c1c7))\n\u003cbr\u003e\n\n\u003cimg src=\"image/PolioPager.gif\" width=100%\u003e\n\n\u003cbr\u003e\u003cbr\u003e\n\n## Comparison\nSNKRS\n\n\u003cimg src=\"image/SNKRS.gif\"\u003e\n\u003cbr\u003e\u003cbr\u003e\n\n↓↓↓↓\n\n\nPoiloPager\n\n\u003cimg src=\"image/PolioPager.gif\"\u003e\n\n\nPolioPager enables us to use  PagerTabStrip like SNKRS.\n\u003cbr\u003e\u003cbr\u003e\n\n## Installation\n\n#### CocoaPods\nYou can use [CocoaPods](http://cocoapods.org/) to install `PolioPager` by adding it to your `Podfile`:\n\n```ruby\npod 'PolioPager'\n```\n\nTo get the full benefits,  import `PolioPager`\n\n``` swift\nimport PolioPager\n```\n\n#### Carthage\nCreate a `Cartfile` that lists the framework and run `carthage update`. Follow the [instructions](https://github.com/Carthage/Carthage#if-youre-building-for-ios) to add `$(SRCROOT)/Carthage/Build/iOS/PolioPager.framework` to an iOS project.\n\n```\ngithub \"YuigaWada/PolioPager\"\n```\n\n#### Swift Package Manager\n\nOpen Xcode and Select from menu to File \u003e Swift Packages \u003e Add Package Depende.\n\n\n#### Manually\n1. Download and drop ```PolioPager``` in your project.  \n2. Congratulations!  \n\n\u003cbr\u003e\u003cbr\u003e\n\n## Usage example\n\n```swift\nimport PolioPager\n\nclass ViewController: PolioPagerViewController {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n    }\n\n    override func tabItems()-\u003e [TabItem] {\n        return [TabItem(title: \"Redbull\"),TabItem(title: \"Monster\"),TabItem(title: \"Caffeine Addiction\")]\n    }\n\n    override func viewControllers()-\u003e [UIViewController]\n    {\n        let storyboard = UIStoryboard(name: \"Main\", bundle: nil)\n\n        let viewController1 = storyboard.instantiateViewController(withIdentifier: \"searchView\")\n        let viewController2 = storyboard.instantiateViewController(withIdentifier: \"view1\")\n        let viewController3 = storyboard.instantiateViewController(withIdentifier: \"view2\")\n        let viewController4 = storyboard.instantiateViewController(withIdentifier: \"view3\")\n\n        return [viewController1, viewController2, viewController3, viewController4]\n    }\n}\n```\n\u003cbr\u003e\u003cbr\u003e\n\n## Usage\n\nPolioPager is very simple.\n\nFirst, you have to create a view controller that extends  ``PolioPagerViewController``\n\n```swift\nclass ViewController: PolioPagerViewController {\n    ...\n}\n```\n\u003cbr\u003e\u003cbr\u003e\n*You need at least ``tabItems()`` and ``viewControllers()``.*\n\n\n\n### Tab Items\n\nYou only have to  prepare TabItem Structure and override ``tabItems()`` .\n\nWidths of each tab are automatically calculated.\n\n```swift\noverride func tabItems()-\u003e [TabItem] {\n    return [TabItem(title: \"Redbull\"),TabItem(title: \"Monster\"),TabItem(title: \"Caffeine Addiction\")]\n}\n```\n### ViewControllers\n\nOverride ``viewControllers()`` .\n\n```swift\noverride func viewControllers()-\u003e [UIViewController]\n{\n    let storyboard = UIStoryboard(name: \"Main\", bundle: nil)\n\n    let viewController1 = storyboard.instantiateViewController(withIdentifier: \"searchView\")\n    let viewController2 = storyboard.instantiateViewController(withIdentifier: \"view1\")\n\n    return [viewController1, viewController2]\n}\n```\n\nIn the above example, ViewControllers are prepared from storyboard.\n\n\nFor those who don't know `` instantiateViewController`` , check below.\n\n\u003cimg src=\"image/storyboardID1.png\"\u003e\n\n\u003cbr\u003e\u003cbr\u003e\n↓\n\u003cbr\u003e\u003cbr\u003e\n\n\u003cimg src=\"image/storyboardID2.png\"\u003e\n\n\u003cbr\u003e\u003cbr\u003e\n\n### TabItem structure\n\nTabItem is defined as follow.\n\n```swift\npublic struct TabItem {\n    var title: String?\n    var image: UIImage?\n    var font: UIFont\n    var cellWidth: CGFloat?\n    var backgroundColor: UIColor\n    var normalColor:UIColor\n    var highlightedColor: UIColor\n\n    public init(title: String? = nil,\n    image: UIImage? = nil,\n    font:UIFont = .systemFont(ofSize: 15),\n    cellWidth: CGFloat? = nil,\n    backgroundColor: UIColor = .white,\n    normalColor: UIColor = .lightGray,\n    highlightedColor: UIColor = .black){\n\n        self.title = title\n        self.image = image\n        self.font = font\n        self.cellWidth = cellWidth\n        self.backgroundColor = backgroundColor\n        self.normalColor = normalColor\n        self.highlightedColor = highlightedColor\n\n    }\n}\n\n```\n\n### Search ViewController\n\nTo get input on TextFiled in Search ViewController, you have to adopt ``PolioPagerSearchTabDelegate`` protocol.\n\nFor example,\n\n```swift\nimport PolioPager\n\nclass SearchViewController: UIViewController, PolioPagerSearchTabDelegate, UITextFieldDelegate {\n\n    @IBOutlet weak var label: UILabel!\n\n\n    var searchBar: UIView!\n    var searchTextField: UITextField!\n    var cancelButton: UIButton!\n\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        self.searchTextField.delegate = self\n    }\n\n    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -\u003e Bool {\n        guard let text = textField.text else{ return true }\n\n        label.text = text\n        return true\n    }\n\n\n}\n```\n\n\u003cbr\u003e\u003cbr\u003e\n\n## Customization\n\n\n### Color \u0026 Frame \u0026 Duration\n\nCheck this.\n\n\n```swift\n//color\npublic var tabBackgroundColor: UIColor = .white\n\n//duration\npublic var barAnimationDuration: Double = 0.23\n```\n\n\u003cimg src=\"image/tab.png\"\u003e\n\n```swift\npublic var eachLineSpacing: CGFloat = 5\npublic var sectionInset: UIEdgeInsets = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 10)\n\npublic var selectedBarHeight: CGFloat = 3\n```\n\n\u003cbr\u003e\u003cbr\u003e\n\n\u003cimg src=\"image/tab-margin.png\"\u003e\n\n```swift\n//selectedBar\npublic var selectedBarMargins: (upper: CGFloat, lower: CGFloat) = (1, 2)\n\n//pageView\npublic var pageViewMargin: CGFloat = 1\n\n```\n\n\u003cbr\u003e\u003cbr\u003e\n\n### Border\n\nYou can draw the border between Tab and pageView.\n\n```swift\npublic var needBorder: Bool\npublic var boderHeight: CGFloat = 1\npublic var borderColor: UIColor = .lightGray\n```\n\n\u003cbr\u003e\u003cbr\u003e\n\n### Duration\n\n```swift\npublic var barAnimationDuration: Double = 0.23 //Default.\n```\n\u003cimg src=\"image/Duration023.gif\"\u003e\n\n```swift\npublic var barAnimationDuration: Double = 0.10\n```\n\u003cimg src=\"image/Duration01.gif\"\u003e\n\n\u003cbr\u003e\u003cbr\u003e\n\n### Others\n\nYou can also get these Components!\n\n```swift\n//MARK: open IBOutlet\n@IBOutlet weak open var collectionView: UICollectionView!\n@IBOutlet weak open var searchBar: UIView!\n@IBOutlet weak open var selectedBar: UIView!\n@IBOutlet weak open var pageView: UIView!\n@IBOutlet weak open var searchTextField: UITextField!\n@IBOutlet weak open var cancelButton: UIButton!\n```\n\nFor Example, if you want to change the appearance of selectedBar,\n\n```swift\n//PolioPagerViewController\n\noverride func viewDidLoad() {\n     self.selectedBarHeight = 2\n     self.selectedBar.layer.cornerRadius = 0\n     self.selectedBar.backgroundColor = .gray\n\n     super.viewDidLoad()\n }\n```\n\n\u003cimg src=\"image/selectedBar.png\"\u003e\n\n\u003cbr\u003e\u003cbr\u003e\n\n## More\n\nIf you want to change the visible child view controller, use ``moveTo(index: Int)``\n\n```swift\n//PolioPagerViewController\n\nmoveTo(index: 1)\nmoveTo(index: nextIndex)\n...\n```\n\nYou can set initial index.\n\n```swift\nclass ViewController: PolioPagerViewController {\n\n    override func viewDidLoad() {\n        self.initialIndex = 1\n        ...\n    }\n}\n```\n\n\n## Todo\n- [ ] highlightedColorがうまく機能しない\n- [x] Carthageの準備\n- [ ] selectedBarのwidthを割合指定可能に\n- [x] 日本語版READMEの作成\n\n\n## Contribute\n\nWe would love you for the contribution to **PolioPager**, check the ``LICENSE`` file for more info.\n\n\n\n## Others\n\nYuiga Wada -  [WebSite](https://yuigawada.github.io/)\nTwitter         - [@YuigaWada](https://twitter.com/YuigaWada)\n\n\n\n\n\nDistributed under the MIT license. See ``LICENSE`` for more information.\n\n[https://github.com/YuigaWada/PolioPager](https://github.com/YuigaWada/PolioPager)\n\n\n\n\n[swift-image]:https://img.shields.io/badge/swift-5.0-orange.svg\n[swift-url]: https://swift.org/\n[license-image]: https://img.shields.io/badge/License-MIT-blue.svg\n[license-url]: LICENSE\n[codebeat-image]: https://codebeat.co/badges/c19b47ea-2f9d-45df-8458-b2d952fe9dad\n[codebeat-url]: https://codebeat.co/projects/github-com-vsouza-awesomeios-com\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FYuigaWada%2FPolioPager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FYuigaWada%2FPolioPager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FYuigaWada%2FPolioPager/lists"}