├── .swift-version ├── .travis.yml ├── LICENSE ├── README.md ├── SSCustomTabMenu.podspec ├── SSCustomTabMenu.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcuserdata │ │ ├── Satish.Rajpurohit.xcuserdatad │ │ └── UserInterfaceState.xcuserstate │ │ └── gulshan.bhatia.xcuserdatad │ │ └── UserInterfaceState.xcuserstate └── xcuserdata │ ├── Satish.Rajpurohit.xcuserdatad │ ├── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ │ ├── CutomTapWithBottomMenu.xcscheme │ │ └── xcschememanagement.plist │ └── gulshan.bhatia.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ └── xcschememanagement.plist ├── SSCustomTabMenu ├── AppDelegate.swift ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ └── Contents.json │ ├── Contents.json │ ├── CustomTab │ │ ├── Artists.imageset │ │ │ ├── Artists.png │ │ │ ├── Artists@2x.png │ │ │ ├── Artists@3x.png │ │ │ └── Contents.json │ │ ├── Contents.json │ │ ├── Events.imageset │ │ │ ├── Contents.json │ │ │ ├── events.png │ │ │ ├── events@2x.png │ │ │ └── events@3x.png │ │ ├── Fan Finder.imageset │ │ │ ├── Contents.json │ │ │ ├── FF.png │ │ │ ├── FF@2x.png │ │ │ └── FF@3x.png │ │ ├── Home.imageset │ │ │ ├── Contents.json │ │ │ ├── Home.png │ │ │ ├── Home@2x.png │ │ │ └── Home@3x.png │ │ ├── Krews.imageset │ │ │ ├── Contents.json │ │ │ ├── Krews.png │ │ │ ├── Krews@2x.png │ │ │ └── Krews@3x.png │ │ ├── Profile.imageset │ │ │ ├── Contents.json │ │ │ ├── Profile.png │ │ │ ├── Profile@2x.png │ │ │ └── Profile@3x.png │ │ ├── add.imageset │ │ │ ├── Contents.json │ │ │ ├── add.png │ │ │ ├── add@2x.png │ │ │ └── add@3x.png │ │ ├── hamburger.imageset │ │ │ ├── Contents.json │ │ │ ├── hamburger.png │ │ │ ├── hamburger@2x.png │ │ │ └── hamburger@3x.png │ │ └── music.imageset │ │ │ ├── Contents.json │ │ │ ├── music.png │ │ │ ├── music@2x.png │ │ │ └── music@3x.png │ └── Extra │ │ ├── Bitmap.imageset │ │ ├── Bitmap.png │ │ └── Contents.json │ │ ├── Contents.json │ │ ├── combined.imageset │ │ ├── Contents.json │ │ ├── combinedShape.png │ │ ├── combinedShape@2x.png │ │ └── combinedShape@3x.png │ │ ├── favorites.imageset │ │ ├── Contents.json │ │ ├── favorites.png │ │ ├── favorites@2x.png │ │ └── favorites@3x.png │ │ ├── feed.imageset │ │ ├── Contents.json │ │ ├── feed.png │ │ ├── feed@2x.png │ │ └── feed@3x.png │ │ ├── group2-1.imageset │ │ ├── Contents.json │ │ ├── group.png │ │ ├── group@2x.png │ │ └── group@3x.png │ │ ├── group2.imageset │ │ ├── Contents.json │ │ ├── group2.png │ │ ├── group2@2x.png │ │ └── group2@3x.png │ │ └── homeFeed.imageset │ │ ├── Contents.json │ │ ├── fill1.png │ │ ├── fill1@2x.png │ │ └── fill1@3x.png ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── CustomTabMenu │ ├── Helper │ │ ├── Constants.swift │ │ ├── GradientView.swift │ │ ├── HamburgerView.swift │ │ ├── MenuItemCollectionFlowLayout.swift │ │ ├── MenuItemsCell.swift │ │ ├── TabMenuVC.swift │ │ ├── Transform.swift │ │ ├── UIStoryBoardHelper.swift │ │ └── UIView.swift │ └── SSTabStoryBoard │ │ └── TabMenu.storyboard ├── Info.plist ├── KrewesVC.swift ├── MusicVC.swift └── PlusVC.swift └── customTab.gif /.swift-version: -------------------------------------------------------------------------------- 1 | 3.1 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: ruby 2 | rvm: 3 | - 2.2 4 | before_script: 5 | - gem install awesome_bot 6 | script: 7 | - awesome_bot README.md --white-list igor.io,symfony,toranproxy.com,vagrantup.com,3v4l.org,voicesoftheelephpant.com 8 | notifications: 9 | email: false 10 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Simform Solutions 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SSCustomTabMenu 2 | > Simple customizable iOS bottom menu works like Tabbar, in Swift. 3 | 4 | [![Swift Version][swift-image]][swift-url] 5 | [![Build Status][travis-image]][travis-url] 6 | [![License][license-image]][license-url] 7 | [![CocoaPods Compatible][cocoa-image]][cocoa-url] 8 | [![Platform][platform-image]][platform-url] 9 | [![PRs Welcome][PR-image]][PR-url] 10 | 11 | ![Alt text](https://raw.githubusercontent.com/simformsolutions/SSCustomTabMenu/master/customTab.gif?raw=true) 12 | ## Features 13 | 14 | - [x] Simple and customizable iOS Tab Menu items, in Swift. 15 | 16 | ## Requirements 17 | 18 | - iOS 9.0+ 19 | - Xcode 9.0 20 | 21 | ## Installation 22 | 23 | #### CocoaPods 24 | You can use [CocoaPods](https://cocoapods.org/) to install `SSCustomTabMenu` by adding it to your `Podfile`: 25 | 26 | ```ruby 27 | platform :ios, '9.0' 28 | use_frameworks! 29 | pod 'SSCustomTabMenu' 30 | ``` 31 | 32 | To get the full benefits import `YourLibrary` wherever you import UIKit 33 | 34 | ``` swift 35 | import UIKit 36 | import SSCustomTabMenu 37 | ``` 38 | 39 | #### Manually 40 | 1. Download and drop ```CustomTabMenu``` in your project. 41 | 2. Congratulations! 42 | 43 | ## Usage example 44 | ### Into your Appdelegate 45 | ``` swift 46 | import SSCustomTabMenu 47 | ``` 48 | ### and add below two lines 49 | ``` swift 50 | let MyDelegate = UIApplication.shared.delegate as! AppDelegate 51 | var navController:UINavigationController! 52 | ``` 53 | #### Add below code into didFinishLaunchingWithOptions 54 | 55 | #### Initiate your controller 56 | ``` swift 57 | let homeVC = storyBoard.MainStoryboard?.instantiateViewController(withIdentifier: "HomeVC") 58 | let musicVC = storyBoard.MainStoryboard?.instantiateViewController(withIdentifier: "MusicVC") 59 | let profileVC = storyBoard.MainStoryboard?.instantiateViewController(withIdentifier: "ProfileVC") 60 | let eventsVC = storyBoard.MainStoryboard?.instantiateViewController(withIdentifier: "EventsVC") 61 | let artistsVC = storyBoard.MainStoryboard?.instantiateViewController(withIdentifier: "ArtistsVC") 62 | let fanFinderVC = storyBoard.MainStoryboard?.instantiateViewController(withIdentifier: "FanFinderVC") 63 | ``` 64 | #### Initiate TabMenuVC 65 | ``` swift 66 | let tabController = UIStoryboard.TabMenuStoryboard.instantiateViewController(withIdentifier: "TabMenuVC") as! TabMenuVC 67 | ``` 68 | #### Set Menu Items with Title and image name 69 | ``` swift 70 | tabController.arrMenuItems[1] = MenuItem(viewControllerforMenu:Krewes, imageName: "Home", menuItemTitle: "HOME") 71 | tabController.arrMenuItems[2] = MenuItem(viewControllerforMenu:Krewes, imageName: "Krews", menuItemTitle: "KREWS") 72 | tabController.arrMenuItems[3] = MenuItem(viewControllerforMenu:Krewes, imageName: "Profile", menuItemTitle: "PROFILE") 73 | tabController.arrMenuItems[4] = MenuItem(viewControllerforMenu:Krewes, imageName: "Events", menuItemTitle: "EVENTS") 74 | tabController.arrMenuItems[5] = MenuItem(viewControllerforMenu:Krewes, imageName: "Artists", menuItemTitle: "ARTISTS") 75 | tabController.arrMenuItems[6] = MenuItem(viewControllerforMenu:Krewes, imageName: "Fan Finder", menuItemTitle: "FAN FINDER") 76 | ``` 77 | #### Add Center and Right TabBarItem 78 | ``` swift 79 | tabController.centerTab = plusVC 80 | tabController.RightTab = musicVC 81 | ``` 82 | #### Add tabController as rootViewController 83 | ``` swift 84 | self.window!.rootViewController = tabController 85 | ``` 86 | 87 | ## Contribute 88 | 89 | We would love you for the contribution to SSCustomTabMenu, check the LICENSE file for more info. 90 | 91 | ## Meta 92 | 93 | Distributed under the MIT license. See ``LICENSE`` for more information. 94 | 95 | [https://github.com/simformsolutions/SSCustomTabMenu](https://github.com/simformsolutions) 96 | 97 | [swift-image]:https://img.shields.io/badge/swift-3.0-orange.svg 98 | [swift-url]: https://swift.org/ 99 | [license-image]: https://img.shields.io/badge/License-MIT-blue.svg 100 | [license-url]: LICENSE 101 | [travis-image]: https://img.shields.io/travis/dbader/node-datadog-metrics/master.svg?style=flat-square 102 | [travis-url]: https://travis-ci.org/dbader/node-datadog-metrics 103 | [codebeat-image]: https://codebeat.co/assets/svg/badges/C-ffb83f-7198e9a1b7ad7f73977b0c9a5c7c3fffbfa25f262510e5681fd8f5a3188216b0.svg 104 | [codebeat-url]: https://codebeat.co/projects/github-com-vsouza-awesomeios-com 105 | [platform-image]:https://img.shields.io/cocoapods/p/LFAlertController.svg?style=flat 106 | [platform-url]:http://cocoapods.org/pods/LFAlertController 107 | [cocoa-image]:https://img.shields.io/cocoapods/v/EZSwiftExtensions.svg 108 | [cocoa-url]:https://img.shields.io/cocoapods/v/LFAlertController.svg 109 | [PR-image]:https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square 110 | [PR-url]:http://makeapullrequest.com 111 | -------------------------------------------------------------------------------- /SSCustomTabMenu.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = 'SSCustomTabMenu' 3 | s.version = '0.1.7' 4 | s.summary = 'Custom tab menu controller for iOS.' 5 | 6 | s.description = 'This CustomTabMenu will add custom menu at bottom!' 7 | 8 | s.homepage = 'https://github.com/simformsolutions/SSCustomTabMenu' 9 | s.license = { :type => 'MIT', :file => 'LICENSE' } 10 | s.author = { 'simformsolutions' => 'reg@simform.in' } 11 | s.source = { :git => 'https://github.com/simformsolutions/SSCustomTabMenu.git', :tag => s.version.to_s } 12 | 13 | s.ios.deployment_target = '9.0' 14 | 15 | s.subspec 'CustomTabMenu' do |ss| 16 | 17 | ss.subspec 'Helper' do |h| 18 | h.source_files = 'SSCustomTabMenu/CustomTabMenu/Helper/*.swift' 19 | end 20 | 21 | ss.subspec 'SSTabStoryBoard' do |story| 22 | story.resource_bundles = { 23 | 'SSCustomTabMenu' => ['SSCustomTabMenu/CustomTabMenu/SSTabStoryBoard/*.storyboard'] 24 | } 25 | end 26 | 27 | ss.subspec 'image' do |img| 28 | img.source_files = 'SSCustomTabMenu/CustomTabMenu/image/*.png' 29 | end 30 | 31 | end 32 | end -------------------------------------------------------------------------------- /SSCustomTabMenu.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | B200BF461FB43A8000E9352C /* UIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B200BF451FB43A8000E9352C /* UIView.swift */; }; 11 | B208CA361FFE122700B269A3 /* TabMenu.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B24D9C041F3D90EC00A1D1B7 /* TabMenu.storyboard */; }; 12 | B24D9BF21F3D90BC00A1D1B7 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B24D9BF11F3D90BC00A1D1B7 /* AppDelegate.swift */; }; 13 | B24D9BF41F3D90BC00A1D1B7 /* PlusVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = B24D9BF31F3D90BC00A1D1B7 /* PlusVC.swift */; }; 14 | B24D9BF71F3D90BC00A1D1B7 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B24D9BF51F3D90BC00A1D1B7 /* Main.storyboard */; }; 15 | B24D9BF91F3D90BC00A1D1B7 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B24D9BF81F3D90BC00A1D1B7 /* Assets.xcassets */; }; 16 | B24D9BFC1F3D90BC00A1D1B7 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B24D9BFA1F3D90BC00A1D1B7 /* LaunchScreen.storyboard */; }; 17 | B24D9C071F3D910100A1D1B7 /* TabMenuVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = B24D9C061F3D910100A1D1B7 /* TabMenuVC.swift */; }; 18 | B24D9C171F3D9C9700A1D1B7 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = B24D9C161F3D9C9700A1D1B7 /* Constants.swift */; }; 19 | B24D9C191F3DB3E300A1D1B7 /* MusicVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = B24D9C181F3DB3E300A1D1B7 /* MusicVC.swift */; }; 20 | B24D9C1B1F3DDBDE00A1D1B7 /* Transform.swift in Sources */ = {isa = PBXBuildFile; fileRef = B24D9C1A1F3DDBDE00A1D1B7 /* Transform.swift */; }; 21 | B24D9C1D1F3DE63400A1D1B7 /* KrewesVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = B24D9C1C1F3DE63400A1D1B7 /* KrewesVC.swift */; }; 22 | B2523FDE1FF4F47D00D564C4 /* HamburgerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2523FDD1FF4F47D00D564C4 /* HamburgerView.swift */; }; 23 | B25970741FB2F30400CEF360 /* GradientView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B25970731FB2F30400CEF360 /* GradientView.swift */; }; 24 | B28EDDE11FB6D5B7008D46F2 /* MenuItemsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B28EDDE01FB6D5B7008D46F2 /* MenuItemsCell.swift */; }; 25 | B28EDDE31FB6D86E008D46F2 /* MenuItemCollectionFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = B28EDDE21FB6D86E008D46F2 /* MenuItemCollectionFlowLayout.swift */; }; 26 | B8E0D3F720133C2000E9DC44 /* UIStoryBoardHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8E0D3F620133C2000E9DC44 /* UIStoryBoardHelper.swift */; }; 27 | /* End PBXBuildFile section */ 28 | 29 | /* Begin PBXFileReference section */ 30 | B200BF451FB43A8000E9352C /* UIView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIView.swift; sourceTree = ""; }; 31 | B24D9BEE1F3D90BC00A1D1B7 /* SSCustomTabMenu.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SSCustomTabMenu.app; sourceTree = BUILT_PRODUCTS_DIR; }; 32 | B24D9BF11F3D90BC00A1D1B7 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 33 | B24D9BF31F3D90BC00A1D1B7 /* PlusVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlusVC.swift; sourceTree = ""; }; 34 | B24D9BF61F3D90BC00A1D1B7 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 35 | B24D9BF81F3D90BC00A1D1B7 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 36 | B24D9BFB1F3D90BC00A1D1B7 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 37 | B24D9BFD1F3D90BC00A1D1B7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 38 | B24D9C041F3D90EC00A1D1B7 /* TabMenu.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = TabMenu.storyboard; sourceTree = ""; }; 39 | B24D9C061F3D910100A1D1B7 /* TabMenuVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TabMenuVC.swift; sourceTree = ""; }; 40 | B24D9C161F3D9C9700A1D1B7 /* Constants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; 41 | B24D9C181F3DB3E300A1D1B7 /* MusicVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MusicVC.swift; sourceTree = ""; }; 42 | B24D9C1A1F3DDBDE00A1D1B7 /* Transform.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Transform.swift; sourceTree = ""; }; 43 | B24D9C1C1F3DE63400A1D1B7 /* KrewesVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KrewesVC.swift; sourceTree = ""; }; 44 | B2523FDD1FF4F47D00D564C4 /* HamburgerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HamburgerView.swift; sourceTree = ""; }; 45 | B25970731FB2F30400CEF360 /* GradientView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GradientView.swift; sourceTree = ""; }; 46 | B28EDDE01FB6D5B7008D46F2 /* MenuItemsCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuItemsCell.swift; sourceTree = ""; }; 47 | B28EDDE21FB6D86E008D46F2 /* MenuItemCollectionFlowLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuItemCollectionFlowLayout.swift; sourceTree = ""; }; 48 | B8E0D3F620133C2000E9DC44 /* UIStoryBoardHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIStoryBoardHelper.swift; sourceTree = ""; }; 49 | /* End PBXFileReference section */ 50 | 51 | /* Begin PBXFrameworksBuildPhase section */ 52 | B24D9BEB1F3D90BC00A1D1B7 /* Frameworks */ = { 53 | isa = PBXFrameworksBuildPhase; 54 | buildActionMask = 2147483647; 55 | files = ( 56 | ); 57 | runOnlyForDeploymentPostprocessing = 0; 58 | }; 59 | /* End PBXFrameworksBuildPhase section */ 60 | 61 | /* Begin PBXGroup section */ 62 | B208CA371FFE14D000B269A3 /* SSTabStoryBoard */ = { 63 | isa = PBXGroup; 64 | children = ( 65 | B24D9C041F3D90EC00A1D1B7 /* TabMenu.storyboard */, 66 | ); 67 | path = SSTabStoryBoard; 68 | sourceTree = ""; 69 | }; 70 | B24D9BE51F3D90BC00A1D1B7 = { 71 | isa = PBXGroup; 72 | children = ( 73 | B24D9BF01F3D90BC00A1D1B7 /* SSCustomTabMenu */, 74 | B24D9BEF1F3D90BC00A1D1B7 /* Products */, 75 | ); 76 | sourceTree = ""; 77 | }; 78 | B24D9BEF1F3D90BC00A1D1B7 /* Products */ = { 79 | isa = PBXGroup; 80 | children = ( 81 | B24D9BEE1F3D90BC00A1D1B7 /* SSCustomTabMenu.app */, 82 | ); 83 | name = Products; 84 | sourceTree = ""; 85 | }; 86 | B24D9BF01F3D90BC00A1D1B7 /* SSCustomTabMenu */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | B256EAE71FFE01EA00BE59B3 /* CustomTabMenu */, 90 | B24D9BF11F3D90BC00A1D1B7 /* AppDelegate.swift */, 91 | B24D9BF31F3D90BC00A1D1B7 /* PlusVC.swift */, 92 | B24D9C181F3DB3E300A1D1B7 /* MusicVC.swift */, 93 | B24D9C1C1F3DE63400A1D1B7 /* KrewesVC.swift */, 94 | B24D9BF51F3D90BC00A1D1B7 /* Main.storyboard */, 95 | B24D9BF81F3D90BC00A1D1B7 /* Assets.xcassets */, 96 | B24D9BFA1F3D90BC00A1D1B7 /* LaunchScreen.storyboard */, 97 | B24D9BFD1F3D90BC00A1D1B7 /* Info.plist */, 98 | ); 99 | path = SSCustomTabMenu; 100 | sourceTree = ""; 101 | }; 102 | B256EAE71FFE01EA00BE59B3 /* CustomTabMenu */ = { 103 | isa = PBXGroup; 104 | children = ( 105 | B208CA371FFE14D000B269A3 /* SSTabStoryBoard */, 106 | B256EAE81FFE022200BE59B3 /* Helper */, 107 | ); 108 | path = CustomTabMenu; 109 | sourceTree = ""; 110 | }; 111 | B256EAE81FFE022200BE59B3 /* Helper */ = { 112 | isa = PBXGroup; 113 | children = ( 114 | B24D9C061F3D910100A1D1B7 /* TabMenuVC.swift */, 115 | B28EDDE01FB6D5B7008D46F2 /* MenuItemsCell.swift */, 116 | B2523FDD1FF4F47D00D564C4 /* HamburgerView.swift */, 117 | B24D9C1A1F3DDBDE00A1D1B7 /* Transform.swift */, 118 | B24D9C161F3D9C9700A1D1B7 /* Constants.swift */, 119 | B8E0D3F620133C2000E9DC44 /* UIStoryBoardHelper.swift */, 120 | B25970731FB2F30400CEF360 /* GradientView.swift */, 121 | B200BF451FB43A8000E9352C /* UIView.swift */, 122 | B28EDDE21FB6D86E008D46F2 /* MenuItemCollectionFlowLayout.swift */, 123 | ); 124 | path = Helper; 125 | sourceTree = ""; 126 | }; 127 | /* End PBXGroup section */ 128 | 129 | /* Begin PBXNativeTarget section */ 130 | B24D9BED1F3D90BC00A1D1B7 /* SSCustomTabMenu */ = { 131 | isa = PBXNativeTarget; 132 | buildConfigurationList = B24D9C001F3D90BC00A1D1B7 /* Build configuration list for PBXNativeTarget "SSCustomTabMenu" */; 133 | buildPhases = ( 134 | B24D9BEA1F3D90BC00A1D1B7 /* Sources */, 135 | B24D9BEB1F3D90BC00A1D1B7 /* Frameworks */, 136 | B24D9BEC1F3D90BC00A1D1B7 /* Resources */, 137 | ); 138 | buildRules = ( 139 | ); 140 | dependencies = ( 141 | ); 142 | name = SSCustomTabMenu; 143 | productName = CutomTapWithBottomMenu; 144 | productReference = B24D9BEE1F3D90BC00A1D1B7 /* SSCustomTabMenu.app */; 145 | productType = "com.apple.product-type.application"; 146 | }; 147 | /* End PBXNativeTarget section */ 148 | 149 | /* Begin PBXProject section */ 150 | B24D9BE61F3D90BC00A1D1B7 /* Project object */ = { 151 | isa = PBXProject; 152 | attributes = { 153 | LastSwiftUpdateCheck = 0830; 154 | LastUpgradeCheck = 0830; 155 | ORGANIZATIONNAME = "Satish Rajpurohit"; 156 | TargetAttributes = { 157 | B24D9BED1F3D90BC00A1D1B7 = { 158 | CreatedOnToolsVersion = 8.3.2; 159 | DevelopmentTeam = Y98X8JAPH6; 160 | ProvisioningStyle = Automatic; 161 | }; 162 | }; 163 | }; 164 | buildConfigurationList = B24D9BE91F3D90BC00A1D1B7 /* Build configuration list for PBXProject "SSCustomTabMenu" */; 165 | compatibilityVersion = "Xcode 3.2"; 166 | developmentRegion = English; 167 | hasScannedForEncodings = 0; 168 | knownRegions = ( 169 | en, 170 | Base, 171 | ); 172 | mainGroup = B24D9BE51F3D90BC00A1D1B7; 173 | productRefGroup = B24D9BEF1F3D90BC00A1D1B7 /* Products */; 174 | projectDirPath = ""; 175 | projectRoot = ""; 176 | targets = ( 177 | B24D9BED1F3D90BC00A1D1B7 /* SSCustomTabMenu */, 178 | ); 179 | }; 180 | /* End PBXProject section */ 181 | 182 | /* Begin PBXResourcesBuildPhase section */ 183 | B24D9BEC1F3D90BC00A1D1B7 /* Resources */ = { 184 | isa = PBXResourcesBuildPhase; 185 | buildActionMask = 2147483647; 186 | files = ( 187 | B24D9BFC1F3D90BC00A1D1B7 /* LaunchScreen.storyboard in Resources */, 188 | B208CA361FFE122700B269A3 /* TabMenu.storyboard in Resources */, 189 | B24D9BF91F3D90BC00A1D1B7 /* Assets.xcassets in Resources */, 190 | B24D9BF71F3D90BC00A1D1B7 /* Main.storyboard in Resources */, 191 | ); 192 | runOnlyForDeploymentPostprocessing = 0; 193 | }; 194 | /* End PBXResourcesBuildPhase section */ 195 | 196 | /* Begin PBXSourcesBuildPhase section */ 197 | B24D9BEA1F3D90BC00A1D1B7 /* Sources */ = { 198 | isa = PBXSourcesBuildPhase; 199 | buildActionMask = 2147483647; 200 | files = ( 201 | B8E0D3F720133C2000E9DC44 /* UIStoryBoardHelper.swift in Sources */, 202 | B24D9C171F3D9C9700A1D1B7 /* Constants.swift in Sources */, 203 | B24D9BF41F3D90BC00A1D1B7 /* PlusVC.swift in Sources */, 204 | B24D9C191F3DB3E300A1D1B7 /* MusicVC.swift in Sources */, 205 | B28EDDE31FB6D86E008D46F2 /* MenuItemCollectionFlowLayout.swift in Sources */, 206 | B24D9C1D1F3DE63400A1D1B7 /* KrewesVC.swift in Sources */, 207 | B200BF461FB43A8000E9352C /* UIView.swift in Sources */, 208 | B2523FDE1FF4F47D00D564C4 /* HamburgerView.swift in Sources */, 209 | B24D9C1B1F3DDBDE00A1D1B7 /* Transform.swift in Sources */, 210 | B24D9C071F3D910100A1D1B7 /* TabMenuVC.swift in Sources */, 211 | B28EDDE11FB6D5B7008D46F2 /* MenuItemsCell.swift in Sources */, 212 | B25970741FB2F30400CEF360 /* GradientView.swift in Sources */, 213 | B24D9BF21F3D90BC00A1D1B7 /* AppDelegate.swift in Sources */, 214 | ); 215 | runOnlyForDeploymentPostprocessing = 0; 216 | }; 217 | /* End PBXSourcesBuildPhase section */ 218 | 219 | /* Begin PBXVariantGroup section */ 220 | B24D9BF51F3D90BC00A1D1B7 /* Main.storyboard */ = { 221 | isa = PBXVariantGroup; 222 | children = ( 223 | B24D9BF61F3D90BC00A1D1B7 /* Base */, 224 | ); 225 | name = Main.storyboard; 226 | sourceTree = ""; 227 | }; 228 | B24D9BFA1F3D90BC00A1D1B7 /* LaunchScreen.storyboard */ = { 229 | isa = PBXVariantGroup; 230 | children = ( 231 | B24D9BFB1F3D90BC00A1D1B7 /* Base */, 232 | ); 233 | name = LaunchScreen.storyboard; 234 | sourceTree = ""; 235 | }; 236 | /* End PBXVariantGroup section */ 237 | 238 | /* Begin XCBuildConfiguration section */ 239 | B24D9BFE1F3D90BC00A1D1B7 /* Debug */ = { 240 | isa = XCBuildConfiguration; 241 | buildSettings = { 242 | ALWAYS_SEARCH_USER_PATHS = NO; 243 | CLANG_ANALYZER_NONNULL = YES; 244 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 245 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 246 | CLANG_CXX_LIBRARY = "libc++"; 247 | CLANG_ENABLE_MODULES = YES; 248 | CLANG_ENABLE_OBJC_ARC = YES; 249 | CLANG_WARN_BOOL_CONVERSION = YES; 250 | CLANG_WARN_CONSTANT_CONVERSION = YES; 251 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 252 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 253 | CLANG_WARN_EMPTY_BODY = YES; 254 | CLANG_WARN_ENUM_CONVERSION = YES; 255 | CLANG_WARN_INFINITE_RECURSION = YES; 256 | CLANG_WARN_INT_CONVERSION = YES; 257 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 258 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 259 | CLANG_WARN_UNREACHABLE_CODE = YES; 260 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 261 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 262 | COPY_PHASE_STRIP = NO; 263 | DEBUG_INFORMATION_FORMAT = dwarf; 264 | ENABLE_STRICT_OBJC_MSGSEND = YES; 265 | ENABLE_TESTABILITY = YES; 266 | GCC_C_LANGUAGE_STANDARD = gnu99; 267 | GCC_DYNAMIC_NO_PIC = NO; 268 | GCC_NO_COMMON_BLOCKS = YES; 269 | GCC_OPTIMIZATION_LEVEL = 0; 270 | GCC_PREPROCESSOR_DEFINITIONS = ( 271 | "DEBUG=1", 272 | "$(inherited)", 273 | ); 274 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 275 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 276 | GCC_WARN_UNDECLARED_SELECTOR = YES; 277 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 278 | GCC_WARN_UNUSED_FUNCTION = YES; 279 | GCC_WARN_UNUSED_VARIABLE = YES; 280 | IPHONEOS_DEPLOYMENT_TARGET = 10.3; 281 | MTL_ENABLE_DEBUG_INFO = YES; 282 | ONLY_ACTIVE_ARCH = YES; 283 | SDKROOT = iphoneos; 284 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 285 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 286 | }; 287 | name = Debug; 288 | }; 289 | B24D9BFF1F3D90BC00A1D1B7 /* Release */ = { 290 | isa = XCBuildConfiguration; 291 | buildSettings = { 292 | ALWAYS_SEARCH_USER_PATHS = NO; 293 | CLANG_ANALYZER_NONNULL = YES; 294 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 295 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 296 | CLANG_CXX_LIBRARY = "libc++"; 297 | CLANG_ENABLE_MODULES = YES; 298 | CLANG_ENABLE_OBJC_ARC = YES; 299 | CLANG_WARN_BOOL_CONVERSION = YES; 300 | CLANG_WARN_CONSTANT_CONVERSION = YES; 301 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 302 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 303 | CLANG_WARN_EMPTY_BODY = YES; 304 | CLANG_WARN_ENUM_CONVERSION = YES; 305 | CLANG_WARN_INFINITE_RECURSION = YES; 306 | CLANG_WARN_INT_CONVERSION = YES; 307 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 308 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 309 | CLANG_WARN_UNREACHABLE_CODE = YES; 310 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 311 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 312 | COPY_PHASE_STRIP = NO; 313 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 314 | ENABLE_NS_ASSERTIONS = NO; 315 | ENABLE_STRICT_OBJC_MSGSEND = YES; 316 | GCC_C_LANGUAGE_STANDARD = gnu99; 317 | GCC_NO_COMMON_BLOCKS = YES; 318 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 319 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 320 | GCC_WARN_UNDECLARED_SELECTOR = YES; 321 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 322 | GCC_WARN_UNUSED_FUNCTION = YES; 323 | GCC_WARN_UNUSED_VARIABLE = YES; 324 | IPHONEOS_DEPLOYMENT_TARGET = 10.3; 325 | MTL_ENABLE_DEBUG_INFO = NO; 326 | SDKROOT = iphoneos; 327 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 328 | VALIDATE_PRODUCT = YES; 329 | }; 330 | name = Release; 331 | }; 332 | B24D9C011F3D90BC00A1D1B7 /* Debug */ = { 333 | isa = XCBuildConfiguration; 334 | buildSettings = { 335 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 336 | DEVELOPMENT_TEAM = Y98X8JAPH6; 337 | INFOPLIST_FILE = SSCustomTabMenu/Info.plist; 338 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 339 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 340 | PRODUCT_BUNDLE_IDENTIFIER = com.simform.SSCustomTabMenu; 341 | PRODUCT_NAME = "$(TARGET_NAME)"; 342 | SWIFT_VERSION = 3.0; 343 | }; 344 | name = Debug; 345 | }; 346 | B24D9C021F3D90BC00A1D1B7 /* Release */ = { 347 | isa = XCBuildConfiguration; 348 | buildSettings = { 349 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 350 | DEVELOPMENT_TEAM = Y98X8JAPH6; 351 | INFOPLIST_FILE = SSCustomTabMenu/Info.plist; 352 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 353 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 354 | PRODUCT_BUNDLE_IDENTIFIER = com.simform.SSCustomTabMenu; 355 | PRODUCT_NAME = "$(TARGET_NAME)"; 356 | SWIFT_VERSION = 3.0; 357 | }; 358 | name = Release; 359 | }; 360 | /* End XCBuildConfiguration section */ 361 | 362 | /* Begin XCConfigurationList section */ 363 | B24D9BE91F3D90BC00A1D1B7 /* Build configuration list for PBXProject "SSCustomTabMenu" */ = { 364 | isa = XCConfigurationList; 365 | buildConfigurations = ( 366 | B24D9BFE1F3D90BC00A1D1B7 /* Debug */, 367 | B24D9BFF1F3D90BC00A1D1B7 /* Release */, 368 | ); 369 | defaultConfigurationIsVisible = 0; 370 | defaultConfigurationName = Release; 371 | }; 372 | B24D9C001F3D90BC00A1D1B7 /* Build configuration list for PBXNativeTarget "SSCustomTabMenu" */ = { 373 | isa = XCConfigurationList; 374 | buildConfigurations = ( 375 | B24D9C011F3D90BC00A1D1B7 /* Debug */, 376 | B24D9C021F3D90BC00A1D1B7 /* Release */, 377 | ); 378 | defaultConfigurationIsVisible = 0; 379 | defaultConfigurationName = Release; 380 | }; 381 | /* End XCConfigurationList section */ 382 | }; 383 | rootObject = B24D9BE61F3D90BC00A1D1B7 /* Project object */; 384 | } 385 | -------------------------------------------------------------------------------- /SSCustomTabMenu.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /SSCustomTabMenu.xcodeproj/project.xcworkspace/xcuserdata/Satish.Rajpurohit.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu.xcodeproj/project.xcworkspace/xcuserdata/Satish.Rajpurohit.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /SSCustomTabMenu.xcodeproj/project.xcworkspace/xcuserdata/gulshan.bhatia.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu.xcodeproj/project.xcworkspace/xcuserdata/gulshan.bhatia.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /SSCustomTabMenu.xcodeproj/xcuserdata/Satish.Rajpurohit.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /SSCustomTabMenu.xcodeproj/xcuserdata/Satish.Rajpurohit.xcuserdatad/xcschemes/CutomTapWithBottomMenu.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 31 | 32 | 33 | 34 | 40 | 41 | 42 | 43 | 44 | 45 | 56 | 58 | 64 | 65 | 66 | 67 | 68 | 69 | 75 | 77 | 83 | 84 | 85 | 86 | 88 | 89 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /SSCustomTabMenu.xcodeproj/xcuserdata/Satish.Rajpurohit.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | CutomTapWithBottomMenu.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | B24D9BED1F3D90BC00A1D1B7 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /SSCustomTabMenu.xcodeproj/xcuserdata/gulshan.bhatia.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /SSCustomTabMenu.xcodeproj/xcuserdata/gulshan.bhatia.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | CutomTapWithBottomMenu.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /SSCustomTabMenu/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // SSCustomTabMenu 4 | // 5 | // Created by Simform Solutions on 11/08/17. 6 | // Copyright © 2017 Simform Solutions. All rights reserved. 7 | // 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in 17 | // all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 | // THE SOFTWARE. 26 | // 27 | // 28 | 29 | import UIKit 30 | 31 | let MyDelegate = UIApplication.shared.delegate as! AppDelegate 32 | var navController:UINavigationController! 33 | 34 | @UIApplicationMain 35 | class AppDelegate: UIResponder, UIApplicationDelegate { 36 | 37 | var window: UIWindow? 38 | 39 | 40 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 41 | // Override point for customization after application launch. 42 | UIApplication.shared.isStatusBarHidden = true 43 | self.setUpTabBar() 44 | 45 | return true 46 | } 47 | 48 | func setUpTabBar(){ 49 | 50 | //Tab Controllers 51 | 52 | let plusVC = UIStoryboard.MainStoryboard.instantiateViewController(withIdentifier: "PlusVC") 53 | let musicVC = UIStoryboard.MainStoryboard.instantiateViewController(withIdentifier: "MusicVC") 54 | let Krewes = UIStoryboard.MainStoryboard.instantiateViewController(withIdentifier: "PlusVC") 55 | 56 | let tabController = UIStoryboard.TabMenuStoryboard.instantiateViewController(withIdentifier: "TabMenuVC") as! TabMenuVC 57 | tabController.arrMenuItems[1] = MenuItem(viewControllerforMenu:Krewes, imageName: "Home", menuItemTitle: "HOME") 58 | tabController.arrMenuItems[2] = MenuItem(viewControllerforMenu:Krewes, imageName: "Krews", menuItemTitle: "KREWS") 59 | tabController.arrMenuItems[3] = MenuItem(viewControllerforMenu:Krewes, imageName: "Profile", menuItemTitle: "PROFILE") 60 | tabController.arrMenuItems[4] = MenuItem(viewControllerforMenu:Krewes, imageName: "Events", menuItemTitle: "EVENTS") 61 | tabController.arrMenuItems[5] = MenuItem(viewControllerforMenu:Krewes, imageName: "Artists", menuItemTitle: "ARTISTS") 62 | tabController.arrMenuItems[6] = MenuItem(viewControllerforMenu:Krewes, imageName: "Fan Finder", menuItemTitle: "FAN FINDER") 63 | 64 | tabController.centerTab = plusVC 65 | tabController.RightTab = musicVC 66 | 67 | self.window!.rootViewController = tabController 68 | } 69 | 70 | func applicationWillResignActive(_ application: UIApplication) { 71 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 72 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 73 | } 74 | 75 | func applicationDidEnterBackground(_ application: UIApplication) { 76 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 77 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 78 | } 79 | 80 | func applicationWillEnterForeground(_ application: UIApplication) { 81 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 82 | } 83 | 84 | func applicationDidBecomeActive(_ application: UIApplication) { 85 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 86 | } 87 | 88 | func applicationWillTerminate(_ application: UIApplication) { 89 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 90 | } 91 | 92 | } 93 | 94 | -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ios-marketing", 45 | "size" : "1024x1024", 46 | "scale" : "1x" 47 | } 48 | ], 49 | "info" : { 50 | "version" : 1, 51 | "author" : "xcode" 52 | } 53 | } -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/Artists.imageset/Artists.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/CustomTab/Artists.imageset/Artists.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/Artists.imageset/Artists@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/CustomTab/Artists.imageset/Artists@2x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/Artists.imageset/Artists@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/CustomTab/Artists.imageset/Artists@3x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/Artists.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Artists.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Artists@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Artists@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/Events.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "events.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "events@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "events@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/Events.imageset/events.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/CustomTab/Events.imageset/events.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/Events.imageset/events@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/CustomTab/Events.imageset/events@2x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/Events.imageset/events@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/CustomTab/Events.imageset/events@3x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/Fan Finder.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "FF.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "FF@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "FF@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/Fan Finder.imageset/FF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/CustomTab/Fan Finder.imageset/FF.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/Fan Finder.imageset/FF@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/CustomTab/Fan Finder.imageset/FF@2x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/Fan Finder.imageset/FF@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/CustomTab/Fan Finder.imageset/FF@3x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/Home.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Home.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Home@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Home@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/Home.imageset/Home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/CustomTab/Home.imageset/Home.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/Home.imageset/Home@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/CustomTab/Home.imageset/Home@2x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/Home.imageset/Home@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/CustomTab/Home.imageset/Home@3x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/Krews.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Krews.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Krews@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Krews@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/Krews.imageset/Krews.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/CustomTab/Krews.imageset/Krews.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/Krews.imageset/Krews@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/CustomTab/Krews.imageset/Krews@2x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/Krews.imageset/Krews@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/CustomTab/Krews.imageset/Krews@3x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/Profile.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Profile.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Profile@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Profile@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/Profile.imageset/Profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/CustomTab/Profile.imageset/Profile.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/Profile.imageset/Profile@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/CustomTab/Profile.imageset/Profile@2x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/Profile.imageset/Profile@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/CustomTab/Profile.imageset/Profile@3x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/add.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "add.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "add@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "add@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/add.imageset/add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/CustomTab/add.imageset/add.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/add.imageset/add@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/CustomTab/add.imageset/add@2x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/add.imageset/add@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/CustomTab/add.imageset/add@3x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/hamburger.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "hamburger.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "hamburger@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "hamburger@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/hamburger.imageset/hamburger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/CustomTab/hamburger.imageset/hamburger.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/hamburger.imageset/hamburger@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/CustomTab/hamburger.imageset/hamburger@2x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/hamburger.imageset/hamburger@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/CustomTab/hamburger.imageset/hamburger@3x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/music.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "music.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "music@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "music@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/music.imageset/music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/CustomTab/music.imageset/music.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/music.imageset/music@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/CustomTab/music.imageset/music@2x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/CustomTab/music.imageset/music@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/CustomTab/music.imageset/music@3x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/Extra/Bitmap.imageset/Bitmap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/Extra/Bitmap.imageset/Bitmap.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/Extra/Bitmap.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Bitmap.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/Extra/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/Extra/combined.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "combinedShape.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "combinedShape@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "combinedShape@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/Extra/combined.imageset/combinedShape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/Extra/combined.imageset/combinedShape.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/Extra/combined.imageset/combinedShape@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/Extra/combined.imageset/combinedShape@2x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/Extra/combined.imageset/combinedShape@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/Extra/combined.imageset/combinedShape@3x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/Extra/favorites.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "favorites.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "favorites@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "favorites@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/Extra/favorites.imageset/favorites.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/Extra/favorites.imageset/favorites.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/Extra/favorites.imageset/favorites@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/Extra/favorites.imageset/favorites@2x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/Extra/favorites.imageset/favorites@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/Extra/favorites.imageset/favorites@3x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/Extra/feed.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "feed.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "feed@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "feed@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/Extra/feed.imageset/feed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/Extra/feed.imageset/feed.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/Extra/feed.imageset/feed@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/Extra/feed.imageset/feed@2x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/Extra/feed.imageset/feed@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/Extra/feed.imageset/feed@3x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/Extra/group2-1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "group.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "group@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "group@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/Extra/group2-1.imageset/group.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/Extra/group2-1.imageset/group.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/Extra/group2-1.imageset/group@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/Extra/group2-1.imageset/group@2x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/Extra/group2-1.imageset/group@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/Extra/group2-1.imageset/group@3x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/Extra/group2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "group2.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "group2@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "group2@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/Extra/group2.imageset/group2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/Extra/group2.imageset/group2.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/Extra/group2.imageset/group2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/Extra/group2.imageset/group2@2x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/Extra/group2.imageset/group2@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/Extra/group2.imageset/group2@3x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/Extra/homeFeed.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "fill1.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "fill1@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "fill1@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/Extra/homeFeed.imageset/fill1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/Extra/homeFeed.imageset/fill1.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/Extra/homeFeed.imageset/fill1@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/Extra/homeFeed.imageset/fill1@2x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Assets.xcassets/Extra/homeFeed.imageset/fill1@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/SSCustomTabMenu/Assets.xcassets/Extra/homeFeed.imageset/fill1@3x.png -------------------------------------------------------------------------------- /SSCustomTabMenu/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /SSCustomTabMenu/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | -------------------------------------------------------------------------------- /SSCustomTabMenu/CustomTabMenu/Helper/Constants.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Constants.swift 3 | // SSCustomTabMenu 4 | // 5 | // Created by Simform Solutions on 11/08/17. 6 | // Copyright © 2017 Simform Solutions. All rights reserved. 7 | // 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in 17 | // all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 | // THE SOFTWARE. 26 | // 27 | // 28 | 29 | import UIKit 30 | 31 | 32 | // Custom Gloabl Objects 33 | public let screenSize: CGRect = UIScreen.main.bounds 34 | -------------------------------------------------------------------------------- /SSCustomTabMenu/CustomTabMenu/Helper/GradientView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // SSCustomTabMenu 4 | // 5 | // Created by Simform Solutions on 11/08/17. 6 | // Copyright © 2017 Simform Solutions. All rights reserved. 7 | // 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in 17 | // all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 | // THE SOFTWARE. 26 | // 27 | // 28 | 29 | import Foundation 30 | import UIKit 31 | 32 | @IBDesignable public class GradientView: UIView { 33 | @IBInspectable var topColor: UIColor = UIColor.white 34 | @IBInspectable var bottomColor: UIColor = UIColor.black 35 | 36 | override public class var layerClass: AnyClass { 37 | return CAGradientLayer.self 38 | } 39 | 40 | override public func layoutSubviews() { 41 | (layer as! CAGradientLayer).colors = [topColor.cgColor, bottomColor.cgColor] 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /SSCustomTabMenu/CustomTabMenu/Helper/HamburgerView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HamburgerView.swift 3 | // SSCustomTabMenu 4 | // 5 | // Created by Simform Solutions on 11/08/17. 6 | // Copyright © 2017 Simform Solutions. All rights reserved. 7 | // 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in 17 | // all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 | // THE SOFTWARE. 26 | // 27 | // 28 | 29 | 30 | import UIKit 31 | 32 | public class HamburgerView: UIButton 33 | { 34 | // MARK: - Properties 35 | private var animationDuration = 0.25 36 | private var ovalLayer: CAShapeLayer? 37 | private var shapeLayer2: CAShapeLayer? 38 | private var shapeLayer1: CAShapeLayer? 39 | private var shapeLayer: CAShapeLayer? 40 | 41 | private var strokecolorAnimation: CABasicAnimation? 42 | private var reverseStrokecolorAnimation: CABasicAnimation? 43 | private var transformRotationZAnimation: CAKeyframeAnimation? 44 | private var positionYAnimation: CABasicAnimation? 45 | private var positionXAnimation: CABasicAnimation? 46 | private var fillcolorAnimation: CABasicAnimation? 47 | private var reverseTransformRotationZAnimation: CAKeyframeAnimation? 48 | private var reversePositionYAnimation: CABasicAnimation? 49 | private var reversePositionXAnimation: CABasicAnimation? 50 | private var reverseFillcolorAnimation: CABasicAnimation? 51 | private var opacityAnimation: CABasicAnimation? 52 | private var reverseOpacityAnimation: CABasicAnimation? 53 | private var transformRotationZAnimation1: CAKeyframeAnimation? 54 | private var positionYAnimation1: CABasicAnimation? 55 | private var positionXAnimation1: CABasicAnimation? 56 | private var fillcolorAnimation1: CABasicAnimation? 57 | private var reverseTransformRotationZAnimation1: CAKeyframeAnimation? 58 | private var reversePositionYAnimation1: CABasicAnimation? 59 | private var reversePositionXAnimation1: CABasicAnimation? 60 | private var reverseFillcolorAnimation1: CABasicAnimation? 61 | 62 | // MARK: - Initialization 63 | 64 | init() 65 | { 66 | super.init(frame: CGRect(x: 0, y: 0, width: 50, height: 50)) 67 | self.setupLayers() 68 | } 69 | 70 | required public init?(coder aDecoder: NSCoder) 71 | { 72 | super.init(coder: aDecoder) 73 | self.setupLayers() 74 | } 75 | 76 | // MARK: - Setup Layers 77 | 78 | private func setupLayers() 79 | { 80 | // Colors 81 | // 82 | let shadowcolor = UIColor(red: 0.047059, green: 0.105882, blue: 0.137255, alpha: 1) 83 | let clearColor = UIColor(red: 1, green: 1, blue: 1, alpha: 0) 84 | let whiteColor = UIColor.white 85 | let fillcolor = UIColor(red: 0.178306, green: 0.178306, blue: 0.178306, alpha: 1) 86 | let strokecolor = UIColor(red: 0.806946, green: 0.806946, blue: 0.806946, alpha: 1) 87 | let lightBlueColor = UIColor(red: 0.009054, green: 0.830696, blue: 0.972815, alpha: 1) 88 | 89 | // Paths 90 | // 91 | let ovalPath = CGMutablePath() 92 | ovalPath.move(to: CGPoint(x: 25, y: 50)) 93 | ovalPath.addCurve(to: CGPoint(x: 50, y: 25), control1: CGPoint(x: 38.806999, y: 50), control2: CGPoint(x: 50, y: 38.806999)) 94 | ovalPath.addCurve(to: CGPoint(x: 25, y: 0), control1: CGPoint(x: 50, y: 11.193), control2: CGPoint(x: 38.806999, y: 0)) 95 | ovalPath.addCurve(to: CGPoint(x: 0, y: 25), control1: CGPoint(x: 11.193, y: 0), control2: CGPoint(x: 0, y: 11.193)) 96 | ovalPath.addCurve(to: CGPoint(x: 25, y: 50), control1: CGPoint(x: 0, y: 38.806999), control2: CGPoint(x: 11.193, y: 50)) 97 | ovalPath.closeSubpath() 98 | ovalPath.move(to: CGPoint(x: 25, y: 50)) 99 | 100 | let shapePath = CGMutablePath() 101 | shapePath.move(to: CGPoint(x: 19, y: 0)) 102 | shapePath.addLine(to: CGPoint(x: 2, y: 0)) 103 | shapePath.addCurve(to: CGPoint(x: 0, y: 2), control1: CGPoint(x: 0.831, y: 0), control2: CGPoint(x: 0, y: 0.907)) 104 | shapePath.addCurve(to: CGPoint(x: 2, y: 4), control1: CGPoint(x: 0, y: 3.093), control2: CGPoint(x: 0.831, y: 4)) 105 | shapePath.addLine(to: CGPoint(x: 19, y: 4)) 106 | shapePath.addCurve(to: CGPoint(x: 21, y: 2), control1: CGPoint(x: 20.169001, y: 4), control2: CGPoint(x: 21, y: 3.093)) 107 | shapePath.addCurve(to: CGPoint(x: 19, y: 0), control1: CGPoint(x: 21, y: 0.907), control2: CGPoint(x: 20.169001, y: 0)) 108 | shapePath.closeSubpath() 109 | shapePath.move(to: CGPoint(x: 19, y: 0)) 110 | 111 | let shapePath1 = CGMutablePath() 112 | shapePath1.move(to: CGPoint(x: 2, y: 4)) 113 | shapePath1.addLine(to: CGPoint(x: 19, y: 4)) 114 | shapePath1.addCurve(to: CGPoint(x: 21, y: 2), control1: CGPoint(x: 20.165001, y: 4), control2: CGPoint(x: 21, y: 3.093)) 115 | shapePath1.addCurve(to: CGPoint(x: 19, y: 0), control1: CGPoint(x: 21, y: 0.907), control2: CGPoint(x: 20.165001, y: 0)) 116 | shapePath1.addLine(to: CGPoint(x: 2, y: 0)) 117 | shapePath1.addCurve(to: CGPoint(x: 0, y: 2), control1: CGPoint(x: 0.835, y: 0), control2: CGPoint(x: 0, y: 0.907)) 118 | shapePath1.addCurve(to: CGPoint(x: 2, y: 4), control1: CGPoint(x: 0, y: 3.093), control2: CGPoint(x: 0.835, y: 4)) 119 | shapePath1.closeSubpath() 120 | shapePath1.move(to: CGPoint(x: 2, y: 4)) 121 | 122 | let shapePath2 = CGMutablePath() 123 | shapePath2.move(to: CGPoint(x: 19, y: 0)) 124 | shapePath2.addLine(to: CGPoint(x: 2, y: 0)) 125 | shapePath2.addCurve(to: CGPoint(x: 0, y: 2), control1: CGPoint(x: 0.819, y: 0), control2: CGPoint(x: 0, y: 0.907)) 126 | shapePath2.addCurve(to: CGPoint(x: 2, y: 4), control1: CGPoint(x: 0, y: 3.093), control2: CGPoint(x: 0.819, y: 4)) 127 | shapePath2.addLine(to: CGPoint(x: 19, y: 4)) 128 | shapePath2.addCurve(to: CGPoint(x: 21, y: 2), control1: CGPoint(x: 20.181, y: 4), control2: CGPoint(x: 21, y: 3.093)) 129 | shapePath2.addCurve(to: CGPoint(x: 19, y: 0), control1: CGPoint(x: 21, y: 0.907), control2: CGPoint(x: 20.181, y: 0)) 130 | shapePath2.closeSubpath() 131 | shapePath2.move(to: CGPoint(x: 19, y: 0)) 132 | 133 | // hamburger 134 | // 135 | let hamburgerLayer = CALayer() 136 | hamburgerLayer.name = "hamburger" 137 | hamburgerLayer.bounds = CGRect(x: 0, y: 0, width: 50, height: 50) 138 | hamburgerLayer.position = CGPoint(x: 0, y: 0) 139 | hamburgerLayer.anchorPoint = CGPoint(x: 0, y: 0) 140 | hamburgerLayer.contentsGravity = kCAGravityCenter 141 | 142 | // hamburger Sublayers 143 | // 144 | 145 | // Oval 3 146 | // 147 | let ovalLayer = CAShapeLayer() 148 | ovalLayer.name = "Oval 3" 149 | ovalLayer.bounds = CGRect(x: 0, y: 0, width: 50, height: 50) 150 | ovalLayer.position = CGPoint(x: 0, y: 0) 151 | ovalLayer.anchorPoint = CGPoint(x: 0, y: 0) 152 | ovalLayer.contentsGravity = kCAGravityCenter 153 | ovalLayer.shadowOpacity = 1 154 | ovalLayer.shadowOffset = CGSize(width: 1, height: 1) 155 | ovalLayer.shadowColor = shadowcolor.cgColor 156 | 157 | // Oval 3 Animations 158 | // 159 | 160 | // strokeColor 161 | // 162 | let strokecolorAnimation = CABasicAnimation() 163 | strokecolorAnimation.beginTime = 0.304 164 | strokecolorAnimation.duration = animationDuration 165 | strokecolorAnimation.fillMode = kCAFillModeForwards 166 | strokecolorAnimation.isRemovedOnCompletion = false 167 | strokecolorAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) 168 | strokecolorAnimation.keyPath = "strokeColor" 169 | strokecolorAnimation.toValue = clearColor.cgColor 170 | 171 | 172 | // Reverse-strokeColor 173 | // 174 | let reverseStrokecolorAnimation = CABasicAnimation() 175 | reverseStrokecolorAnimation.beginTime = 0.791001 176 | reverseStrokecolorAnimation.duration = animationDuration 177 | reverseStrokecolorAnimation.fillMode = kCAFillModeForwards 178 | reverseStrokecolorAnimation.isRemovedOnCompletion = false 179 | reverseStrokecolorAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) 180 | reverseStrokecolorAnimation.keyPath = "strokeColor" 181 | reverseStrokecolorAnimation.toValue = whiteColor.cgColor 182 | reverseStrokecolorAnimation.fromValue = clearColor.cgColor 183 | 184 | ovalLayer.path = ovalPath 185 | ovalLayer.fillColor = fillcolor.cgColor 186 | ovalLayer.strokeColor = strokecolor.cgColor 187 | ovalLayer.fillRule = kCAFillRuleEvenOdd 188 | ovalLayer.lineWidth = 2 189 | 190 | hamburgerLayer.addSublayer(ovalLayer) 191 | 192 | // crossLayer 193 | // 194 | let crossLayer = CALayer() 195 | crossLayer.name = "crossLayer" 196 | crossLayer.bounds = CGRect(x: 0, y: 0, width: 21, height: 18) 197 | crossLayer.position = CGPoint(x: 15, y: 16) 198 | crossLayer.anchorPoint = CGPoint(x: 0, y: 0) 199 | crossLayer.contentsGravity = kCAGravityCenter 200 | 201 | // noun_345386_cc Sublayers 202 | // 203 | 204 | // Shape-3 205 | // 206 | let shapeLayer = CAShapeLayer() 207 | shapeLayer.name = "Shape-3" 208 | shapeLayer.bounds = CGRect(x: 0, y: 0, width: 21, height: 4) 209 | shapeLayer.position = CGPoint(x: 0, y: 0) 210 | shapeLayer.anchorPoint = CGPoint(x: 0, y: 0) 211 | shapeLayer.contentsGravity = kCAGravityCenter 212 | 213 | // Shape-3 Animations 214 | // 215 | 216 | // transform.rotation.z 217 | // 218 | let transformRotationZAnimation = CAKeyframeAnimation() 219 | transformRotationZAnimation.beginTime = 0.307 220 | transformRotationZAnimation.duration = animationDuration 221 | transformRotationZAnimation.fillMode = kCAFillModeForwards 222 | transformRotationZAnimation.isRemovedOnCompletion = false 223 | transformRotationZAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault) 224 | transformRotationZAnimation.keyPath = "transform.rotation.z" 225 | transformRotationZAnimation.values = [ 0, 0.75 ] 226 | transformRotationZAnimation.calculationMode = kCAAnimationLinear 227 | 228 | 229 | // position.y 230 | // 231 | let positionYAnimation = CABasicAnimation() 232 | positionYAnimation.beginTime = 0.304374 233 | positionYAnimation.duration = animationDuration 234 | positionYAnimation.fillMode = kCAFillModeForwards 235 | positionYAnimation.isRemovedOnCompletion = false 236 | positionYAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault) 237 | positionYAnimation.keyPath = "position.y" 238 | positionYAnimation.toValue = 2 239 | 240 | 241 | // position.x 242 | // 243 | let positionXAnimation = CABasicAnimation() 244 | positionXAnimation.beginTime = 0.304374 245 | positionXAnimation.duration = animationDuration 246 | positionXAnimation.fillMode = kCAFillModeForwards 247 | positionXAnimation.isRemovedOnCompletion = false 248 | positionXAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault) 249 | positionXAnimation.keyPath = "position.x" 250 | positionXAnimation.toValue = 4 251 | 252 | 253 | // fillColor 254 | // 255 | let fillcolorAnimation = CABasicAnimation() 256 | fillcolorAnimation.beginTime = 0.304374 257 | fillcolorAnimation.duration = animationDuration 258 | fillcolorAnimation.fillMode = kCAFillModeForwards 259 | fillcolorAnimation.isRemovedOnCompletion = false 260 | fillcolorAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) 261 | fillcolorAnimation.keyPath = "fillColor" 262 | fillcolorAnimation.toValue = lightBlueColor.cgColor 263 | 264 | 265 | // Reverse-transform.rotation.z 266 | // 267 | let reverseTransformRotationZAnimation = CAKeyframeAnimation() 268 | reverseTransformRotationZAnimation.beginTime = 0.793627 269 | reverseTransformRotationZAnimation.duration = animationDuration 270 | reverseTransformRotationZAnimation.fillMode = kCAFillModeForwards 271 | reverseTransformRotationZAnimation.isRemovedOnCompletion = false 272 | reverseTransformRotationZAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault) 273 | reverseTransformRotationZAnimation.keyPath = "transform.rotation.z" 274 | reverseTransformRotationZAnimation.values = [ 0.75, 0 ] 275 | reverseTransformRotationZAnimation.calculationMode = kCAAnimationLinear 276 | 277 | 278 | // Reverse-position.y 279 | // 280 | let reversePositionYAnimation = CABasicAnimation() 281 | reversePositionYAnimation.beginTime = 0.791001 282 | reversePositionYAnimation.duration = animationDuration 283 | reversePositionYAnimation.fillMode = kCAFillModeForwards 284 | reversePositionYAnimation.isRemovedOnCompletion = false 285 | reversePositionYAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault) 286 | reversePositionYAnimation.keyPath = "position.y" 287 | reversePositionYAnimation.toValue = 0 288 | reversePositionYAnimation.fromValue = 2 289 | 290 | 291 | // Reverse-position.x 292 | // 293 | let reversePositionXAnimation = CABasicAnimation() 294 | reversePositionXAnimation.beginTime = 0.791001 295 | reversePositionXAnimation.duration = animationDuration 296 | reversePositionXAnimation.fillMode = kCAFillModeForwards 297 | reversePositionXAnimation.isRemovedOnCompletion = false 298 | reversePositionXAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault) 299 | reversePositionXAnimation.keyPath = "position.x" 300 | reversePositionXAnimation.toValue = 0 301 | 302 | 303 | // Reverse-fillColor 304 | // 305 | let reverseFillcolorAnimation = CABasicAnimation() 306 | reverseFillcolorAnimation.beginTime = 0.791001 307 | reverseFillcolorAnimation.duration = animationDuration 308 | reverseFillcolorAnimation.fillMode = kCAFillModeForwards 309 | reverseFillcolorAnimation.isRemovedOnCompletion = false 310 | reverseFillcolorAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) 311 | reverseFillcolorAnimation.keyPath = "fillColor" 312 | reverseFillcolorAnimation.toValue = whiteColor.cgColor 313 | reverseFillcolorAnimation.fromValue = lightBlueColor.cgColor 314 | 315 | shapeLayer.path = shapePath 316 | shapeLayer.fillColor = whiteColor.cgColor 317 | shapeLayer.strokeColor = clearColor.cgColor 318 | shapeLayer.fillRule = kCAFillRuleEvenOdd 319 | shapeLayer.lineWidth = 0 320 | 321 | crossLayer.addSublayer(shapeLayer) 322 | 323 | // Shape-2 324 | // 325 | let shapeLayer1 = CAShapeLayer() 326 | shapeLayer1.name = "Shape-2" 327 | shapeLayer1.bounds = CGRect(x: 0, y: 0, width: 21, height: 4) 328 | shapeLayer1.position = CGPoint(x: 0, y: 7) 329 | shapeLayer1.anchorPoint = CGPoint(x: 0, y: 0) 330 | shapeLayer1.contentsGravity = kCAGravityCenter 331 | 332 | // Shape-2 Animations 333 | // 334 | 335 | // opacity 336 | // 337 | let opacityAnimation = CABasicAnimation() 338 | opacityAnimation.beginTime = 0.299375 339 | opacityAnimation.duration = animationDuration 340 | opacityAnimation.fillMode = kCAFillModeForwards 341 | opacityAnimation.isRemovedOnCompletion = false 342 | opacityAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault) 343 | opacityAnimation.keyPath = "opacity" 344 | opacityAnimation.toValue = 0 345 | 346 | 347 | // Reverse-opacity 348 | // 349 | let reverseOpacityAnimation = CABasicAnimation() 350 | reverseOpacityAnimation.beginTime = 0.791001 351 | reverseOpacityAnimation.duration = animationDuration 352 | reverseOpacityAnimation.fillMode = kCAFillModeForwards 353 | reverseOpacityAnimation.isRemovedOnCompletion = false 354 | reverseOpacityAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault) 355 | reverseOpacityAnimation.keyPath = "opacity" 356 | reverseOpacityAnimation.toValue = 1 357 | reverseOpacityAnimation.fromValue = 0 358 | 359 | shapeLayer1.path = shapePath1 360 | shapeLayer1.fillColor = whiteColor.cgColor 361 | shapeLayer1.strokeColor = clearColor.cgColor 362 | shapeLayer1.fillRule = kCAFillRuleEvenOdd 363 | shapeLayer1.lineWidth = 0 364 | 365 | crossLayer.addSublayer(shapeLayer1) 366 | 367 | // Shape-1 368 | // 369 | let shapeLayer2 = CAShapeLayer() 370 | shapeLayer2.name = "Shape-1" 371 | shapeLayer2.bounds = CGRect(x: 0, y: 0, width: 21, height: 4) 372 | shapeLayer2.position = CGPoint(x: 0, y: 14) 373 | shapeLayer2.anchorPoint = CGPoint(x: 0, y: 0) 374 | shapeLayer2.contentsGravity = kCAGravityCenter 375 | 376 | // Shape-1 Animations 377 | // 378 | 379 | // transform.rotation.z 380 | // 381 | let transformRotationZAnimation1 = CAKeyframeAnimation() 382 | transformRotationZAnimation1.beginTime = 0.299375 383 | transformRotationZAnimation1.duration = animationTime 384 | transformRotationZAnimation1.fillMode = kCAFillModeForwards 385 | transformRotationZAnimation1.isRemovedOnCompletion = false 386 | transformRotationZAnimation1.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault) 387 | transformRotationZAnimation1.keyPath = "transform.rotation.z" 388 | transformRotationZAnimation1.values = [ 0, -0.75 ] 389 | transformRotationZAnimation1.calculationMode = kCAAnimationLinear 390 | 391 | 392 | // position.y 393 | // 394 | let positionYAnimation1 = CABasicAnimation() 395 | positionYAnimation1.beginTime = 0.304374 396 | positionYAnimation1.duration = animationTime 397 | positionYAnimation1.fillMode = kCAFillModeForwards 398 | positionYAnimation1.isRemovedOnCompletion = false 399 | positionYAnimation1.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault) 400 | positionYAnimation1.keyPath = "position.y" 401 | positionYAnimation1.toValue = 16 402 | 403 | 404 | // position.x 405 | // 406 | let positionXAnimation1 = CABasicAnimation() 407 | positionXAnimation1.beginTime = 0.304374 408 | positionXAnimation1.duration = animationTime 409 | positionXAnimation1.fillMode = kCAFillModeForwards 410 | positionXAnimation1.isRemovedOnCompletion = false 411 | positionXAnimation1.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault) 412 | positionXAnimation1.keyPath = "position.x" 413 | positionXAnimation1.toValue = 1 414 | 415 | 416 | // fillColor 417 | // 418 | let fillcolorAnimation1 = CABasicAnimation() 419 | fillcolorAnimation1.beginTime = 0.304374 420 | fillcolorAnimation1.duration = animationTime 421 | fillcolorAnimation1.fillMode = kCAFillModeForwards 422 | fillcolorAnimation1.isRemovedOnCompletion = false 423 | fillcolorAnimation1.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) 424 | fillcolorAnimation1.keyPath = "fillColor" 425 | fillcolorAnimation1.toValue = lightBlueColor.cgColor 426 | 427 | 428 | // Reverse-transform.rotation.z 429 | // 430 | let reverseTransformRotationZAnimation1 = CAKeyframeAnimation() 431 | reverseTransformRotationZAnimation1.beginTime = 0.791001 432 | reverseTransformRotationZAnimation1.duration = animationTime 433 | reverseTransformRotationZAnimation1.fillMode = kCAFillModeForwards 434 | reverseTransformRotationZAnimation1.isRemovedOnCompletion = false 435 | reverseTransformRotationZAnimation1.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault) 436 | reverseTransformRotationZAnimation1.keyPath = "transform.rotation.z" 437 | reverseTransformRotationZAnimation1.values = [ -0.75, 0 ] 438 | reverseTransformRotationZAnimation1.calculationMode = kCAAnimationLinear 439 | 440 | 441 | // Reverse-position.y 442 | // 443 | let reversePositionYAnimation1 = CABasicAnimation() 444 | reversePositionYAnimation1.beginTime = 0.791001 445 | reversePositionYAnimation1.duration = animationTime 446 | reversePositionYAnimation1.fillMode = kCAFillModeForwards 447 | reversePositionYAnimation1.isRemovedOnCompletion = false 448 | reversePositionYAnimation1.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault) 449 | reversePositionYAnimation1.keyPath = "position.y" 450 | reversePositionYAnimation1.fromValue = 16 451 | 452 | 453 | // Reverse-position.x 454 | // 455 | let reversePositionXAnimation1 = CABasicAnimation() 456 | reversePositionXAnimation1.beginTime = 0.791001 457 | reversePositionXAnimation1.duration = animationTime 458 | reversePositionXAnimation1.fillMode = kCAFillModeForwards 459 | reversePositionXAnimation1.isRemovedOnCompletion = false 460 | reversePositionXAnimation1.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault) 461 | reversePositionXAnimation1.keyPath = "position.x" 462 | reversePositionXAnimation1.fromValue = 1 463 | 464 | 465 | // Reverse-fillColor 466 | // 467 | let reverseFillcolorAnimation1 = CABasicAnimation() 468 | reverseFillcolorAnimation1.beginTime = 0.791001 469 | reverseFillcolorAnimation1.duration = animationTime 470 | reverseFillcolorAnimation1.fillMode = kCAFillModeForwards 471 | reverseFillcolorAnimation1.isRemovedOnCompletion = false 472 | reverseFillcolorAnimation1.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) 473 | reverseFillcolorAnimation1.keyPath = "fillColor" 474 | reverseFillcolorAnimation1.toValue = whiteColor.cgColor 475 | reverseFillcolorAnimation1.fromValue = lightBlueColor.cgColor 476 | 477 | shapeLayer2.path = shapePath2 478 | shapeLayer2.fillColor = whiteColor.cgColor 479 | shapeLayer2.strokeColor = clearColor.cgColor 480 | shapeLayer2.fillRule = kCAFillRuleEvenOdd 481 | shapeLayer2.lineWidth = 0 482 | 483 | crossLayer.addSublayer(shapeLayer2) 484 | 485 | hamburgerLayer.addSublayer(crossLayer) 486 | 487 | // theeLineLayer 488 | // 489 | let theeLineLayer = CALayer() 490 | theeLineLayer.name = "theeLineLayer" 491 | theeLineLayer.bounds = CGRect(x: 0, y: 0, width: 18, height: 18) 492 | theeLineLayer.position = CGPoint(x: 16, y: 16) 493 | theeLineLayer.anchorPoint = CGPoint(x: 0, y: 0) 494 | theeLineLayer.contentsGravity = kCAGravityCenter 495 | theeLineLayer.isHidden = true 496 | hamburgerLayer.addSublayer(theeLineLayer) 497 | 498 | self.layer.addSublayer(hamburgerLayer) 499 | 500 | // Layer Instance Assignments 501 | // 502 | self.ovalLayer = ovalLayer 503 | self.shapeLayer2 = shapeLayer2 504 | self.shapeLayer1 = shapeLayer1 505 | self.shapeLayer = shapeLayer 506 | 507 | // Animation Instance Assignments 508 | // 509 | self.strokecolorAnimation = strokecolorAnimation 510 | self.reverseStrokecolorAnimation = reverseStrokecolorAnimation 511 | self.transformRotationZAnimation = transformRotationZAnimation 512 | self.positionYAnimation = positionYAnimation 513 | self.positionXAnimation = positionXAnimation 514 | self.fillcolorAnimation = fillcolorAnimation 515 | self.reverseTransformRotationZAnimation = reverseTransformRotationZAnimation 516 | self.reversePositionYAnimation = reversePositionYAnimation 517 | self.reversePositionXAnimation = reversePositionXAnimation 518 | self.reverseFillcolorAnimation = reverseFillcolorAnimation 519 | self.opacityAnimation = opacityAnimation 520 | self.reverseOpacityAnimation = reverseOpacityAnimation 521 | self.transformRotationZAnimation1 = transformRotationZAnimation1 522 | self.positionYAnimation1 = positionYAnimation1 523 | self.positionXAnimation1 = positionXAnimation1 524 | self.fillcolorAnimation1 = fillcolorAnimation1 525 | self.reverseTransformRotationZAnimation1 = reverseTransformRotationZAnimation1 526 | self.reversePositionYAnimation1 = reversePositionYAnimation1 527 | self.reversePositionXAnimation1 = reversePositionXAnimation1 528 | self.reverseFillcolorAnimation1 = reverseFillcolorAnimation1 529 | } 530 | 531 | // MARK: - Actions 532 | func openBottomMenu() 533 | { 534 | self.reverseTransformRotationZAnimation1!.beginTime = self.shapeLayer2!.convertTime(CACurrentMediaTime(), from: nil) 535 | self.shapeLayer2?.add(self.reverseTransformRotationZAnimation1!, forKey: "reverseTransformRotationZAnimation1") 536 | 537 | self.reversePositionYAnimation1!.beginTime = self.shapeLayer2!.convertTime(CACurrentMediaTime(), from: nil) 538 | self.shapeLayer2?.add(self.reversePositionYAnimation1!, forKey: "reversePositionYAnimation1") 539 | 540 | self.reversePositionXAnimation1!.beginTime = self.shapeLayer2!.convertTime(CACurrentMediaTime(), from: nil) 541 | self.shapeLayer2?.add(self.reversePositionXAnimation1!, forKey: "reversePositionXAnimation1") 542 | 543 | self.reverseFillcolorAnimation1!.beginTime = self.shapeLayer2!.convertTime(CACurrentMediaTime(), from: nil) 544 | self.shapeLayer2?.add(self.reverseFillcolorAnimation1!, forKey: "reverseFillcolorAnimation1") 545 | 546 | self.reverseTransformRotationZAnimation!.beginTime = self.shapeLayer!.convertTime(CACurrentMediaTime(), from: nil) 547 | self.shapeLayer?.add(self.reverseTransformRotationZAnimation!, forKey: "reverseTransformRotationZAnimation") 548 | 549 | self.reversePositionYAnimation!.beginTime = self.shapeLayer!.convertTime(CACurrentMediaTime(), from: nil) 550 | self.shapeLayer?.add(self.reversePositionYAnimation!, forKey: "reversePositionYAnimation") 551 | 552 | self.reversePositionXAnimation!.beginTime = self.shapeLayer!.convertTime(CACurrentMediaTime(), from: nil) 553 | self.shapeLayer?.add(self.reversePositionXAnimation!, forKey: "reversePositionXAnimation") 554 | 555 | self.reverseFillcolorAnimation!.beginTime = self.shapeLayer!.convertTime(CACurrentMediaTime(), from: nil) 556 | self.shapeLayer?.add(self.reverseFillcolorAnimation!, forKey: "reverseFillcolorAnimation") 557 | 558 | self.reverseOpacityAnimation!.beginTime = self.shapeLayer1!.convertTime(CACurrentMediaTime(), from: nil) 559 | self.shapeLayer1?.add(self.reverseOpacityAnimation!, forKey: "reverseOpacityAnimation") 560 | 561 | self.reverseStrokecolorAnimation!.beginTime = self.ovalLayer!.convertTime(CACurrentMediaTime(), from: nil) 562 | self.ovalLayer?.add(self.reverseStrokecolorAnimation!, forKey: "reverseStrokecolorAnimation") 563 | } 564 | 565 | func closeBottomMenu() 566 | { 567 | self.strokecolorAnimation!.beginTime = self.ovalLayer!.convertTime(CACurrentMediaTime(), from: nil) 568 | self.ovalLayer?.add(self.strokecolorAnimation!, forKey: "strokecolorAnimation") 569 | 570 | self.transformRotationZAnimation1!.beginTime = self.shapeLayer2!.convertTime(CACurrentMediaTime(), from: nil) 571 | self.shapeLayer2?.add(self.transformRotationZAnimation1!, forKey: "transformRotationZAnimation1") 572 | 573 | self.positionYAnimation1!.beginTime = self.shapeLayer2!.convertTime(CACurrentMediaTime(), from: nil) 574 | self.shapeLayer2?.add(self.positionYAnimation1!, forKey: "positionYAnimation1") 575 | 576 | self.positionXAnimation1!.beginTime = self.shapeLayer2!.convertTime(CACurrentMediaTime(), from: nil) 577 | self.shapeLayer2?.add(self.positionXAnimation1!, forKey: "positionXAnimation1") 578 | 579 | self.fillcolorAnimation1!.beginTime = self.shapeLayer2!.convertTime(CACurrentMediaTime(), from: nil) 580 | self.shapeLayer2?.add(self.fillcolorAnimation1!, forKey: "fillcolorAnimation1") 581 | 582 | self.opacityAnimation!.beginTime = self.shapeLayer1!.convertTime(CACurrentMediaTime(), from: nil) 583 | self.shapeLayer1?.add(self.opacityAnimation!, forKey: "opacityAnimation") 584 | 585 | self.transformRotationZAnimation!.beginTime = self.shapeLayer!.convertTime(CACurrentMediaTime(), from: nil) 586 | self.shapeLayer?.add(self.transformRotationZAnimation!, forKey: "transformRotationZAnimation") 587 | 588 | self.fillcolorAnimation!.beginTime = self.shapeLayer!.convertTime(CACurrentMediaTime(), from: nil) 589 | self.shapeLayer?.add(self.fillcolorAnimation!, forKey: "fillcolorAnimation") 590 | 591 | self.positionXAnimation!.beginTime = self.shapeLayer!.convertTime(CACurrentMediaTime(), from: nil) 592 | self.shapeLayer?.add(self.positionXAnimation!, forKey: "positionXAnimation") 593 | 594 | self.positionYAnimation!.beginTime = self.shapeLayer!.convertTime(CACurrentMediaTime(), from: nil) 595 | self.shapeLayer?.add(self.positionYAnimation!, forKey: "positionYAnimation") 596 | } 597 | 598 | } 599 | -------------------------------------------------------------------------------- /SSCustomTabMenu/CustomTabMenu/Helper/MenuItemCollectionFlowLayout.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MenuItemCollectionFlowLayout.swift 3 | // SSCustomTabMenu 4 | // 5 | // Created by Simform Solutions on 11/11/17. 6 | // Copyright © 2017 Simform Solutions. All rights reserved. 7 | // 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in 17 | // all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 | // THE SOFTWARE. 26 | // 27 | // 28 | 29 | import UIKit 30 | 31 | public class MenuItemCollectionFlowLayout: UICollectionViewFlowLayout { 32 | 33 | @IBInspectable public var numberOfColumns:CGFloat = 3 { 34 | didSet{ 35 | } 36 | } 37 | 38 | override init() { 39 | super.init() 40 | } 41 | required public init?(coder aDecoder: NSCoder) { 42 | super.init(coder: aDecoder) 43 | } 44 | 45 | override public var itemSize: CGSize { 46 | set { 47 | } 48 | get { 49 | let itemWidth = (self.collectionView!.frame.width - numberOfColumns*10) / numberOfColumns 50 | return CGSize(width: itemWidth, height: 123) 51 | } 52 | } 53 | } 54 | 55 | -------------------------------------------------------------------------------- /SSCustomTabMenu/CustomTabMenu/Helper/MenuItemsCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MenuItemsCell.swift 3 | // SSCustomTabMenu 4 | // 5 | // Created by Simform Solutions on 11/08/17. 6 | // Copyright © 2017 Simform Solutions. All rights reserved. 7 | // 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in 17 | // all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 | // THE SOFTWARE. 26 | // 27 | // 28 | 29 | import UIKit 30 | 31 | class MenuItemsCell: UICollectionViewCell { 32 | 33 | @IBOutlet var imgMenuIcon: UIImageView! 34 | @IBOutlet var lblMenuTitle: UILabel! 35 | 36 | } 37 | -------------------------------------------------------------------------------- /SSCustomTabMenu/CustomTabMenu/Helper/TabMenuVC.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TabMenuVC.swift 3 | // SSCustomTabMenu 4 | // 5 | // Created by Simform Solutions on 11/08/17. 6 | // Copyright © 2017 Simform Solutions. All rights reserved. 7 | // 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in 17 | // all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 | // THE SOFTWARE. 26 | // 27 | // 28 | 29 | import UIKit 30 | 31 | let animationTime = 0.3 32 | let tabBarHeight:CGFloat = 58.0 33 | let menuIndex = 0 34 | enum TypeofSelection { 35 | case menu 36 | case tab 37 | } 38 | 39 | enum OnOpenCloseAnimType { 40 | case openMenu 41 | case normalClose 42 | case yPositionClose 43 | case none 44 | } 45 | 46 | public class TabMenuVC: UIViewController,BasicAnimation{ 47 | 48 | // MARK: - 49 | // MARK: - Variable Declaration 50 | 51 | public var centerTab:UIViewController! 52 | public var RightTab:UIViewController! 53 | public var tabControllers: [UIViewController]! 54 | 55 | public var totalTabMenuHeight:CGFloat = 296 56 | fileprivate var backImageView: UIImageView? 57 | public var arrMenuItems = [Int: MenuItem]() 58 | let tapRec = UITapGestureRecognizer() 59 | 60 | // MARK: - 61 | // MARK: - Outlets 62 | 63 | @IBOutlet var gridMenu: UICollectionView! 64 | @IBOutlet var viewMenu: UIView! 65 | 66 | @IBOutlet var containerView: UIView! 67 | @IBOutlet var CMenuTabHeight: NSLayoutConstraint! 68 | @IBOutlet var CContainerBottom: NSLayoutConstraint! 69 | 70 | 71 | // MARK: - 72 | // MARK: - Outlets Collections 73 | @IBOutlet var tabButton: [UIButton]! 74 | @IBOutlet var tabMenu: HamburgerView! 75 | 76 | // MARK: - 77 | // MARK: - ViewController Methods 78 | 79 | override public func viewDidLoad() { 80 | super.viewDidLoad() 81 | tabControllers = [centerTab,RightTab] 82 | self.Setup() 83 | // Do any additional setup after loading the view. 84 | } 85 | 86 | override public func didReceiveMemoryWarning() { 87 | super.didReceiveMemoryWarning() 88 | // Dispose of any resources that can be recreated. 89 | } 90 | 91 | override public func viewDidLayoutSubviews() { 92 | super.viewDidLayoutSubviews() 93 | self.containerView.layer.anchorPoint = CGPoint(x: 0.5, y: 0) 94 | self.containerView.layer.position = CGPoint(x: self.view.frame.width/2, y:0) 95 | } 96 | 97 | // MARK: - 98 | // MARK: - Button Action Methods 99 | 100 | @IBAction func didPressTab(_ sender: UIButton){ 101 | self.tabAndMenuSelected(index: sender.tag,previousType: selectedType,currentType: TypeofSelection.tab) 102 | } 103 | } 104 | 105 | extension TabMenuVC : UICollectionViewDelegate,UICollectionViewDataSource { 106 | public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 107 | //return menuController.count 108 | return arrMenuItems.count 109 | } 110 | 111 | public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 112 | 113 | let cellMenu = collectionView.dequeueReusableCell(withReuseIdentifier: "MenuItemsCell", for: indexPath) as! MenuItemsCell 114 | cellMenu.imgMenuIcon.image = UIImage(named: (arrMenuItems[indexPath.row+1]?.imageName)!) 115 | cellMenu.lblMenuTitle.text = arrMenuItems[indexPath.row+1]?.menuItemTitle 116 | return cellMenu 117 | 118 | } 119 | 120 | public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 121 | self.tabAndMenuSelected(index: indexPath.row,previousType: selectedType,currentType: TypeofSelection.menu) 122 | } 123 | } 124 | 125 | extension TabMenuVC{ 126 | 127 | func Setup(){ 128 | 129 | self.viewMenu.backgroundColor = UIColor.clear 130 | 131 | let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark) 132 | let blurEffectView = UIVisualEffectView(effect: blurEffect) 133 | //always fill the view 134 | blurEffectView.frame = self.viewMenu.bounds 135 | blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight] 136 | 137 | self.viewMenu.insertSubview(blurEffectView, at: 0) //if you have more UIViews, use an insertSubview API to place it where needed 138 | 139 | CMenuTabHeight.constant = tabBarHeight 140 | self.view.layoutIfNeeded() 141 | tabButton[selectedIndex].isSelected = false 142 | tabAndMenuSelected(index: 0,previousType: selectedType,currentType: TypeofSelection.tab) 143 | 144 | if(arrMenuItems.count <= 3){ 145 | totalTabMenuHeight = totalTabMenuHeight - 133 146 | }else{ 147 | totalTabMenuHeight = totalTabMenuHeight - 0 148 | } 149 | 150 | 151 | tapRec.addTarget(self, action:#selector(TabMenuVC.tappedView)) 152 | tapRec.numberOfTouchesRequired = 1 153 | tapRec.numberOfTapsRequired = 1 154 | self.containerView!.addGestureRecognizer(tapRec) 155 | 156 | } 157 | 158 | func tappedView(){ 159 | if(CMenuTabHeight.constant != tabBarHeight){ 160 | self.OpenMenuClose(status: .normalClose) 161 | } 162 | } 163 | 164 | func OpenMenuClose(status:OnOpenCloseAnimType){ 165 | 166 | if(CMenuTabHeight.constant == tabBarHeight){ 167 | tabButton[menuIndex].isSelected = true 168 | tabButton[menuIndex].borderColor = UIColor.clear 169 | 170 | ScaleAnimation(self.containerView, duration: animationTime) 171 | ScaleAnimation(self.containerView, duration: animationTime) 172 | OpacityAnimation(self.containerView, duration: animationTime) 173 | 174 | CMenuTabHeight.constant = totalTabMenuHeight + tabBarHeight 175 | CContainerBottom.constant = -totalTabMenuHeight + tabBarHeight 176 | 177 | self.tabMenu.closeBottomMenu() 178 | } 179 | else{ 180 | tabButton[menuIndex].borderColor = UIColor.white 181 | tabButton[menuIndex].isSelected = false 182 | if(status != OnOpenCloseAnimType.openMenu){ 183 | self.positionYAnimation(self.backImageView!, duration: 1,fromValue: self.totalTabMenuHeight+64) 184 | } 185 | 186 | ReverseScaleAnimation(self.containerView, duration: animationTime) 187 | ReverseOpacityAnimation(self.containerView, duration: animationTime) 188 | 189 | CMenuTabHeight.constant = tabBarHeight 190 | CContainerBottom.constant = 0 191 | self.tabMenu.openBottomMenu() 192 | } 193 | 194 | UIView.animate(withDuration: animationTime, animations: { 195 | self.view.layoutIfNeeded() 196 | }) { (finished: Bool) in 197 | 198 | } 199 | } 200 | 201 | func tabAndMenuSelected(index:Int,previousType:TypeofSelection,currentType:TypeofSelection){ 202 | if(index == 999){ 203 | tabButton[menuIndex].borderColor = UIColor.clear 204 | tabButton[menuIndex].isSelected = false 205 | self.OpenMenuClose(status: .openMenu) 206 | } 207 | else{ 208 | let previousIndex = selectedIndex 209 | selectedIndex = index 210 | 211 | var previousVC:UIViewController 212 | var vc:UIViewController 213 | if(previousType == TypeofSelection.tab){ 214 | previousVC = tabControllers[previousIndex] 215 | 216 | } 217 | else{ 218 | previousVC = arrMenuItems[previousIndex+1]!.viewControllerforMenu 219 | } 220 | 221 | 222 | let ScreenShot:UIImage = previousVC.view.takeSnapshot(self.view.bounds)!//SS 223 | self.backImageView = self.addImageToView(self.containerView, image: ScreenShot)//SS 224 | 225 | previousVC.willMove(toParentViewController: nil) 226 | previousVC.view.removeFromSuperview() 227 | previousVC.removeFromParentViewController() 228 | 229 | if(currentType == TypeofSelection.tab){ 230 | vc = tabControllers[selectedIndex] 231 | } 232 | else{ 233 | vc = arrMenuItems[selectedIndex+1]!.viewControllerforMenu 234 | } 235 | 236 | addChildViewController(vc) 237 | vc.view.frame = containerView.bounds 238 | containerView.addSubview(vc.view) 239 | vc.didMove(toParentViewController: self) 240 | 241 | if(currentType == TypeofSelection.menu){ 242 | if(previousType == TypeofSelection.menu){ 243 | vc.view.addSubview(self.backImageView!) 244 | self.OpenMenuClose(status: .yPositionClose) 245 | DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { 246 | self.backImageView!.removeFromSuperview() 247 | } 248 | } 249 | else{ 250 | 251 | vc.view.addSubview(self.backImageView!) 252 | self.OpenMenuClose(status: .yPositionClose) 253 | 254 | 255 | DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { 256 | self.backImageView!.removeFromSuperview() 257 | } 258 | } 259 | } 260 | else{ 261 | // self.OpenMenuClose(status: .normalClose) 262 | } 263 | selectedType = currentType 264 | } 265 | } 266 | 267 | fileprivate func addImageToView(_ view: UIView, image: UIImage?) -> UIImageView? { 268 | guard let image = image else { return nil } 269 | 270 | let imageView = Init(UIImageView(image: image)) { 271 | $0.translatesAutoresizingMaskIntoConstraints = false 272 | $0.alpha = 1 273 | } 274 | return imageView 275 | } 276 | 277 | } 278 | 279 | //Global Variables For Tab 280 | //var menuController: [UIViewController]! 281 | 282 | public var selectedIndex: Int = 0 283 | var selectedType = TypeofSelection.tab 284 | 285 | public struct MenuItem { 286 | var viewControllerforMenu: UIViewController 287 | var imageName: String 288 | var menuItemTitle: String 289 | } 290 | 291 | -------------------------------------------------------------------------------- /SSCustomTabMenu/CustomTabMenu/Helper/Transform.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Transform.swift 3 | // SSCustomTabMenu 4 | // 5 | // Created by Simform Solutions on 11/08/17. 6 | // Copyright © 2017 Simform Solutions. All rights reserved. 7 | // 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in 17 | // all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 | // THE SOFTWARE. 26 | // 27 | // 28 | 29 | import UIKit 30 | 31 | protocol BasicAnimation { 32 | 33 | func ScaleAnimation(_ toItem: UIView, duration: Double) 34 | func OpacityAnimation(_ toItem: UIView, duration: Double) 35 | func ReverseScaleAnimation(_ toItem: UIView, duration: Double) 36 | func ReverseOpacityAnimation(_ toItem: UIView, duration: Double) 37 | func positionYAnimation(_ toItem: UIView, duration: Double,fromValue:Any) 38 | } 39 | 40 | extension BasicAnimation { 41 | 42 | 43 | func ScaleAnimation(_ toItem: UIView, duration: Double){ 44 | 45 | let toValue = CATransform3D( m11: 1, m12: 0, m13: 0, m14: 0, m21: 0, m22: 1, m23: 0, m24: 0.0008, m31: 0, m32: 0, m33: 1, m34: 0, m41: 0, m42: 0, m43: 0, m44: 1 ) 46 | 47 | let Scale = commanAnimation(0.296, CATransform3DIdentity, to: toValue, key: "transform", duration: duration, kCAMediaTimingFunctionEaseInEaseOut) 48 | Scale.beginTime = toItem.layer.convertTime(CACurrentMediaTime(), from: nil) 49 | 50 | toItem.layer.add(Scale, forKey: nil) 51 | } 52 | 53 | 54 | func OpacityAnimation(_ toItem: UIView, duration: Double){ 55 | //toItem.layer.backgroundColor = UIColor.black.cgColor 56 | let Opacity = commanAnimation(0.299, 1, to: 0.6, key: "opacity", duration: duration, kCAMediaTimingFunctionEaseInEaseOut) 57 | Opacity.beginTime = toItem.layer.convertTime(CACurrentMediaTime(), from: nil) 58 | toItem.layer.add(Opacity, forKey: nil) 59 | } 60 | 61 | func ReverseScaleAnimation(_ toItem: UIView, duration: Double){ 62 | 63 | let fromValue = CATransform3D( m11: 1, m12: 0, m13: 0, m14: 0, m21: 0, m22: 1, m23: 0, m24: 0.0008, m31: 0, m32: 0, m33: 1, m34: 0, m41: 0, m42: 0, m43: 0, m44: 1 ) 64 | 65 | let Scale = commanAnimation(0.785625, fromValue, to: CATransform3DIdentity, key: "transform", duration: duration, kCAMediaTimingFunctionEaseInEaseOut) 66 | Scale.beginTime = toItem.layer.convertTime(CACurrentMediaTime(), from: nil) 67 | toItem.layer.add(Scale, forKey: nil) 68 | } 69 | 70 | func ReverseOpacityAnimation(_ toItem: UIView, duration: Double){ 71 | let Opacity = commanAnimation(0.299, 0.6, to: 1, key: "opacity", duration: duration, kCAMediaTimingFunctionEaseInEaseOut) 72 | Opacity.beginTime = toItem.layer.convertTime(CACurrentMediaTime(), from: nil) 73 | toItem.layer.add(Opacity, forKey: nil) 74 | } 75 | 76 | 77 | func positionYAnimation(_ toItem: UIView, duration: Double,fromValue:Any){ 78 | let positionY = commanAnimation(0.299, fromValue, to: screenSize.size.height*2, key: "position.y", duration: duration, kCAMediaTimingFunctionEaseInEaseOut) 79 | positionY.beginTime = toItem.layer.convertTime(CACurrentMediaTime(), from: nil) 80 | toItem.layer.add(positionY, forKey: nil) 81 | } 82 | 83 | fileprivate func commanAnimation(_ beginTime:Double,_ from: Any, to: Any, key: String, duration: Double,_ timingFunction:String) -> CABasicAnimation { 84 | 85 | return Init(CABasicAnimation(keyPath: key)) { 86 | $0.beginTime = beginTime 87 | $0.duration = duration 88 | $0.fromValue = from 89 | $0.toValue = to 90 | $0.fillMode = kCAFillModeForwards 91 | $0.isRemovedOnCompletion = false 92 | $0.timingFunction = CAMediaTimingFunction(name: timingFunction) 93 | } 94 | } 95 | } 96 | 97 | 98 | internal func Init(_ value : Type, block: (_ object: Type) -> Void) -> Type 99 | { 100 | block(value) 101 | return value 102 | } 103 | 104 | -------------------------------------------------------------------------------- /SSCustomTabMenu/CustomTabMenu/Helper/UIStoryBoardHelper.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIStoryBoardHelper.swift 3 | // SSCustomTabMenu 4 | // 5 | // Created by Tejas Ardeshna on 20/01/18. 6 | // Copyright © 2018 Satish Rajpurohit. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | extension UIStoryboard { 13 | 14 | //MARK : - storyboard declaration - 15 | static var MainStoryboard: UIStoryboard { 16 | return UIStoryboard(name: "Main", bundle: Bundle.main) 17 | } 18 | 19 | static var TabMenuStoryboard: UIStoryboard { 20 | return UIStoryboard(name: "TabMenu", bundle: Bundle.main) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /SSCustomTabMenu/CustomTabMenu/Helper/UIView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewExtension.swift 3 | // SSCustomTabMenu 4 | // 5 | // Created by Simform Solutions on 11/08/17. 6 | // Copyright © 2017 Simform Solutions. All rights reserved. 7 | // 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in 17 | // all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 | // THE SOFTWARE. 26 | // 27 | // 28 | 29 | import UIKit 30 | 31 | extension UIView { 32 | 33 | @IBInspectable var rounded:Bool { 34 | get { 35 | return true 36 | } 37 | set { 38 | if rounded { 39 | self.roundView() 40 | } 41 | } 42 | } 43 | 44 | func roundView() { 45 | self.layer.cornerRadius = self.frame.size.width/2 46 | self.clipsToBounds = true 47 | } 48 | 49 | @IBInspectable var borderWidth: CGFloat { 50 | get { 51 | return layer.borderWidth 52 | } 53 | set { 54 | layer.borderWidth = newValue 55 | } 56 | } 57 | 58 | @IBInspectable var borderColor: UIColor { 59 | get { 60 | return UIColor(cgColor: layer.borderColor!) 61 | } 62 | set { 63 | layer.borderColor = newValue.cgColor 64 | } 65 | } 66 | 67 | 68 | @IBInspectable var cornerRadius: CGFloat { 69 | get { 70 | return layer.cornerRadius 71 | } 72 | set { 73 | layer.cornerRadius = newValue 74 | layer.masksToBounds = newValue > 0 75 | } 76 | } 77 | 78 | func takeSnapshot(_ frame: CGRect) -> UIImage? { 79 | UIGraphicsBeginImageContextWithOptions(frame.size, false, 0.0) 80 | 81 | let context = UIGraphicsGetCurrentContext(); 82 | context?.translateBy(x: frame.origin.x * -1, y: frame.origin.y * -1) 83 | 84 | guard let currentContext = UIGraphicsGetCurrentContext() else { 85 | return nil 86 | } 87 | 88 | self.layer.render(in: currentContext) 89 | let image = UIGraphicsGetImageFromCurrentImageContext() 90 | UIGraphicsEndImageContext() 91 | 92 | return image 93 | } 94 | 95 | } 96 | -------------------------------------------------------------------------------- /SSCustomTabMenu/CustomTabMenu/SSTabStoryBoard/TabMenu.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 52 | 70 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | -------------------------------------------------------------------------------- /SSCustomTabMenu/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UIRequiresFullScreen 32 | 33 | UIStatusBarHidden 34 | 35 | UISupportedInterfaceOrientations 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationLandscapeLeft 39 | UIInterfaceOrientationLandscapeRight 40 | 41 | UIViewControllerBasedStatusBarAppearance 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /SSCustomTabMenu/KrewesVC.swift: -------------------------------------------------------------------------------- 1 | // 2 | // KrewesVC.swift 3 | // SSCustomTabMenu 4 | // 5 | // Created by Simform Solutions on 11/08/17. 6 | // Copyright © 2017 Simform Solutions. All rights reserved. 7 | // 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in 17 | // all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 | // THE SOFTWARE. 26 | // 27 | // 28 | 29 | import UIKit 30 | 31 | class KrewesVC: UIViewController,UIViewControllerTransitioningDelegate { 32 | 33 | override func viewDidLoad() { 34 | super.viewDidLoad() 35 | // Do any additional setup after loading the view. 36 | } 37 | 38 | override func didReceiveMemoryWarning() { 39 | super.didReceiveMemoryWarning() 40 | // Dispose of any resources that can be recreated. 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /SSCustomTabMenu/MusicVC.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MusicVC.swift 3 | // SSCustomTabMenu 4 | // 5 | // Created by Simform Solutions on 11/08/17. 6 | // Copyright © 2017 Simform Solutions. All rights reserved. 7 | // 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in 17 | // all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 | // THE SOFTWARE. 26 | // 27 | // 28 | 29 | import UIKit 30 | 31 | class MusicVC: UIViewController { 32 | 33 | override func viewDidLoad() { 34 | super.viewDidLoad() 35 | 36 | // Do any additional setup after loading the view. 37 | } 38 | 39 | override func didReceiveMemoryWarning() { 40 | super.didReceiveMemoryWarning() 41 | // Dispose of any resources that can be recreated. 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /SSCustomTabMenu/PlusVC.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // SSCustomTabMenu 4 | // 5 | // Created by Simform Solutions on 11/08/17. 6 | // Copyright © 2017 Simform Solutions. All rights reserved. 7 | // 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in 17 | // all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 | // THE SOFTWARE. 26 | // 27 | // 28 | 29 | import UIKit 30 | 31 | class PlusVC: UIViewController { 32 | 33 | @IBOutlet var viewToAnimate: UIView! 34 | 35 | override func viewDidLoad() { 36 | super.viewDidLoad() 37 | // Do any additional setup after loading the view, typically from a nib. 38 | } 39 | 40 | override func didReceiveMemoryWarning() { 41 | super.didReceiveMemoryWarning() 42 | // Dispose of any resources that can be recreated. 43 | } 44 | 45 | 46 | } 47 | 48 | -------------------------------------------------------------------------------- /customTab.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimformSolutionsPvtLtd/SSCustomTabMenu/c7ae0de20f4287108bbc438e1abf14dae0f29db3/customTab.gif --------------------------------------------------------------------------------