Repository: Ramotion/animated-tab-bar Branch: master Commit: 52174249fa7b Files: 110 Total size: 510.4 KB Directory structure: gitextract_ozh3a0j9/ ├── .gitignore ├── .swift-version ├── .travis.yml ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── Package.swift ├── RAMAnimatedTabBarController/ │ ├── Animations/ │ │ ├── BounceAnimation/ │ │ │ └── RAMBounceAnimation.swift │ │ ├── FrameAnimation/ │ │ │ └── RAMFrameItemAnimation.swift │ │ ├── FumeAnimation/ │ │ │ └── RAMFumeAnimation.swift │ │ ├── RotationAnimation/ │ │ │ └── RAMRotationAnimation.swift │ │ └── TransitionAniamtions/ │ │ └── RAMTransitionItemAnimations.swift │ ├── BottomLine/ │ │ └── RAMAnimatedTabBarController+BottomLine.swift │ ├── RAMAnimatedTabBarController.swift │ ├── RAMAnimatedTabBarItem.swift │ ├── RAMBadge/ │ │ └── RAMBadge.swift │ ├── RAMItemAnimationProtocol.swift │ └── Utilities/ │ └── Collection+Extensions.swift ├── RAMAnimatedTabBarController.podspec ├── RAMAnimatedTabBarDemo/ │ ├── AnimatedTabBarTests/ │ │ ├── AnimatedTabBarTests.swift │ │ ├── Info.plist │ │ └── RAMBadgeTests.swift │ ├── RAMAnimatedTabBarDemo/ │ │ ├── AppDelegate.swift │ │ ├── Base.lproj/ │ │ │ ├── LaunchScreen.xib │ │ │ └── Main.storyboard │ │ ├── Images.xcassets/ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ ├── Settings_icon/ │ │ │ │ └── Settings.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── Tools/ │ │ │ │ ├── Tools_00028.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00029.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00030.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00031.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00032.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00033.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00034.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00035.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00036.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00037.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00038.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00039.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00040.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00041.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00042.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00043.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00044.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00045.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00046.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00047.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00048.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00049.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00050.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00051.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00052.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00053.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00054.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00055.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00056.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00057.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00058.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00059.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00060.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00061.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00062.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00063.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Tools_00064.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── Tools_00065.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── drop/ │ │ │ │ └── drop.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── icon_pin.imageset/ │ │ │ │ └── Contents.json │ │ │ └── icon_user.imageset/ │ │ │ └── Contents.json │ │ ├── Info.plist │ │ ├── Resources/ │ │ │ └── ToolsAnimation.plist │ │ └── ViewController.swift │ ├── RAMAnimatedTabBarDemo.xcodeproj/ │ │ ├── project.pbxproj │ │ ├── project.xcworkspace/ │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata/ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ │ └── xcshareddata/ │ │ └── xcschemes/ │ │ └── RAMAnimatedTabBarController.xcscheme │ └── TabBarLib/ │ ├── Info.plist │ └── TabBarLib.h ├── README.md └── docs/ ├── Classes/ │ ├── RAMAnimatedTabBarController.html │ ├── RAMAnimatedTabBarItem.html │ ├── RAMBounceAnimation.html │ ├── RAMFrameItemAnimation.html │ ├── RAMFumeAnimation.html │ ├── RAMItemAnimation.html │ ├── RAMRotationAnimation.html │ └── RAMTransitionItemAnimations.html ├── Classes.html ├── css/ │ ├── highlight.css │ └── jazzy.css ├── docsets/ │ ├── RAMAnimatedTabBarDemo.docset/ │ │ └── Contents/ │ │ ├── Info.plist │ │ └── Resources/ │ │ ├── Documents/ │ │ │ ├── Classes/ │ │ │ │ ├── RAMAnimatedTabBarController.html │ │ │ │ ├── RAMAnimatedTabBarItem.html │ │ │ │ ├── RAMBounceAnimation.html │ │ │ │ ├── RAMFrameItemAnimation.html │ │ │ │ ├── RAMFumeAnimation.html │ │ │ │ ├── RAMItemAnimation.html │ │ │ │ ├── RAMRotationAnimation.html │ │ │ │ └── RAMTransitionItemAnimations.html │ │ │ ├── Classes.html │ │ │ ├── css/ │ │ │ │ ├── highlight.css │ │ │ │ └── jazzy.css │ │ │ ├── index.html │ │ │ ├── js/ │ │ │ │ └── jazzy.js │ │ │ └── undocumented.txt │ │ └── docSet.dsidx │ └── RAMAnimatedTabBarDemo.tgz ├── index.html ├── js/ │ └── jazzy.js └── undocumented.txt ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ # Xcode # build/ *.pbxuser !default.pbxuser *.mode1v3 !default.mode1v3 *.mode2v3 !default.mode2v3 *.perspectivev3 !default.perspectivev3 xcuserdata *.xccheckout *.moved-aside DerivedData *.hmap *.ipa *.xcuserstate # CocoaPods # # We recommend against adding the Pods directory to your .gitignore. However # you should judge for yourself, the pros and cons are mentioned at: # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control # # Pods/ # Carthage # # Add this line if you want to avoid checking in source code from Carthage dependencies. # Carthage/Checkouts Carthage/Build Status API Training Shop Blog About Pricing .DS_Store ================================================ FILE: .swift-version ================================================ 4.2 ================================================ FILE: .travis.yml ================================================ osx_image: xcode10.2 language: objective-c xcode_sdk: iphonesimulator12.1 xcode_project: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo.xcodeproj xcode_scheme: RAMAnimatedTabBarController # whitelist branches: only: - master ================================================ FILE: CHANGELOG.md ================================================ ================================================ FILE: CONTRIBUTING.md ================================================ # Contributing to a Project Now that you’ve found the material for understanding the project, here is how you can take action. ### Create an Issue If you find a bug in a project you’re using (and you don’t know how to fix it), have trouble following the documentation or have a question about the project – create an issue! There’s nothing to it and whatever issue you’re having, you’re likely not the only one, so others will find your issue helpful, too. For more information on how issues work, check out our Issues guide. #### Issues Pro Tips Check existing issues for your issue. Duplicating an issue is slower for both parties so search through open and closed issues to see if what you’re running into has been addressed already. Be clear about what your problem is: what was the expected outcome, what happened instead? Detail how someone else can recreate the problem. Link to demos recreating the problem on things like JSFiddle or CodePen. Include system details like what the browser, library or operating system you’re using and its version. Paste error output or logs in your issue or in a Gist. If pasting them in the issue, wrap it in three backticks: ``` so that it renders nicely. ### Pull Request If you’re able to patch the bug or add the feature yourself – fantastic, make a pull request with the code! Be sure you’ve read any documents on contributing, understand the license and have signed a CLA if required. Once you’ve submitted a pull request the maintainer(s) can compare your branch to the existing one and decide whether or not to incorporate (pull in) your changes. #### Pull Request Pro Tips Fork the repository and clone it locally. Connect your local to the original ‘upstream’ repository by adding it as a remote. Pull in changes from ‘upstream’ often so that you stay up to date so that when you submit your pull request, merge conflicts will be less likely. See more detailed instructions here. Create a branch for your edits. Be clear about what problem is occurring and how someone can recreate that problem or why your feature will help. Then be equally as clear about the steps you took to make your changes. It’s best to test. Run your changes against any existing tests if they exist and create new ones when needed. Whether tests exist or not, make sure your changes don’t break the existing project. Include screenshots of the before and after if your changes include differences in HTML/CSS. Drag and drop the images into the body of your pull request. Contribute in the style of the project to the best of your abilities. This may mean using indents, semi colons or comments differently than you would in your own repository, but makes it easier for the maintainer to merge, others to understand and maintain in the future. #### Open Pull Requests Once you’ve opened a pull request a discussion will start around your proposed changes. Other contributors and users may chime in, but ultimately the decision is made by the maintainer(s). You may be asked to make some changes to your pull request, if so, add more commits to your branch and push them – they’ll automatically go into the existing pull request. If your pull request is merged – great! If it is not, no sweat, it may not be what the project maintainer had in mind, or they were already working on it. This happens, so our recommendation is to take any feedback you’ve received and go forth and pull request again – or create your own open source project. ================================================ FILE: LICENSE ================================================ The MIT License (MIT) Copyright (c) 2014 Ramotion Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: Package.swift ================================================ // swift-tools-version:5.1 // // Package.swift // // Copyright (c) Ramotion Inc. (https://www.ramotion.com/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // import PackageDescription let package = Package( name: "RAMAnimatedTabBarController", platforms: [ .iOS(.v9) ], products: [ .library(name: "RAMAnimatedTabBarController", targets: ["RAMAnimatedTabBarController"]), ], targets: [ .target(name: "RAMAnimatedTabBarController", path: "RAMAnimatedTabBarController") ], swiftLanguageVersions: [.v5] ) ================================================ FILE: RAMAnimatedTabBarController/Animations/BounceAnimation/RAMBounceAnimation.swift ================================================ // RAMBounceAnimation.swift // // Copyright (c) 11/10/14 Ramotion Inc. (http://ramotion.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import UIKit /// The RAMBounceAnimation class provides bounce animation. open class RAMBounceAnimation: RAMItemAnimation { /** Start animation, method call when UITabBarItem is selected - parameter icon: animating UITabBarItem icon - parameter textLabel: animating UITabBarItem textLabel */ open override func playAnimation(_ icon: UIImageView, textLabel: UILabel) { playBounceAnimation(icon) textLabel.textColor = textSelectedColor } /** Start animation, method call when UITabBarItem is unselected - parameter icon: animating UITabBarItem icon - parameter textLabel: animating UITabBarItem textLabel - parameter defaultTextColor: default UITabBarItem text color - parameter defaultIconColor: default UITabBarItem icon color */ open override func deselectAnimation(_ icon: UIImageView, textLabel: UILabel, defaultTextColor: UIColor, defaultIconColor: UIColor) { textLabel.textColor = defaultTextColor if let iconImage = icon.image { let renderMode = defaultIconColor.cgColor.alpha == 0 ? UIImage.RenderingMode.alwaysOriginal : UIImage.RenderingMode.alwaysTemplate let renderImage = iconImage.withRenderingMode(renderMode) icon.image = renderImage icon.tintColor = defaultIconColor } } /** Method call when TabBarController did load - parameter icon: animating UITabBarItem icon - parameter textLabel: animating UITabBarItem textLabel */ open override func selectedState(_ icon: UIImageView, textLabel: UILabel) { textLabel.textColor = textSelectedColor if let iconImage = icon.image { let renderImage = iconImage.withRenderingMode(.alwaysTemplate) icon.image = renderImage icon.tintColor = iconSelectedColor } } func playBounceAnimation(_ icon: UIImageView) { let bounceAnimation = CAKeyframeAnimation(keyPath: Constants.AnimationKeys.scale) bounceAnimation.values = [1.0, 1.4, 0.9, 1.15, 0.95, 1.02, 1.0] bounceAnimation.duration = TimeInterval(duration) bounceAnimation.calculationMode = CAAnimationCalculationMode.cubic icon.layer.add(bounceAnimation, forKey: nil) if let iconImage = icon.image { let renderImage = iconImage.withRenderingMode(.alwaysTemplate) icon.image = renderImage icon.tintColor = iconSelectedColor } } } ================================================ FILE: RAMAnimatedTabBarController/Animations/FrameAnimation/RAMFrameItemAnimation.swift ================================================ // RAMFrameItemAnimation.swift // // Copyright (c) 11/10/14 Ramotion Inc. (http://ramotion.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import QuartzCore import UIKit /// The RAMFrameItemAnimation class provides keyframe animation. open class RAMFrameItemAnimation: RAMItemAnimation { @nonobjc fileprivate var animationImages: Array = Array() var selectedImage: UIImage! /// A Boolean value indicated plaing revers animation when UITabBarItem unselected, if false image change immediately, defalut value true @IBInspectable open var isDeselectAnimation: Bool = true /// path to array of image names from plist file @IBInspectable open var imagesPath: String! open override func awakeFromNib() { guard let path = Bundle.main.path(forResource: imagesPath, ofType: "plist") else { fatalError("don't found plist") } guard case let animationImagesName as [String] = NSArray(contentsOfFile: path) else { fatalError() } createImagesArray(animationImagesName) // selected image let selectedImageName = animationImagesName[animationImagesName.endIndex - 1] selectedImage = UIImage(named: selectedImageName) } func createImagesArray(_ imageNames: Array) { for name: String in imageNames { if let image = UIImage(named: name)?.cgImage { animationImages.append(image) } } } // MARK: public /** Set images for keyframe animation - parameter images: images for keyframe animation */ open func setAnimationImages(_ images: Array) { var animationImages = Array() for image in images { if let cgImage = image.cgImage { animationImages.append(cgImage) } } self.animationImages = animationImages } // MARK: RAMItemAnimationProtocol /** Start animation, method call when UITabBarItem is selected - parameter icon: animating UITabBarItem icon - parameter textLabel: animating UITabBarItem textLabel */ open override func playAnimation(_ icon: UIImageView, textLabel: UILabel) { playFrameAnimation(icon, images: animationImages) textLabel.textColor = textSelectedColor } /** Start animation, method call when UITabBarItem is unselected - parameter icon: animating UITabBarItem icon - parameter textLabel: animating UITabBarItem textLabel - parameter defaultTextColor: default UITabBarItem text color - parameter defaultIconColor: default UITabBarItem icon color */ open override func deselectAnimation(_ icon: UIImageView, textLabel: UILabel, defaultTextColor: UIColor, defaultIconColor _: UIColor) { if isDeselectAnimation { playFrameAnimation(icon, images: animationImages.reversed()) } textLabel.textColor = defaultTextColor } /** Method call when TabBarController did load - parameter icon: animating UITabBarItem icon - parameter textLabel: animating UITabBarItem textLabel */ open override func selectedState(_ icon: UIImageView, textLabel: UILabel) { icon.image = selectedImage textLabel.textColor = textSelectedColor } @nonobjc func playFrameAnimation(_ icon: UIImageView, images: Array) { let frameAnimation = CAKeyframeAnimation(keyPath: Constants.AnimationKeys.keyFrame) frameAnimation.calculationMode = CAAnimationCalculationMode.discrete frameAnimation.duration = TimeInterval(duration) frameAnimation.values = images frameAnimation.repeatCount = 1 frameAnimation.isRemovedOnCompletion = false frameAnimation.fillMode = CAMediaTimingFillMode.forwards icon.layer.add(frameAnimation, forKey: nil) } } ================================================ FILE: RAMAnimatedTabBarController/Animations/FumeAnimation/RAMFumeAnimation.swift ================================================ // RAMFumeAnimation.swift // // Copyright (c) 12/2/14 Ramotion Inc. (http://ramotion.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import UIKit /// The RAMFumeAnimation class provides bounce animation. open class RAMFumeAnimation: RAMItemAnimation { /** Start animation, method call when UITabBarItem is selected - parameter icon: animating UITabBarItem icon - parameter textLabel: animating UITabBarItem textLabel */ open override func playAnimation(_ icon: UIImageView, textLabel: UILabel) { playMoveIconAnimation(icon, values: [icon.center.y as AnyObject, (icon.center.y + 4.0) as AnyObject]) playLabelAnimation(textLabel) textLabel.textColor = textSelectedColor if let iconImage = icon.image { let renderImage = iconImage.withRenderingMode(.alwaysTemplate) icon.image = renderImage icon.tintColor = iconSelectedColor } } /** Start animation, method call when UITabBarItem is unselected - parameter icon: animating UITabBarItem icon - parameter textLabel: animating UITabBarItem textLabel - parameter defaultTextColor: default UITabBarItem text color - parameter defaultIconColor: default UITabBarItem icon color */ open override func deselectAnimation(_ icon: UIImageView, textLabel: UILabel, defaultTextColor: UIColor, defaultIconColor: UIColor) { playMoveIconAnimation(icon, values: [(icon.center.y + 4.0) as AnyObject, icon.center.y as AnyObject]) playDeselectLabelAnimation(textLabel) textLabel.textColor = defaultTextColor if let iconImage = icon.image { let renderMode = defaultIconColor.cgColor.alpha == 0 ? UIImage.RenderingMode.alwaysOriginal : UIImage.RenderingMode.alwaysTemplate let renderImage = iconImage.withRenderingMode(renderMode) icon.image = renderImage icon.tintColor = defaultIconColor } } /** Method call when TabBarController did load - parameter icon: animating UITabBarItem icon - parameter textLabel: animating UITabBarItem textLabel */ open override func selectedState(_ icon: UIImageView, textLabel: UILabel) { playMoveIconAnimation(icon, values: [(icon.center.y + 12.0) as AnyObject]) textLabel.alpha = 0 textLabel.textColor = textSelectedColor if let iconImage = icon.image { let renderImage = iconImage.withRenderingMode(.alwaysTemplate) icon.image = renderImage icon.tintColor = iconSelectedColor } } func playMoveIconAnimation(_ icon: UIImageView, values: [AnyObject]) { let yPositionAnimation = createAnimation(Constants.AnimationKeys.positionY, values: values, duration: duration / 2) icon.layer.add(yPositionAnimation, forKey: nil) } // MARK: select animation func playLabelAnimation(_ textLabel: UILabel) { let yPositionAnimation = createAnimation(Constants.AnimationKeys.positionY, values: [textLabel.center.y as AnyObject, (textLabel.center.y - 60.0) as AnyObject], duration: duration) yPositionAnimation.fillMode = CAMediaTimingFillMode.removed yPositionAnimation.isRemovedOnCompletion = true textLabel.layer.add(yPositionAnimation, forKey: nil) let scaleAnimation = createAnimation(Constants.AnimationKeys.scale, values: [1.0 as AnyObject, 2.0 as AnyObject], duration: duration) scaleAnimation.fillMode = CAMediaTimingFillMode.removed scaleAnimation.isRemovedOnCompletion = true textLabel.layer.add(scaleAnimation, forKey: nil) let opacityAnimation = createAnimation(Constants.AnimationKeys.opacity, values: [1.0 as AnyObject, 0.0 as AnyObject], duration: duration) textLabel.layer.add(opacityAnimation, forKey: nil) } func createAnimation(_ keyPath: String, values: [AnyObject], duration: CGFloat) -> CAKeyframeAnimation { let animation = CAKeyframeAnimation(keyPath: keyPath) animation.values = values animation.duration = TimeInterval(duration) animation.calculationMode = CAAnimationCalculationMode.cubic animation.fillMode = CAMediaTimingFillMode.forwards animation.isRemovedOnCompletion = false return animation } // MARK: deselect animation func playDeselectLabelAnimation(_ textLabel: UILabel) { let yPositionAnimation = createAnimation(Constants.AnimationKeys.positionY, values: [(textLabel.center.y + 15) as AnyObject, textLabel.center.y as AnyObject], duration: duration) textLabel.layer.add(yPositionAnimation, forKey: nil) let opacityAnimation = createAnimation(Constants.AnimationKeys.opacity, values: [0 as AnyObject, 1 as AnyObject], duration: duration) textLabel.layer.add(opacityAnimation, forKey: nil) } } ================================================ FILE: RAMAnimatedTabBarController/Animations/RotationAnimation/RAMRotationAnimation.swift ================================================ // RAMRotationAnimation.swift // // Copyright (c) 11/10/14 Ramotion Inc. (http://ramotion.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import QuartzCore import UIKit /// The RAMRotationAnimation class provides rotation animation. open class RAMRotationAnimation: RAMItemAnimation { /** Animation direction - Left: left direction - Right: right direction */ public enum RAMRotationDirection { case left case right } /// Animation direction (left, right) open var direction: RAMRotationDirection! /** Start animation, method call when UITabBarItem is selected - parameter icon: animating UITabBarItem icon - parameter textLabel: animating UITabBarItem textLabel */ open override func playAnimation(_ icon: UIImageView, textLabel: UILabel) { playRoatationAnimation(icon) textLabel.textColor = textSelectedColor } /** Start animation, method call when UITabBarItem is unselected - parameter icon: animating UITabBarItem icon - parameter textLabel: animating UITabBarItem textLabel - parameter defaultTextColor: default UITabBarItem text color - parameter defaultIconColor: default UITabBarItem icon color */ open override func deselectAnimation(_ icon: UIImageView, textLabel: UILabel, defaultTextColor: UIColor, defaultIconColor: UIColor) { textLabel.textColor = defaultTextColor if let iconImage = icon.image { let renderMode = defaultIconColor.cgColor.alpha == 0 ? UIImage.RenderingMode.alwaysOriginal : UIImage.RenderingMode.alwaysTemplate let renderImage = iconImage.withRenderingMode(renderMode) icon.image = renderImage icon.tintColor = defaultIconColor } } /** Method call when TabBarController did load - parameter icon: animating UITabBarItem icon - parameter textLabel: animating UITabBarItem textLabel */ open override func selectedState(_ icon: UIImageView, textLabel: UILabel) { textLabel.textColor = textSelectedColor if let iconImage = icon.image { let renderImage = iconImage.withRenderingMode(.alwaysTemplate) icon.image = renderImage icon.tintColor = iconSelectedColor } } func playRoatationAnimation(_ icon: UIImageView) { let rotateAnimation = CABasicAnimation(keyPath: Constants.AnimationKeys.rotation) rotateAnimation.fromValue = 0.0 var toValue = CGFloat.pi * 2 if direction != nil && direction == RAMRotationDirection.left { toValue = toValue * -1.0 } rotateAnimation.toValue = toValue rotateAnimation.duration = TimeInterval(duration) icon.layer.add(rotateAnimation, forKey: nil) if let iconImage = icon.image { let renderImage = iconImage.withRenderingMode(.alwaysTemplate) icon.image = renderImage icon.tintColor = iconSelectedColor } } } /// The RAMLeftRotationAnimation class provides letf rotation animation. open class RAMLeftRotationAnimation: RAMRotationAnimation { public override init() { super.init() direction = RAMRotationDirection.left } } /// The RAMRightRotationAnimation class provides rigth rotation animation. open class RAMRightRotationAnimation: RAMRotationAnimation { public override init() { super.init() direction = RAMRotationDirection.right } } ================================================ FILE: RAMAnimatedTabBarController/Animations/TransitionAniamtions/RAMTransitionItemAnimations.swift ================================================ // RAMTransitionItemAnimations.swift // // Copyright (c) 11/10/14 Ramotion Inc. (http://ramotion.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import UIKit /// Transition animtion open class RAMTransitionItemAnimations: RAMItemAnimation { /// Options for animating. Default TransitionNone open var transitionOptions: UIView.AnimationOptions! override init() { super.init() transitionOptions = UIView.AnimationOptions() } /** Start animation, method call when UITabBarItem is selected - parameter icon: animating UITabBarItem icon - parameter textLabel: animating UITabBarItem textLabel */ open override func playAnimation(_ icon: UIImageView, textLabel: UILabel) { selectedColor(icon, textLabel: textLabel) UIView.transition(with: icon, duration: TimeInterval(duration), options: transitionOptions, animations: { }, completion: { _ in }) } /** Start animation, method call when UITabBarItem is unselected - parameter icon: animating UITabBarItem icon - parameter textLabel: animating UITabBarItem textLabel - parameter defaultTextColor: default UITabBarItem text color - parameter defaultIconColor: default UITabBarItem icon color */ open override func deselectAnimation(_ icon: UIImageView, textLabel: UILabel, defaultTextColor: UIColor, defaultIconColor: UIColor) { if let iconImage = icon.image { let renderMode = defaultIconColor.cgColor.alpha == 0 ? UIImage.RenderingMode.alwaysOriginal : UIImage.RenderingMode.alwaysTemplate let renderImage = iconImage.withRenderingMode(renderMode) icon.image = renderImage icon.tintColor = defaultIconColor } textLabel.textColor = defaultTextColor } /** Method call when TabBarController did load - parameter icon: animating UITabBarItem icon - parameter textLabel: animating UITabBarItem textLabel */ open override func selectedState(_ icon: UIImageView, textLabel: UILabel) { selectedColor(icon, textLabel: textLabel) } func selectedColor(_ icon: UIImageView, textLabel: UILabel) { if let iconImage = icon.image, iconSelectedColor != nil { let renderImage = iconImage.withRenderingMode(.alwaysTemplate) icon.image = renderImage icon.tintColor = iconSelectedColor } textLabel.textColor = textSelectedColor } } open class RAMFlipLeftTransitionItemAnimations: RAMTransitionItemAnimations { public override init() { super.init() transitionOptions = UIView.AnimationOptions.transitionFlipFromLeft } } open class RAMFlipRightTransitionItemAnimations: RAMTransitionItemAnimations { public override init() { super.init() transitionOptions = UIView.AnimationOptions.transitionFlipFromRight } } open class RAMFlipTopTransitionItemAnimations: RAMTransitionItemAnimations { public override init() { super.init() transitionOptions = UIView.AnimationOptions.transitionFlipFromTop } } open class RAMFlipBottomTransitionItemAnimations: RAMTransitionItemAnimations { public override init() { super.init() transitionOptions = UIView.AnimationOptions.transitionFlipFromBottom } } ================================================ FILE: RAMAnimatedTabBarController/BottomLine/RAMAnimatedTabBarController+BottomLine.swift ================================================ // Copyright (c) 03/05/2018. Ramotion Inc. (http://ramotion.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import Foundation import UIKit extension RAMAnimatedTabBarController { func createBottomLine() { guard let currentItem = containers.first else { return } let container = UIView() container.backgroundColor = .clear container.translatesAutoresizingMaskIntoConstraints = false view.addSubview(container) container.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true container.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true container.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true container.heightAnchor.constraint(equalToConstant: bottomLineHeight).isActive = true let line = UIView() line.backgroundColor = bottomLineColor line.translatesAutoresizingMaskIntoConstraints = false container.addSubview(line) bottomLine = line lineLeadingConstraint = bottomLine?.leadingAnchor.constraint(equalTo: currentItem.leadingAnchor) lineLeadingConstraint?.isActive = true lineHeightConstraint = bottomLine?.heightAnchor.constraint(equalToConstant: bottomLineHeight) lineHeightConstraint?.isActive = true // add constraints bottomLine?.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true bottomLine?.widthAnchor.constraint(equalTo: currentItem.widthAnchor).isActive = true } func removeBottomLine() { guard let bottomLine = self.bottomLine else { return } bottomLine.superview?.removeFromSuperview() self.bottomLine = nil lineLeadingConstraint?.isActive = false lineLeadingConstraint = nil } func setBottomLinePosition(index: Int, animated: Bool = true) { guard let itemsCount = tabBar.items?.count, itemsCount > index, let currentItem = containers.at(index) else { return } lineLeadingConstraint?.isActive = false lineLeadingConstraint = bottomLine?.leadingAnchor.constraint(equalTo: currentItem.leadingAnchor) lineLeadingConstraint?.isActive = true if animated { UIView.animate(withDuration: bottomLineMoveDuration) { self.bottomLine?.superview?.layoutIfNeeded() } } else { self.bottomLine?.superview?.layoutIfNeeded() } } func updateBottomLineHeight(to height: CGFloat) { lineHeightConstraint?.isActive = false lineHeightConstraint = bottomLine?.heightAnchor.constraint(equalToConstant: height) lineHeightConstraint?.isActive = true } } ================================================ FILE: RAMAnimatedTabBarController/RAMAnimatedTabBarController.swift ================================================ // RAMAnimatedTabBarController.swift // // Copyright (c) 11/10/14 Ramotion Inc. (http://ramotion.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import UIKit /// UITabBarController with item animations open class RAMAnimatedTabBarController: UITabBarController { /** The animated items displayed by the tab bar. **/ open var animatedItems: [RAMAnimatedTabBarItem] { return tabBar.items as? [RAMAnimatedTabBarItem] ?? [] } /** Show bottom line for indicating selected item, default value is false **/ open var isBottomLineShow: Bool = false { didSet { if isBottomLineShow { if bottomLine == nil { createBottomLine() } } else { if bottomLine != nil { removeBottomLine() } } } } /** Bottom line color **/ open var bottomLineColor: UIColor = .black { didSet { bottomLine?.backgroundColor = bottomLineColor } } /** Bottom line height **/ open var bottomLineHeight: CGFloat = 2 { didSet { if bottomLineHeight > 0 { updateBottomLineHeight(to: bottomLineHeight) } } } /** Bottom line time of animations duration **/ open var bottomLineMoveDuration: TimeInterval = 0.3 private(set) var containers: [UIView] = [] open override var viewControllers: [UIViewController]? { didSet { initializeContainers() } } open override func setViewControllers(_ viewControllers: [UIViewController]?, animated: Bool) { super.setViewControllers(viewControllers, animated: animated) initializeContainers() } open override var selectedIndex: Int { didSet { self.setBottomLinePosition(index: selectedIndex) } } open override var selectedViewController: UIViewController? { willSet { guard let vc = newValue, let index = viewControllers?.firstIndex(of: vc) else { return } handleSelection(index: index) } } var lineHeightConstraint: NSLayoutConstraint? var lineLeadingConstraint: NSLayoutConstraint? var bottomLine: UIView? var arrBottomAnchor:[NSLayoutConstraint] = [] var arrViews: [UIView] = [] /** Hide UITabBar - parameter isHidden: A Boolean indicating whether the UITabBarController is displayed */ @available(*, deprecated, message: "Now you can use UITabBar isHidden") open func animationTabBarHidden(_ isHidden: Bool) { tabBar.isHidden = isHidden } // MARK: life circle open override func viewDidLoad() { super.viewDidLoad() initializeContainers() } override open func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { coordinator.animate(alongsideTransition: { (transitionCoordinatorContext) -> Void in self.layoutContainers() }, completion: { (transitionCoordinatorContext) -> Void in //refresh view once rotation is completed not in will transition as it returns incorrect frame size.Refresh here }) super.viewWillTransition(to: size, with: coordinator) } // MARK: create methods private func initializeContainers() { containers.forEach { $0.removeFromSuperview() } containers.removeAll() guard let items = tabBar.items else { return } guard items.count <= 5 else { fatalError("More button not supported") } for index in 0 ..< items.count { let viewContainer = UIView() viewContainer.isExclusiveTouch = true viewContainer.tag = index let tapGesture = UITapGestureRecognizer(target: self, action: #selector(itemTap)) viewContainer.addGestureRecognizer(tapGesture) tabBar.addSubview(viewContainer) containers.append(viewContainer) } if !containers.isEmpty { createCustomIcons(containers: containers) } layoutContainers() } private func layoutContainers() { let itemWidth = tabBar.bounds.width / CGFloat(containers.count) let isRTL = tabBar.userInterfaceLayoutDirection == .rightToLeft for (index, container) in containers.enumerated() { let i = isRTL ? (containers.count - 1 - index) : index let frame = CGRect(x: itemWidth * CGFloat(i), y: 0, width: itemWidth, height: Theme.tabBarHeight) container.frame = frame if let item = tabBar.items?.at(index) as? RAMAnimatedTabBarItem { let iconView = item.iconView?.icon let iconSize = iconView?.image?.size ?? CGSize(width: 30, height: 30) let iconX = (container.frame.width - iconSize.width) / 2 + item.titlePositionAdjustment.horizontal let iconY = (container.frame.height - iconSize.height) / 2 + Theme.defaultIconVerticalOffset + item.titlePositionAdjustment.vertical iconView?.frame = CGRect(x: iconX, y: iconY, width: iconSize.width, height: iconSize.height) let label = item.iconView?.textLabel let labelSize = label?.sizeThatFits(CGSize.zero) ?? CGSize(width: tabBar.frame.size.width / CGFloat(containers.count), height: 20) let labelX = (container.frame.width - labelSize.width) / 2 + item.titlePositionAdjustment.horizontal let labelY = (container.frame.height) / 2 + Theme.defaultTitleVerticalOffset + item.titlePositionAdjustment.vertical label?.frame = CGRect(x: labelX, y: labelY, width: labelSize.width, height: labelSize.height) } } } private func createCustomIcons(containers: [UIView]) { guard let items = tabBar.items as? [RAMAnimatedTabBarItem] else { fatalError("items must inherit RAMAnimatedTabBarItem") } for (index, item) in items.enumerated() { let container = containers[index] let renderMode = item.iconColor.cgColor.alpha == 0 ? UIImage.RenderingMode.alwaysOriginal : UIImage.RenderingMode.alwaysTemplate let iconImage = item.image ?? item.iconView?.icon.image let icon = UIImageView(image: iconImage?.withRenderingMode(renderMode)) icon.tintColor = item.iconColor icon.highlightedImage = item.selectedImage?.withRenderingMode(renderMode) container.addSubview(icon) let textLabel = UILabel() if let title = item.title, !title.isEmpty { textLabel.text = title } else { textLabel.text = item.iconView?.textLabel.text } textLabel.backgroundColor = UIColor.clear textLabel.textColor = item.textColor textLabel.font = UIFont.systemFont(ofSize: item.textFontSize) textLabel.textAlignment = NSTextAlignment.center container.addSubview(textLabel) container.backgroundColor = (items as [RAMAnimatedTabBarItem])[index].bgDefaultColor if item.isEnabled == false { icon.alpha = 0.5 textLabel.alpha = 0.5 } item.iconView = (icon: icon, textLabel: textLabel) if 0 == index { // selected first elemet item.selectedState() container.backgroundColor = (items as [RAMAnimatedTabBarItem])[index].bgSelectedColor } else { item.deselectedState() container.backgroundColor = (items as [RAMAnimatedTabBarItem])[index].bgDefaultColor } item.image = nil item.title = "" } } // MARK: actions @objc private func itemTap(gesture: UITapGestureRecognizer) { guard let index = gesture.view?.tag else { return } handleSelection(index: index) } private func handleSelection(index: Int) { guard let items = tabBar.items as? [RAMAnimatedTabBarItem] else { return } let currentIndex = index if items[currentIndex].isEnabled == false { return } let controller = children[currentIndex] if let shouldSelect = delegate?.tabBarController?(self, shouldSelect: controller) , !shouldSelect { return } if selectedIndex != currentIndex { let previousItem = items.at(selectedIndex) let previousContainer: UIView? = previousItem?.iconView?.icon.superview previousContainer?.backgroundColor = items[selectedIndex].bgDefaultColor previousItem?.deselectAnimation() let currentItem: RAMAnimatedTabBarItem = items[currentIndex] currentItem.playAnimation() let currentContainer: UIView? = currentItem.iconView?.icon.superview currentContainer?.backgroundColor = items[currentIndex].bgSelectedColor selectedIndex = index } else { if let navVC = viewControllers?[selectedIndex] as? UINavigationController { navVC.popToRootViewController(animated: true) } } delegate?.tabBarController?(self, didSelect: controller) } } extension RAMAnimatedTabBarController { /** Change selected color for each UITabBarItem - parameter textSelectedColor: set new color for text - parameter iconSelectedColor: set new color for icon */ open func changeSelectedColor(_ textSelectedColor: UIColor, iconSelectedColor: UIColor) { let items = tabBar.items as! [RAMAnimatedTabBarItem] for index in 0 ..< items.count { let item = items[index] item.animation.textSelectedColor = textSelectedColor item.animation.iconSelectedColor = iconSelectedColor if item == tabBar.selectedItem { item.selectedState() } } } /** Selected UITabBarItem with animaton - parameter from: Index for unselected animation - parameter to: Index for selected animation */ open func setSelectIndex(from: Int, to: Int) { selectedIndex = to guard let items = tabBar.items as? [RAMAnimatedTabBarItem] else { fatalError("items must inherit RAMAnimatedTabBarItem") } let containerFrom = items[from].iconView?.icon.superview containerFrom?.backgroundColor = items[from].bgDefaultColor items[from].deselectAnimation() let containerTo = items[to].iconView?.icon.superview containerTo?.backgroundColor = items[to].bgSelectedColor items[to].playAnimation() } } extension RAMAnimatedTabBarController { enum Theme { public static let tabBarHeight: CGFloat = 49 public static let defaultTitleVerticalOffset: CGFloat = 10 public static let defaultIconVerticalOffset: CGFloat = -5 } } extension UIView { var userInterfaceLayoutDirection: UIUserInterfaceLayoutDirection { return UIView.userInterfaceLayoutDirection(for: self.semanticContentAttribute) } } ================================================ FILE: RAMAnimatedTabBarController/RAMAnimatedTabBarItem.swift ================================================ // RAMAnimatedTabBarItem.swift // // Copyright (c) 11/10/14 Ramotion Inc. (http://ramotion.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import Foundation import UIKit /// UITabBarItem with animation open class RAMAnimatedTabBarItem: UITabBarItem { open override var isEnabled: Bool { didSet { iconView?.icon.alpha = isEnabled == true ? 1 : 0.5 iconView?.textLabel.alpha = isEnabled == true ? 1 : 0.5 } } /// Animation for UITabBarItem. Use RAMFumeAnimation, RAMBounceAnimation, RAMRotationAnimation, RAMFrameItemAnimation, RAMTransitionAnimation /// Also posible create custom anmation inherit from the RAMItemAnimation look for https://github.com/Ramotion/animated-tab-bar#creating-custom-animations @IBOutlet open var animation: RAMItemAnimation! /// The font used to render the UITabBarItem text. @IBInspectable open var textFontSize: CGFloat = 10 /// The color of the UITabBarItem text. @IBInspectable open var textColor: UIColor = #colorLiteral(red: 0.5079551811, green: 0.5472556715, blue: 0.6011400746, alpha: 1) /// The tint color of the UITabBarItem icon. @IBInspectable open var iconColor: UIColor = UIColor.clear // if alpha color is 0 color ignoring open var bgDefaultColor: UIColor = UIColor.clear // background color open var bgSelectedColor: UIColor = UIColor.clear // The current badge value open var badge: RAMBadge? // use badgeValue to show badge // Container for icon and text in UITableItem. open var iconView: (icon: UIImageView, textLabel: UILabel)? /** Start selected animation */ open func playAnimation() { assert(animation != nil, "add animation in UITabBarItem") guard animation != nil, let iconView = iconView else { return } animation.playAnimation(iconView.icon, textLabel: iconView.textLabel) } /** Start unselected animation */ open func deselectAnimation() { guard animation != nil && iconView != nil else { return } animation.deselectAnimation( iconView!.icon, textLabel: iconView!.textLabel, defaultTextColor: textColor, defaultIconColor: iconColor) } /** Set selected state without animation */ open func selectedState() { guard animation != nil, let iconView = iconView else { return } animation.selectedState(iconView.icon, textLabel: iconView.textLabel) } /** Set deselected state without animation */ open func deselectedState() { guard animation != nil && iconView != nil else { return } animation.deselectedState(iconView!.icon, textLabel: iconView!.textLabel) } } // MARK: Custom Badge extension RAMAnimatedTabBarItem { /// The current badge value open override var badgeValue: String? { get { return badge?.text } set(newValue) { if newValue == nil { badge?.removeFromSuperview() badge = nil return } if let iconView = iconView, let contanerView = iconView.icon.superview, badge == nil { badge = RAMBadge.badge() badge?.addBadgeOnView(contanerView) } badge?.text = newValue } } } ================================================ FILE: RAMAnimatedTabBarController/RAMBadge/RAMBadge.swift ================================================ // RAMBadge.swift // // Copyright (c) 17/12/15 Ramotion Inc. (http://ramotion.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE import UIKit open class RAMBadge: UILabel { internal var topConstraint: NSLayoutConstraint? internal var centerXConstraint: NSLayoutConstraint? open class func badge() -> RAMBadge { return RAMBadge(frame: CGRect(x: 0, y: 0, width: 18, height: 18)) } public override init(frame: CGRect) { super.init(frame: frame) layer.backgroundColor = UIColor.red.cgColor layer.cornerRadius = frame.size.width / 2 configureNumberLabel() translatesAutoresizingMaskIntoConstraints = false // constraints createSizeConstraints(frame.size) } open override var intrinsicContentSize: CGSize { var contentSize = super.intrinsicContentSize contentSize.width += 10.0 return contentSize } public required init?(coder _: NSCoder) { fatalError("init(coder:) has not been implemented") } // PRAGMA: create internal func createSizeConstraints(_ size: CGSize) { let widthConstraint = NSLayoutConstraint( item: self, attribute: .width, relatedBy: .greaterThanOrEqual, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: size.width) addConstraint(widthConstraint) let heightConstraint = NSLayoutConstraint( item: self, attribute: .height, relatedBy: .equal, toItem: nil, attribute: NSLayoutConstraint.Attribute.notAnAttribute, multiplier: 1, constant: size.height) addConstraint(heightConstraint) } fileprivate func configureNumberLabel() { textAlignment = .center font = .systemFont(ofSize: 13) textColor = .white } // PRAGMA: public open func addBadgeOnView(_ onView: UIView) { onView.addSubview(self) // create constraints let top = NSLayoutConstraint(item: self, attribute: .top, relatedBy: .equal, toItem: onView, attribute: .top, multiplier: 1, constant: 3) onView.addConstraint(top) topConstraint = top let centerX = NSLayoutConstraint(item: self, attribute: .centerX, relatedBy: .equal, toItem: onView, attribute: .centerX, multiplier: 1, constant: 10) onView.addConstraint(centerX) centerXConstraint = centerX } } ================================================ FILE: RAMAnimatedTabBarController/RAMItemAnimationProtocol.swift ================================================ // RAMItemAnimationProtocol.swift // // Copyright (c) 11/10/14 Ramotion Inc. (http://ramotion.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import Foundation import UIKit public protocol RAMItemAnimationProtocol { func playAnimation(_ icon: UIImageView, textLabel: UILabel) func deselectAnimation(_ icon: UIImageView, textLabel: UILabel, defaultTextColor: UIColor, defaultIconColor: UIColor) func selectedState(_ icon: UIImageView, textLabel: UILabel) } /// Base class for UITabBarItems animation open class RAMItemAnimation: NSObject, RAMItemAnimationProtocol { // MARK: constants struct Constants { struct AnimationKeys { static let scale = "transform.scale" static let rotation = "transform.rotation" static let keyFrame = "contents" static let positionY = "position.y" static let opacity = "opacity" } } // MARK: properties /// The duration of the animation @IBInspectable open var duration: CGFloat = 0.5 /// The text color in selected state. @IBInspectable open var textSelectedColor: UIColor = UIColor(red: 0, green: 0.478431, blue: 1, alpha: 1) /// The icon color in selected state. @IBInspectable open var iconSelectedColor: UIColor! /** Start animation, method call when UITabBarItem is selected - parameter icon: animating UITabBarItem icon - parameter textLabel: animating UITabBarItem textLabel */ open func playAnimation(_: UIImageView, textLabel _: UILabel) { fatalError("override method in subclass") } /** Start animation, method call when UITabBarItem is unselected - parameter icon: animating UITabBarItem icon - parameter textLabel: animating UITabBarItem textLabel - parameter defaultTextColor: default UITabBarItem text color - parameter defaultIconColor: default UITabBarItem icon color */ open func deselectAnimation(_: UIImageView, textLabel _: UILabel, defaultTextColor _: UIColor, defaultIconColor _: UIColor) { fatalError("override method in subclass") } /** Method call when TabBarController did load - parameter icon: animating UITabBarItem icon - parameter textLabel: animating UITabBarItem textLabel */ open func selectedState(_: UIImageView, textLabel _: UILabel) { fatalError("override method in subclass") } /** (Optional) Method call when TabBarController did load - parameter icon: animating UITabBarItem icon - parameter textLabel: animating UITabBarItem textLabel */ open func deselectedState(_: UIImageView, textLabel _: UILabel) {} } ================================================ FILE: RAMAnimatedTabBarController/Utilities/Collection+Extensions.swift ================================================ // Collection+Extensions.swift // // Copyright (c) 11/10/14 Ramotion Inc. (http://ramotion.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import Foundation extension Collection where Self.Index == Self.Indices.Iterator.Element { /** Returns an optional element. If the `index` does not exist in the collection, the subscript returns nil. - parameter safe: The index of the element to return, if it exists. - returns: An optional element from the collection at the specified index. */ public subscript(safe i: Index) -> Self.Iterator.Element? { return at(i) } /** Returns an optional element. If the `index` does not exist in the collection, the function returns nil. - parameter index: The index of the element to return, if it exists. - returns: An optional element from the collection at the specified index. */ public func at(_ i: Index) -> Self.Iterator.Element? { return indices.contains(i) ? self[i] : nil } } ================================================ FILE: RAMAnimatedTabBarController.podspec ================================================ Pod::Spec.new do |s| s.name = 'RAMAnimatedTabBarController' s.version = '5.2.0' s.license = 'MIT' s.summary = 'RAMAnimatedTabBarController is a Swift module for adding animation to tabbar items.' s.homepage = 'https://github.com/Ramotion/animated-tab-bar' s.authors = { 'Juri Vasylenko' => 'juri.v@ramotion.com' } s.source = { :git => 'https://github.com/Ramotion/animated-tab-bar.git', :tag => s.version.to_s } s.ios.deployment_target = '9.0' s.source_files = "RAMAnimatedTabBarController/*.swift", "RAMAnimatedTabBarController/**/*.swift" end ================================================ FILE: RAMAnimatedTabBarDemo/AnimatedTabBarTests/AnimatedTabBarTests.swift ================================================ // // AnimatedTabBarTests.swift // AnimatedTabBarTests // // Created by Alex K on 17/08/2018. // Copyright © 2018 Ramotion. All rights reserved. // import XCTest @testable import Animated_Tab_Bar class AnimatedTabBarTests: XCTestCase { var tabBarController: RAMAnimatedTabBarController! override func setUp() { super.setUp() let storyboard = UIStoryboard(name: "Main", bundle: nil) tabBarController = storyboard.instantiateViewController(withIdentifier: "RAMAnimatedTabBarController") as? RAMAnimatedTabBarController _ = tabBarController.view } override func tearDown() { super.tearDown() } func testCreateController() { XCTAssertNotNil(tabBarController) } func testIsBottomLineShowen() { XCTAssertEqual(tabBarController.bottomLine, nil) tabBarController.isBottomLineShow = true XCTAssertNotNil(tabBarController.bottomLine) tabBarController.isBottomLineShow = false XCTAssertEqual(tabBarController.bottomLine, nil) } func testChangeSelectedColor() { let selectedColor = UIColor.red let iconSelectedColor = UIColor.green tabBarController.changeSelectedColor(selectedColor, iconSelectedColor: iconSelectedColor) tabBarController.animatedItems.forEach { XCTAssertEqual($0.animation.textSelectedColor, selectedColor) XCTAssertEqual($0.animation.iconSelectedColor, iconSelectedColor) } } func testAnimationBarHidden() { XCTAssertEqual(tabBarController.tabBar.isHidden, false) tabBarController.animatedItems.forEach { XCTAssertEqual($0.iconView?.icon.superview?.isHidden, false) } tabBarController.animationTabBarHidden(true) XCTAssertEqual(tabBarController.tabBar.isHidden, true) tabBarController.animatedItems.forEach { XCTAssertEqual($0.iconView?.icon.superview?.isHidden, true) } } func testSelectIndex() { let toIndex = 2 tabBarController.setSelectIndex(from: 0, to: toIndex) XCTAssertEqual(tabBarController.selectedIndex, toIndex) } func testAnimatedItems() { XCTAssertEqual(tabBarController.viewControllers?.count, tabBarController.animatedItems.count) } func testIsBottomLineShow() { XCTAssertEqual(tabBarController.isBottomLineShow, false) XCTAssertNil(tabBarController.bottomLine) tabBarController.isBottomLineShow = true XCTAssertEqual(tabBarController.isBottomLineShow, true) XCTAssertNotNil(tabBarController.bottomLine) } func testBottomLineColor() { let color = UIColor.red tabBarController.isBottomLineShow = true XCTAssertNotEqual(tabBarController.bottomLine, color) tabBarController.bottomLineColor = color XCTAssertEqual(tabBarController.bottomLineColor, color) } func testContainersCount() { XCTAssertEqual(tabBarController.viewControllers?.count, tabBarController.containers.count) } func testBadge() { let value = "1" tabBarController.animatedItems.first?.badgeValue = value XCTAssertEqual(tabBarController.animatedItems.first?.badgeValue, tabBarController.animatedItems.first?.badge?.text) } func testIsEnabled() { guard let item = tabBarController.animatedItems.first else { return } item.isEnabled = true XCTAssertEqual(item.iconView?.icon.alpha, 1) XCTAssertEqual(item.iconView?.textLabel.alpha, 1) item.isEnabled = false XCTAssertEqual(item.iconView?.icon.alpha, 0.5) XCTAssertEqual(item.iconView?.textLabel.alpha, 0.5) } } ================================================ FILE: RAMAnimatedTabBarDemo/AnimatedTabBarTests/Info.plist ================================================ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType BNDL CFBundleShortVersionString 1.0 CFBundleVersion 1 ================================================ FILE: RAMAnimatedTabBarDemo/AnimatedTabBarTests/RAMBadgeTests.swift ================================================ import XCTest @testable import Animated_Tab_Bar class RAMBadgeTests: XCTestCase { var badge: RAMBadge! override func setUp() { badge = RAMBadge.badge() } func testCreateBadge() { XCTAssertNotNil(badge) } func testAddBadgeOnView() { let view = UIView() XCTAssertNil(badge.superview) badge.addBadgeOnView(view) XCTAssertNotNil(badge.superview) XCTAssertNotNil(badge.topConstraint) XCTAssertNotNil(badge.centerXConstraint) } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/AppDelegate.swift ================================================ // // AppDelegate.swift // RAMAnimatedTabBarDemo // // Created by Alex Kalinkin on 11/18/14. // Copyright (c) 2014 Ramotion. All rights reserved. // import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? public func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { return true } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Base.lproj/LaunchScreen.xib ================================================ ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Base.lproj/Main.storyboard ================================================ ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/AppIcon.appiconset/Contents.json ================================================ { "images" : [ { "size" : "20x20", "idiom" : "iphone", "filename" : "icon-40.png", "scale" : "2x" }, { "size" : "20x20", "idiom" : "iphone", "filename" : "icon-60.png", "scale" : "3x" }, { "size" : "29x29", "idiom" : "iphone", "filename" : "icon-58.png", "scale" : "2x" }, { "size" : "29x29", "idiom" : "iphone", "filename" : "icon-87.png", "scale" : "3x" }, { "size" : "40x40", "idiom" : "iphone", "filename" : "icon-80.png", "scale" : "2x" }, { "size" : "40x40", "idiom" : "iphone", "filename" : "icon-120.png", "scale" : "3x" }, { "size" : "60x60", "idiom" : "iphone", "filename" : "icon-120.png", "scale" : "2x" }, { "size" : "60x60", "idiom" : "iphone", "filename" : "icon-180.png", "scale" : "3x" }, { "size" : "20x20", "idiom" : "ipad", "filename" : "icon-20.png", "scale" : "1x" }, { "size" : "20x20", "idiom" : "ipad", "filename" : "icon-40.png", "scale" : "2x" }, { "size" : "29x29", "idiom" : "ipad", "filename" : "icon-29.png", "scale" : "1x" }, { "size" : "29x29", "idiom" : "ipad", "filename" : "icon-58.png", "scale" : "2x" }, { "size" : "40x40", "idiom" : "ipad", "filename" : "icon-40.png", "scale" : "1x" }, { "size" : "40x40", "idiom" : "ipad", "filename" : "icon-80.png", "scale" : "2x" }, { "size" : "76x76", "idiom" : "ipad", "filename" : "icon-76.png", "scale" : "1x" }, { "size" : "76x76", "idiom" : "ipad", "filename" : "icon-152.png", "scale" : "2x" }, { "size" : "83.5x83.5", "idiom" : "ipad", "filename" : "icon-167.png", "scale" : "2x" }, { "size" : "1024x1024", "idiom" : "ios-marketing", "filename" : "Ramotion1024.png", "scale" : "1x" } ], "info" : { "version" : 1, "author" : "xcode" }, "properties" : { "pre-rendered" : true } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Settings_icon/Settings.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Settings_00208.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Settings_00208@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Settings_00208@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00028.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00028.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00028 copy.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00028@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00029.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00029.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00029@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00029@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00030.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00030.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00030@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00030@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00031.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00031.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00031@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00031@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00032.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00032.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00032@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00032@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00033.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00033.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00033@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00033@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00034.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00034.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00034@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00034@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00035.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00035.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00035@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00035@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00036.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00036.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00036@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00036@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00037.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00037.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00037@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00037@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00038.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00038.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00038@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00038@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00039.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00039.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00039@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00039@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00040.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00040.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00040@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00040@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00041.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00041.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00041@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00041@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00042.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00042.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00042@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00042@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00043.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00043.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00043@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00043@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00044.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00044.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00044@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00044@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00045.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00045.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00045@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00045@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00046.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00046.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00046@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00046@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00047.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00047.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00047@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00047@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00048.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00048.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00048@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00048@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00049.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00049.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00049@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00049@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00050.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00050.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00050@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00050@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00051.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00051.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00051@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00051@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00052.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00052.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00052@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00052@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00053.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00053.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00053@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00053@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00054.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00054.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00054@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00054@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00055.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00055.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00055@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00055@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00056.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00056.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00056@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00056@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00057.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00057.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00057@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00057@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00058.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00058.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00058@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00058@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00059.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00059.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00059@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00059@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00060.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00060.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00060@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00060@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00061.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00061.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00061@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00061@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00062.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00062.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00062@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00062@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00063.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00063.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00063@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00063@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00064.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00064.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00064@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00064@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/Tools/Tools_00065.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "Tools_00065.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "Tools_00065@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "Tools_00065@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/drop/drop.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "drop.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "drop@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "drop@3.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/icon_pin.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "icon_pin_00160.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "icon_pin_00160@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "icon_pin_00160@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Images.xcassets/icon_user.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x", "filename" : "user_00084.png" }, { "idiom" : "universal", "scale" : "2x", "filename" : "user_00084@2x.png" }, { "idiom" : "universal", "scale" : "3x", "filename" : "user_00084@3x.png" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Info.plist ================================================ CFBundleDevelopmentRegion en CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1 LSRequiresIPhoneOS UILaunchStoryboardName LaunchScreen UIMainStoryboardFile Main UIRequiredDeviceCapabilities armv7 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UISupportedInterfaceOrientations~ipad UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/Resources/ToolsAnimation.plist ================================================ Tools_00028 Tools_00029 Tools_00030 Tools_00031 Tools_00032 Tools_00033 Tools_00034 Tools_00035 Tools_00036 Tools_00037 Tools_00038 Tools_00039 Tools_00040 Tools_00041 Tools_00042 Tools_00043 Tools_00044 Tools_00045 Tools_00046 Tools_00047 Tools_00048 Tools_00049 Tools_00050 Tools_00051 Tools_00052 Tools_00053 Tools_00054 Tools_00055 Tools_00056 Tools_00057 Tools_00058 Tools_00059 Tools_00060 Tools_00061 Tools_00062 Tools_00063 Tools_00064 Tools_00065 ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo/ViewController.swift ================================================ // // ViewController.swift // RAMAnimatedTabBarDemo // // Created by Alex Kalinkin on 11/18/14. // Copyright (c) 2014 Ramotion. All rights reserved. // import UIKit class ViewController: UIViewController { var index: NSInteger = 0 // PRAGMA: actions @IBAction func showBadgeHandelr(_: AnyObject) { // example for showing badges index += 1 tabBarItem.badgeValue = "\(index)" } @IBAction func hideBadgeHandler(_: AnyObject) { tabBarItem.badgeValue = nil } } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo.xcodeproj/project.pbxproj ================================================ // !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 3950EDD82354950E0072BAAD /* RAMAnimatedTabBarItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3950EDD72354950E0072BAAD /* RAMAnimatedTabBarItem.swift */; }; 3950EDD9235496AF0072BAAD /* RAMAnimatedTabBarItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3950EDD72354950E0072BAAD /* RAMAnimatedTabBarItem.swift */; }; 3950EDDC235497650072BAAD /* Collection+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3950EDDB235497650072BAAD /* Collection+Extensions.swift */; }; 3950EDDD235497910072BAAD /* Collection+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3950EDDB235497650072BAAD /* Collection+Extensions.swift */; }; 5A1F33BC2126AA3D004B8735 /* AnimatedTabBarTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A1F33BB2126AA3D004B8735 /* AnimatedTabBarTests.swift */; }; 5A5D3FF021B91D0700304986 /* RAMBadgeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A5D3FEF21B91D0700304986 /* RAMBadgeTests.swift */; }; 5ADAB94A209B0FA8006CCD85 /* RAMAnimatedTabBarController+BottomLine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5ADAB949209B0FA8006CCD85 /* RAMAnimatedTabBarController+BottomLine.swift */; }; 5ADAB94B209B51E5006CCD85 /* RAMAnimatedTabBarController+BottomLine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5ADAB949209B0FA8006CCD85 /* RAMAnimatedTabBarController+BottomLine.swift */; }; 849507011D05772B0005EC1A /* ToolsAnimation.plist in Resources */ = {isa = PBXBuildFile; fileRef = 849507001D05772B0005EC1A /* ToolsAnimation.plist */; }; 84BC64221C22E4C800B89B79 /* RAMBadge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84BC64211C22E4C800B89B79 /* RAMBadge.swift */; }; 84D4B7A11DB0D35500EE38C6 /* TabBarLib.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D4B79F1DB0D35500EE38C6 /* TabBarLib.h */; settings = {ATTRIBUTES = (Public, ); }; }; 84D4B7A41DB0D35500EE38C6 /* RAMAnimatedTabBarController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84D4B79D1DB0D35500EE38C6 /* RAMAnimatedTabBarController.framework */; }; 84D4B7A51DB0D35500EE38C6 /* RAMAnimatedTabBarController.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84D4B79D1DB0D35500EE38C6 /* RAMAnimatedTabBarController.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 84D4B7A91DB0D37700EE38C6 /* RAMBadge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84BC64211C22E4C800B89B79 /* RAMBadge.swift */; }; 84D4B7AA1DB0D37B00EE38C6 /* RAMAnimatedTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE90A83F1A1C7C14002D8931 /* RAMAnimatedTabBarController.swift */; }; 84D4B7AB1DB0D37F00EE38C6 /* RAMFumeAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3E056BD1A2DD57600F33DDA /* RAMFumeAnimation.swift */; }; 84D4B7AC1DB0D38100EE38C6 /* RAMBounceAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE90A8781A1CE200002D8931 /* RAMBounceAnimation.swift */; }; 84D4B7AD1DB0D38400EE38C6 /* RAMRotationAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE90A8421A1C8DD3002D8931 /* RAMRotationAnimation.swift */; }; 84D4B7AE1DB0D38700EE38C6 /* RAMFrameItemAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE41469A1A1B944D0037F03C /* RAMFrameItemAnimation.swift */; }; 84D4B7AF1DB0D38B00EE38C6 /* RAMTransitionItemAnimations.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE41469C1A1B944D0037F03C /* RAMTransitionItemAnimations.swift */; }; 84D4B7B01DB0D38F00EE38C6 /* RAMItemAnimationProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE41469D1A1B944D0037F03C /* RAMItemAnimationProtocol.swift */; }; CE4146781A1B923D0037F03C /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE4146771A1B923D0037F03C /* AppDelegate.swift */; }; CE41467A1A1B923D0037F03C /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE4146791A1B923D0037F03C /* ViewController.swift */; }; CE41467D1A1B923D0037F03C /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CE41467B1A1B923D0037F03C /* Main.storyboard */; }; CE41467F1A1B923D0037F03C /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CE41467E1A1B923D0037F03C /* Images.xcassets */; }; CE4146821A1B923D0037F03C /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE4146801A1B923D0037F03C /* LaunchScreen.xib */; }; CE41469E1A1B944D0037F03C /* RAMFrameItemAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE41469A1A1B944D0037F03C /* RAMFrameItemAnimation.swift */; }; CE41469F1A1B944D0037F03C /* RAMTransitionItemAnimations.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE41469C1A1B944D0037F03C /* RAMTransitionItemAnimations.swift */; }; CE4146A01A1B944D0037F03C /* RAMItemAnimationProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE41469D1A1B944D0037F03C /* RAMItemAnimationProtocol.swift */; }; CE90A8401A1C7C14002D8931 /* RAMAnimatedTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE90A83F1A1C7C14002D8931 /* RAMAnimatedTabBarController.swift */; }; CE90A8431A1C8DD3002D8931 /* RAMRotationAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE90A8421A1C8DD3002D8931 /* RAMRotationAnimation.swift */; }; CE90A8791A1CE200002D8931 /* RAMBounceAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE90A8781A1CE200002D8931 /* RAMBounceAnimation.swift */; }; F3E056BE1A2DD57600F33DDA /* RAMFumeAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3E056BD1A2DD57600F33DDA /* RAMFumeAnimation.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ 5A1F33BE2126AA3D004B8735 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = CE41466A1A1B923D0037F03C /* Project object */; proxyType = 1; remoteGlobalIDString = CE4146711A1B923D0037F03C; remoteInfo = RAMAnimatedTabBarDemo; }; 84D4B7A21DB0D35500EE38C6 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = CE41466A1A1B923D0037F03C /* Project object */; proxyType = 1; remoteGlobalIDString = 84D4B79C1DB0D35500EE38C6; remoteInfo = TabBarLib; }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ 8499D8F91D0069C6004B5B37 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( 84D4B7A51DB0D35500EE38C6 /* RAMAnimatedTabBarController.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 3950EDD72354950E0072BAAD /* RAMAnimatedTabBarItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RAMAnimatedTabBarItem.swift; sourceTree = ""; }; 3950EDDB235497650072BAAD /* Collection+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Collection+Extensions.swift"; sourceTree = ""; }; 5A1F33B92126AA3D004B8735 /* AnimatedTabBarTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AnimatedTabBarTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 5A1F33BB2126AA3D004B8735 /* AnimatedTabBarTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnimatedTabBarTests.swift; sourceTree = ""; }; 5A1F33BD2126AA3D004B8735 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 5A5D3FEF21B91D0700304986 /* RAMBadgeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RAMBadgeTests.swift; sourceTree = ""; }; 5ADAB949209B0FA8006CCD85 /* RAMAnimatedTabBarController+BottomLine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "RAMAnimatedTabBarController+BottomLine.swift"; sourceTree = ""; }; 849507001D05772B0005EC1A /* ToolsAnimation.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = ToolsAnimation.plist; sourceTree = ""; }; 84BC64211C22E4C800B89B79 /* RAMBadge.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RAMBadge.swift; sourceTree = ""; }; 84D4B79D1DB0D35500EE38C6 /* RAMAnimatedTabBarController.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RAMAnimatedTabBarController.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 84D4B79F1DB0D35500EE38C6 /* TabBarLib.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TabBarLib.h; sourceTree = ""; }; 84D4B7A01DB0D35500EE38C6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; CE4146721A1B923D0037F03C /* Animated Tab Bar.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Animated Tab Bar.app"; sourceTree = BUILT_PRODUCTS_DIR; }; CE4146761A1B923D0037F03C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; CE4146771A1B923D0037F03C /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; CE4146791A1B923D0037F03C /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; CE41467C1A1B923D0037F03C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; CE41467E1A1B923D0037F03C /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; CE4146811A1B923D0037F03C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; CE41469A1A1B944D0037F03C /* RAMFrameItemAnimation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RAMFrameItemAnimation.swift; sourceTree = ""; }; CE41469C1A1B944D0037F03C /* RAMTransitionItemAnimations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RAMTransitionItemAnimations.swift; sourceTree = ""; }; CE41469D1A1B944D0037F03C /* RAMItemAnimationProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RAMItemAnimationProtocol.swift; sourceTree = ""; }; CE90A83F1A1C7C14002D8931 /* RAMAnimatedTabBarController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RAMAnimatedTabBarController.swift; sourceTree = ""; }; CE90A8421A1C8DD3002D8931 /* RAMRotationAnimation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RAMRotationAnimation.swift; sourceTree = ""; }; CE90A8781A1CE200002D8931 /* RAMBounceAnimation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RAMBounceAnimation.swift; sourceTree = ""; }; F3E056BD1A2DD57600F33DDA /* RAMFumeAnimation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RAMFumeAnimation.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 5A1F33B62126AA3D004B8735 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 84D4B7991DB0D35500EE38C6 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; CE41466F1A1B923D0037F03C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 84D4B7A41DB0D35500EE38C6 /* RAMAnimatedTabBarController.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 3950EDDA2354974D0072BAAD /* Utilities */ = { isa = PBXGroup; children = ( 3950EDDB235497650072BAAD /* Collection+Extensions.swift */, ); path = Utilities; sourceTree = ""; }; 5A1F33BA2126AA3D004B8735 /* AnimatedTabBarTests */ = { isa = PBXGroup; children = ( 5A1F33BB2126AA3D004B8735 /* AnimatedTabBarTests.swift */, 5A1F33BD2126AA3D004B8735 /* Info.plist */, 5A5D3FEF21B91D0700304986 /* RAMBadgeTests.swift */, ); path = AnimatedTabBarTests; sourceTree = ""; }; 5AC42AE5210AFA110009889F /* BottomLine */ = { isa = PBXGroup; children = ( 5ADAB949209B0FA8006CCD85 /* RAMAnimatedTabBarController+BottomLine.swift */, ); path = BottomLine; sourceTree = ""; }; 84BC64201C22E41F00B89B79 /* RAMBadge */ = { isa = PBXGroup; children = ( 84BC64211C22E4C800B89B79 /* RAMBadge.swift */, ); path = RAMBadge; sourceTree = ""; }; 84D4B79E1DB0D35500EE38C6 /* TabBarLib */ = { isa = PBXGroup; children = ( 84D4B79F1DB0D35500EE38C6 /* TabBarLib.h */, 84D4B7A01DB0D35500EE38C6 /* Info.plist */, ); path = TabBarLib; sourceTree = ""; }; CE4146691A1B923D0037F03C = { isa = PBXGroup; children = ( CE4146741A1B923D0037F03C /* RAMAnimatedTabBarDemo */, 84D4B79E1DB0D35500EE38C6 /* TabBarLib */, 5A1F33BA2126AA3D004B8735 /* AnimatedTabBarTests */, CE4146731A1B923D0037F03C /* Products */, ); sourceTree = ""; }; CE4146731A1B923D0037F03C /* Products */ = { isa = PBXGroup; children = ( CE4146721A1B923D0037F03C /* Animated Tab Bar.app */, 84D4B79D1DB0D35500EE38C6 /* RAMAnimatedTabBarController.framework */, 5A1F33B92126AA3D004B8735 /* AnimatedTabBarTests.xctest */, ); name = Products; sourceTree = ""; }; CE4146741A1B923D0037F03C /* RAMAnimatedTabBarDemo */ = { isa = PBXGroup; children = ( CE90A8441A1CB1A2002D8931 /* Resources */, CE4146971A1B94170037F03C /* RAMAnimatedTabBarControlller */, CE4146771A1B923D0037F03C /* AppDelegate.swift */, CE4146791A1B923D0037F03C /* ViewController.swift */, CE41467B1A1B923D0037F03C /* Main.storyboard */, CE41467E1A1B923D0037F03C /* Images.xcassets */, CE4146801A1B923D0037F03C /* LaunchScreen.xib */, CE4146751A1B923D0037F03C /* Supporting Files */, ); path = RAMAnimatedTabBarDemo; sourceTree = ""; }; CE4146751A1B923D0037F03C /* Supporting Files */ = { isa = PBXGroup; children = ( CE4146761A1B923D0037F03C /* Info.plist */, ); name = "Supporting Files"; sourceTree = ""; }; CE4146971A1B94170037F03C /* RAMAnimatedTabBarControlller */ = { isa = PBXGroup; children = ( 3950EDDA2354974D0072BAAD /* Utilities */, 5AC42AE5210AFA110009889F /* BottomLine */, 84BC64201C22E41F00B89B79 /* RAMBadge */, CE90A83F1A1C7C14002D8931 /* RAMAnimatedTabBarController.swift */, 3950EDD72354950E0072BAAD /* RAMAnimatedTabBarItem.swift */, CE4146981A1B944D0037F03C /* Animations */, CE41469D1A1B944D0037F03C /* RAMItemAnimationProtocol.swift */, ); name = RAMAnimatedTabBarControlller; path = ../../RAMAnimatedTabBarController; sourceTree = ""; }; CE4146981A1B944D0037F03C /* Animations */ = { isa = PBXGroup; children = ( F3E056BC1A2DD37700F33DDA /* FumeAnimation */, CE90A8771A1CE171002D8931 /* BounceAnimation */, CE90A8411A1C8D69002D8931 /* RotationAnimation */, CE4146991A1B944D0037F03C /* FrameAnimation */, CE41469B1A1B944D0037F03C /* TransitionAniamtions */, ); path = Animations; sourceTree = ""; }; CE4146991A1B944D0037F03C /* FrameAnimation */ = { isa = PBXGroup; children = ( CE41469A1A1B944D0037F03C /* RAMFrameItemAnimation.swift */, ); path = FrameAnimation; sourceTree = ""; }; CE41469B1A1B944D0037F03C /* TransitionAniamtions */ = { isa = PBXGroup; children = ( CE41469C1A1B944D0037F03C /* RAMTransitionItemAnimations.swift */, ); path = TransitionAniamtions; sourceTree = ""; }; CE90A8411A1C8D69002D8931 /* RotationAnimation */ = { isa = PBXGroup; children = ( CE90A8421A1C8DD3002D8931 /* RAMRotationAnimation.swift */, ); path = RotationAnimation; sourceTree = ""; }; CE90A8441A1CB1A2002D8931 /* Resources */ = { isa = PBXGroup; children = ( 849507001D05772B0005EC1A /* ToolsAnimation.plist */, ); path = Resources; sourceTree = ""; }; CE90A8771A1CE171002D8931 /* BounceAnimation */ = { isa = PBXGroup; children = ( CE90A8781A1CE200002D8931 /* RAMBounceAnimation.swift */, ); path = BounceAnimation; sourceTree = ""; }; F3E056BC1A2DD37700F33DDA /* FumeAnimation */ = { isa = PBXGroup; children = ( F3E056BD1A2DD57600F33DDA /* RAMFumeAnimation.swift */, ); path = FumeAnimation; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ 84D4B79A1DB0D35500EE38C6 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 84D4B7A11DB0D35500EE38C6 /* TabBarLib.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ 5A1F33B82126AA3D004B8735 /* AnimatedTabBarTests */ = { isa = PBXNativeTarget; buildConfigurationList = 5A1F33C22126AA3D004B8735 /* Build configuration list for PBXNativeTarget "AnimatedTabBarTests" */; buildPhases = ( 5A1F33B52126AA3D004B8735 /* Sources */, 5A1F33B62126AA3D004B8735 /* Frameworks */, 5A1F33B72126AA3D004B8735 /* Resources */, ); buildRules = ( ); dependencies = ( 5A1F33BF2126AA3D004B8735 /* PBXTargetDependency */, ); name = AnimatedTabBarTests; productName = AnimatedTabBarTests; productReference = 5A1F33B92126AA3D004B8735 /* AnimatedTabBarTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; 84D4B79C1DB0D35500EE38C6 /* RAMAnimatedTabBarController */ = { isa = PBXNativeTarget; buildConfigurationList = 84D4B7A81DB0D35500EE38C6 /* Build configuration list for PBXNativeTarget "RAMAnimatedTabBarController" */; buildPhases = ( 84D4B7981DB0D35500EE38C6 /* Sources */, 84D4B7991DB0D35500EE38C6 /* Frameworks */, 84D4B79A1DB0D35500EE38C6 /* Headers */, 84D4B79B1DB0D35500EE38C6 /* Resources */, ); buildRules = ( ); dependencies = ( ); name = RAMAnimatedTabBarController; productName = TabBarLib; productReference = 84D4B79D1DB0D35500EE38C6 /* RAMAnimatedTabBarController.framework */; productType = "com.apple.product-type.framework"; }; CE4146711A1B923D0037F03C /* RAMAnimatedTabBarDemo */ = { isa = PBXNativeTarget; buildConfigurationList = CE4146911A1B923D0037F03C /* Build configuration list for PBXNativeTarget "RAMAnimatedTabBarDemo" */; buildPhases = ( CE41466E1A1B923D0037F03C /* Sources */, CE41466F1A1B923D0037F03C /* Frameworks */, CE4146701A1B923D0037F03C /* Resources */, 8499D8F91D0069C6004B5B37 /* Embed Frameworks */, ); buildRules = ( ); dependencies = ( 84D4B7A31DB0D35500EE38C6 /* PBXTargetDependency */, ); name = RAMAnimatedTabBarDemo; productName = RAMAnimatedTabBarDemo; productReference = CE4146721A1B923D0037F03C /* Animated Tab Bar.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ CE41466A1A1B923D0037F03C /* Project object */ = { isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0940; LastUpgradeCheck = 1020; ORGANIZATIONNAME = Ramotion; TargetAttributes = { 5A1F33B82126AA3D004B8735 = { CreatedOnToolsVersion = 9.4; LastSwiftMigration = 1020; ProvisioningStyle = Automatic; TestTargetID = CE4146711A1B923D0037F03C; }; 84D4B79C1DB0D35500EE38C6 = { CreatedOnToolsVersion = 8.0; LastSwiftMigration = 1020; ProvisioningStyle = Automatic; }; CE4146711A1B923D0037F03C = { CreatedOnToolsVersion = 6.1; LastSwiftMigration = 1020; }; }; }; buildConfigurationList = CE41466D1A1B923D0037F03C /* Build configuration list for PBXProject "RAMAnimatedTabBarDemo" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); mainGroup = CE4146691A1B923D0037F03C; productRefGroup = CE4146731A1B923D0037F03C /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( CE4146711A1B923D0037F03C /* RAMAnimatedTabBarDemo */, 84D4B79C1DB0D35500EE38C6 /* RAMAnimatedTabBarController */, 5A1F33B82126AA3D004B8735 /* AnimatedTabBarTests */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 5A1F33B72126AA3D004B8735 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 84D4B79B1DB0D35500EE38C6 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; CE4146701A1B923D0037F03C /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 849507011D05772B0005EC1A /* ToolsAnimation.plist in Resources */, CE41467D1A1B923D0037F03C /* Main.storyboard in Resources */, CE4146821A1B923D0037F03C /* LaunchScreen.xib in Resources */, CE41467F1A1B923D0037F03C /* Images.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 5A1F33B52126AA3D004B8735 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 5A5D3FF021B91D0700304986 /* RAMBadgeTests.swift in Sources */, 5A1F33BC2126AA3D004B8735 /* AnimatedTabBarTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 84D4B7981DB0D35500EE38C6 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 84D4B7A91DB0D37700EE38C6 /* RAMBadge.swift in Sources */, 84D4B7AF1DB0D38B00EE38C6 /* RAMTransitionItemAnimations.swift in Sources */, 5ADAB94B209B51E5006CCD85 /* RAMAnimatedTabBarController+BottomLine.swift in Sources */, 3950EDDD235497910072BAAD /* Collection+Extensions.swift in Sources */, 84D4B7B01DB0D38F00EE38C6 /* RAMItemAnimationProtocol.swift in Sources */, 3950EDD9235496AF0072BAAD /* RAMAnimatedTabBarItem.swift in Sources */, 84D4B7AB1DB0D37F00EE38C6 /* RAMFumeAnimation.swift in Sources */, 84D4B7AA1DB0D37B00EE38C6 /* RAMAnimatedTabBarController.swift in Sources */, 84D4B7AC1DB0D38100EE38C6 /* RAMBounceAnimation.swift in Sources */, 84D4B7AE1DB0D38700EE38C6 /* RAMFrameItemAnimation.swift in Sources */, 84D4B7AD1DB0D38400EE38C6 /* RAMRotationAnimation.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; CE41466E1A1B923D0037F03C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( CE41469E1A1B944D0037F03C /* RAMFrameItemAnimation.swift in Sources */, CE90A8401A1C7C14002D8931 /* RAMAnimatedTabBarController.swift in Sources */, CE41467A1A1B923D0037F03C /* ViewController.swift in Sources */, 5ADAB94A209B0FA8006CCD85 /* RAMAnimatedTabBarController+BottomLine.swift in Sources */, CE90A8431A1C8DD3002D8931 /* RAMRotationAnimation.swift in Sources */, F3E056BE1A2DD57600F33DDA /* RAMFumeAnimation.swift in Sources */, CE41469F1A1B944D0037F03C /* RAMTransitionItemAnimations.swift in Sources */, 3950EDDC235497650072BAAD /* Collection+Extensions.swift in Sources */, 84BC64221C22E4C800B89B79 /* RAMBadge.swift in Sources */, 3950EDD82354950E0072BAAD /* RAMAnimatedTabBarItem.swift in Sources */, CE4146A01A1B944D0037F03C /* RAMItemAnimationProtocol.swift in Sources */, CE4146781A1B923D0037F03C /* AppDelegate.swift in Sources */, CE90A8791A1CE200002D8931 /* RAMBounceAnimation.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ 5A1F33BF2126AA3D004B8735 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = CE4146711A1B923D0037F03C /* RAMAnimatedTabBarDemo */; targetProxy = 5A1F33BE2126AA3D004B8735 /* PBXContainerItemProxy */; }; 84D4B7A31DB0D35500EE38C6 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 84D4B79C1DB0D35500EE38C6 /* RAMAnimatedTabBarController */; targetProxy = 84D4B7A21DB0D35500EE38C6 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ CE41467B1A1B923D0037F03C /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( CE41467C1A1B923D0037F03C /* Base */, ); name = Main.storyboard; sourceTree = ""; }; CE4146801A1B923D0037F03C /* LaunchScreen.xib */ = { isa = PBXVariantGroup; children = ( CE4146811A1B923D0037F03C /* Base */, ); name = LaunchScreen.xib; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 5A1F33C02126AA3D004B8735 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; DEBUG_INFORMATION_FORMAT = dwarf; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = AnimatedTabBarTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.ramotion.AnimatedTabBarTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Animated Tab Bar.app/Animated Tab Bar"; }; name = Debug; }; 5A1F33C12126AA3D004B8735 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = AnimatedTabBarTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.ramotion.AnimatedTabBarTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Animated Tab Bar.app/Animated Tab Bar"; }; name = Release; }; 84D4B7A61DB0D35500EE38C6 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = TabBarLib/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.ramotion.RAMAnimatedTabBarController; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; 84D4B7A71DB0D35500EE38C6 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = TabBarLib/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.ramotion.RAMAnimatedTabBarController; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Release; }; CE41468F1A1B923D0037F03C /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 12.2; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; CE4146901A1B923D0037F03C /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 12.2; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; name = Release; }; CE4146921A1B923D0037F03C /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = RAMAnimatedTabBarDemo/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.ramotion.dev; PRODUCT_NAME = "Animated Tab Bar"; PROVISIONING_PROFILE = ""; SWIFT_VERSION = 5.0; }; name = Debug; }; CE4146931A1B923D0037F03C /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = RAMAnimatedTabBarDemo/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.ramotion.dev; PRODUCT_NAME = "Animated Tab Bar"; PROVISIONING_PROFILE = ""; SWIFT_VERSION = 5.0; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 5A1F33C22126AA3D004B8735 /* Build configuration list for PBXNativeTarget "AnimatedTabBarTests" */ = { isa = XCConfigurationList; buildConfigurations = ( 5A1F33C02126AA3D004B8735 /* Debug */, 5A1F33C12126AA3D004B8735 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 84D4B7A81DB0D35500EE38C6 /* Build configuration list for PBXNativeTarget "RAMAnimatedTabBarController" */ = { isa = XCConfigurationList; buildConfigurations = ( 84D4B7A61DB0D35500EE38C6 /* Debug */, 84D4B7A71DB0D35500EE38C6 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; CE41466D1A1B923D0037F03C /* Build configuration list for PBXProject "RAMAnimatedTabBarDemo" */ = { isa = XCConfigurationList; buildConfigurations = ( CE41468F1A1B923D0037F03C /* Debug */, CE4146901A1B923D0037F03C /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; CE4146911A1B923D0037F03C /* Build configuration list for PBXNativeTarget "RAMAnimatedTabBarDemo" */ = { isa = XCConfigurationList; buildConfigurations = ( CE4146921A1B923D0037F03C /* Debug */, CE4146931A1B923D0037F03C /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = CE41466A1A1B923D0037F03C /* Project object */; } ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata ================================================ ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist ================================================ IDEDidComputeMac32BitWarning ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings ================================================ IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded ================================================ FILE: RAMAnimatedTabBarDemo/RAMAnimatedTabBarDemo.xcodeproj/xcshareddata/xcschemes/RAMAnimatedTabBarController.xcscheme ================================================ ================================================ FILE: RAMAnimatedTabBarDemo/TabBarLib/Info.plist ================================================ CFBundleDevelopmentRegion en CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType FMWK CFBundleShortVersionString 1.0 CFBundleVersion $(CURRENT_PROJECT_VERSION) NSPrincipalClass ================================================ FILE: RAMAnimatedTabBarDemo/TabBarLib/TabBarLib.h ================================================ // // TabBarLib.h // TabBarLib // // Created by Alex K. on 14/10/16. // Copyright © 2016 Ramotion. All rights reserved. // #import //! Project version number for TabBarLib. FOUNDATION_EXPORT double TabBarLibVersionNumber; //! Project version string for TabBarLib. FOUNDATION_EXPORT const unsigned char TabBarLibVersionString[]; // In this header, you should import all the public headers of your framework using statements like #import ================================================ FILE: README.md ================================================

ANIMATED TAB BAR

Swift UI module library for adding animation to iOS tabbar items and icons.

___

We specialize in the designing and coding of custom UI for Mobile Apps and Websites.

Stay tuned for the latest updates:


[![CocoaPods](https://img.shields.io/cocoapods/p/RAMAnimatedTabBarController.svg)](http://cocoapods.org/pods/RAMAnimatedTabBarController) [![CocoaPods](https://img.shields.io/cocoapods/v/RAMAnimatedTabBarController.svg)](http://cocoapods.org/pods/RAMAnimatedTabBarController) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Ramotion/animated-tab-bar) [![Swift 4.0](https://img.shields.io/badge/Swift-5.0-green.svg?style=flat)](https://developer.apple.com/swift/) [![Twitter](https://img.shields.io/badge/Twitter-@Ramotion-blue.svg?style=flat)](http://twitter.com/Ramotion) [![Travis](https://img.shields.io/travis/Ramotion/animated-tab-bar.svg)](https://travis-ci.org/Ramotion/animated-tab-bar) [![Donate](https://img.shields.io/badge/Donate-PayPal-blue.svg)](https://paypal.me/Ramotion) ## Requirements - iOS 9.0+ - Xcode 10.2 ## Installation Just add the RAMAnimatedTabBarController folder to your project. or use [CocoaPods](https://cocoapods.org) with Podfile: ``` ruby pod 'RAMAnimatedTabBarController' ``` or [Carthage](https://github.com/Carthage/Carthage) users can simply add to their `Cartfile`: ``` github "Ramotion/animated-tab-bar" ``` or [Swift Package Manager](https://swift.org/package-manager/) ## Usage 1. Create a new UITabBarController in your storyboard or nib. 2. Set the class of the UITabBarController to RAMAnimatedTabBarController in your Storyboard or nib. 3. For each UITabBarItem, set the class to RAMAnimatedTabBarItem. 4. Add a custom image icon for each RAMAnimatedTabBarItem 5. Add animation for each RAMAnimatedTabBarItem : * drag and drop an NSObject item into your ViewController * set its class to ANIMATION_CLASS (where ANIMATION_CLASS is the class name of the animation you want to use) * connect the outlet animation in RAMAnimatedTabBarItem to your ANIMATION_CLASS [Demonstration video for step 5](http://vimeo.com/112390386) ## Included Animations * RAMBounceAnimation * RAMLeftRotationAnimation * RAMRightRotationAnimation * RAMFlipLeftTransitionItemAnimations * RAMFlipRightTransitionItemAnimations * RAMFlipTopTransitionItemAnimations * RAMFlipBottomTransitionItemAnimations * RAMFrameItemAnimation * RAMFumeAnimation ## Creating Custom Animations 1. Create a new class which inherits from RAMItemAnimation: ``` swift class NewAnimation : RAMItemAnimation ``` 2. Implement the methods in RAMItemAnimationProtocol: ``` swift // method call when Tab Bar Item is selected override func playAnimation(icon: UIImageView, textLabel: UILabel) { // add animation } ``` ``` swift // method call when Tab Bar Item is deselected override func deselectAnimation(icon: UIImageView, textLabel: UILabel, defaultTextColor: UIColor, defaultIconColor: UIColor) { // add animation } ``` ``` swift // method call when TabBarController did load override func selectedState(icon: UIImageView, textLabel: UILabel) { // set selected state } ``` 3. Example: ``` swift import RAMAnimatedTabBarController class RAMBounceAnimation : RAMItemAnimation { override func playAnimation(_ icon: UIImageView, textLabel: UILabel) { playBounceAnimation(icon) textLabel.textColor = textSelectedColor } override func deselectAnimation(_ icon: UIImageView, textLabel: UILabel, defaultTextColor: UIColor, defaultIconColor: UIColor) { textLabel.textColor = defaultTextColor } override func selectedState(_ icon: UIImageView, textLabel: UILabel) { textLabel.textColor = textSelectedColor } func playBounceAnimation(_ icon : UIImageView) { let bounceAnimation = CAKeyframeAnimation(keyPath: "transform.scale") bounceAnimation.values = [1.0 ,1.4, 0.9, 1.15, 0.95, 1.02, 1.0] bounceAnimation.duration = TimeInterval(duration) bounceAnimation.calculationMode = kCAAnimationCubic icon.layer.add(bounceAnimation, forKey: "bounceAnimation") } } ``` ## 📄 License Animated Tab Bar is released under the MIT license. See [LICENSE](./LICENSE) for details. This library is a part of a selection of our best UI open-source projects. If you use the open-source library in your project, please make sure to credit and backlink to www.ramotion.com ## 📱 Get the Showroom App for iOS to give it a try Try this UI component and more like this in our iOS app. Contact us if interested.

================================================ FILE: docs/Classes/RAMAnimatedTabBarController.html ================================================ RAMAnimatedTabBarController Class Reference

RAMAnimatedTabBarDemo Docs (100% documented)

RAMAnimatedTabBarController

public class RAMAnimatedTabBarController: UITabBarController

UITabBarController with item animations

  • Returns a newly initialized view controller with the nib file in the specified bundle.

    Declaration

    Swift

    public override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)

    Parameters

    nibNameOrNil

    The name of the nib file to associate with the view controller. The nib file name should not contain any leading path information. If you specify nil, the nibName property is set to nil.

    nibBundleOrNil

    The bundle in which to search for the nib file. This method looks for the nib file in the bundle’s language-specific project directories first, followed by the Resources directory. If this parameter is nil, the method uses the heuristics described below to locate the nib file.

    Return Value

    A newly initialized RAMAnimatedTabBarController object.

  • Returns a newly initialized view controller with the nib file in the specified bundle.

    Declaration

    Swift

    public init(viewControllers: [UIViewController])

    Parameters

    viewControllers

    Sets the root view controllers of the tab bar controller.

    Return Value

    A newly initialized RAMAnimatedTabBarController object.

  • Returns a newly initialized view controller with the nib file in the specified bundle.

    Declaration

    Swift

    required public init?(coder aDecoder: NSCoder)

    Parameters

    coder

    An unarchiver object.

    Return Value

    A newly initialized RAMAnimatedTabBarController object.

  • Change selected color for each UITabBarItem

    Declaration

    Swift

    public func changeSelectedColor(textSelectedColor:UIColor, iconSelectedColor:UIColor)

    Parameters

    textSelectedColor

    set new color for text

    iconSelectedColor

    set new color for icon

  • Hide UITabBarController

    Declaration

    Swift

    public func animationTabBarHidden(isHidden:Bool)

    Parameters

    isHidden

    A Boolean indicating whether the UITabBarController is displayed

  • Selected UITabBarItem with animaton

    Declaration

    Swift

    public func setSelectIndex(from from: Int, to: Int)

    Parameters

    from

    Index for unselected animation

    to

    Index for selected animation

================================================ FILE: docs/Classes/RAMAnimatedTabBarItem.html ================================================ RAMAnimatedTabBarItem Class Reference

RAMAnimatedTabBarDemo Docs (100% documented)

RAMAnimatedTabBarItem

public class RAMAnimatedTabBarItem: UITabBarItem

UITabBarItem with animation

  • animation for UITabBarItem. use RAMFumeAnimation, RAMBounceAnimation, RAMRotationAnimation, RAMFrameItemAnimation, RAMTransitionAnimation or create custom anmation inherit RAMItemAnimation

    Declaration

    Swift

    @IBOutlet public var animation: RAMItemAnimation!
  • The font used to render the UITabBarItem text.

    Declaration

    Swift

    public var textFont: UIFont = UIFont.systemFontOfSize(10)
  • The color of the UITabBarItem text.

    Declaration

    Swift

    @IBInspectable public var textColor: UIColor = UIColor.blackColor()
  • The tint color of the UITabBarItem icon.

    Declaration

    Swift

    @IBInspectable public var iconColor: UIColor = UIColor.clearColor() // if alpha color is 0 color ignoring
  • Start selected animation

    Declaration

    Swift

    public func playAnimation()
  • Start unselected animation

    Declaration

    Swift

    public func deselectAnimation()
  • Set selected state without animation

    Declaration

    Swift

    public func selectedState()
  • The current badge value

    Declaration

    Swift

    override public var badgeValue: String?
================================================ FILE: docs/Classes/RAMBounceAnimation.html ================================================ RAMBounceAnimation Class Reference

RAMAnimatedTabBarDemo Docs (100% documented)

RAMBounceAnimation

public class RAMBounceAnimation : RAMItemAnimation

The RAMBounceAnimation class provides bounce animation.

  • Start animation, method call when UITabBarItem is selected

    Declaration

    Swift

    override public func playAnimation(icon : UIImageView, textLabel : UILabel)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

  • Start animation, method call when UITabBarItem is unselected

    Declaration

    Swift

    override public func deselectAnimation(icon : UIImageView, textLabel : UILabel, defaultTextColor : UIColor, defaultIconColor: UIColor)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

    defaultTextColor

    default UITabBarItem text color

    defaultIconColor

    default UITabBarItem icon color

  • Method call when TabBarController did load

    Declaration

    Swift

    override public func selectedState(icon : UIImageView, textLabel : UILabel)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

================================================ FILE: docs/Classes/RAMFrameItemAnimation.html ================================================ RAMFrameItemAnimation Class Reference

RAMAnimatedTabBarDemo Docs (100% documented)

RAMFrameItemAnimation

public class RAMFrameItemAnimation: RAMItemAnimation

The RAMFrameItemAnimation class provides keyframe animation.

  • A Boolean value indicated plaing revers animation when UITabBarItem unselected, if false image change immediately, defalut value true

    Declaration

    Swift

    @IBInspectable public var isDeselectAnimation: Bool = true
  • path to array of image names from plist file

    Declaration

    Swift

    @IBInspectable public var imagesPath: String!
  • Set images for keyframe animation

    Declaration

    Swift

    public func setAnimationImages(images: Array<UIImage>)

    Parameters

    images

    images for keyframe animation

  • Start animation, method call when UITabBarItem is selected

    Declaration

    Swift

    override public func playAnimation(icon : UIImageView, textLabel : UILabel)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

  • Start animation, method call when UITabBarItem is unselected

    Declaration

    Swift

    override public func deselectAnimation(icon : UIImageView, textLabel : UILabel, defaultTextColor : UIColor, defaultIconColor : UIColor)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

    defaultTextColor

    default UITabBarItem text color

    defaultIconColor

    default UITabBarItem icon color

  • Method call when TabBarController did load

    Declaration

    Swift

    override public func selectedState(icon : UIImageView, textLabel : UILabel)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

================================================ FILE: docs/Classes/RAMFumeAnimation.html ================================================ RAMFumeAnimation Class Reference

RAMAnimatedTabBarDemo Docs (100% documented)

RAMFumeAnimation

public class RAMFumeAnimation : RAMItemAnimation

The RAMFumeAnimation class provides bounce animation.

  • Start animation, method call when UITabBarItem is selected

    Declaration

    Swift

    override public func playAnimation(icon : UIImageView, textLabel : UILabel)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

  • Start animation, method call when UITabBarItem is unselected

    Declaration

    Swift

    override public func deselectAnimation(icon : UIImageView, textLabel : UILabel, defaultTextColor : UIColor, defaultIconColor : UIColor)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

    defaultTextColor

    default UITabBarItem text color

    defaultIconColor

    default UITabBarItem icon color

  • Method call when TabBarController did load

    Declaration

    Swift

    override public func selectedState(icon : UIImageView, textLabel : UILabel)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

================================================ FILE: docs/Classes/RAMItemAnimation.html ================================================ RAMItemAnimation Class Reference

RAMAnimatedTabBarDemo Docs (100% documented)

RAMItemAnimation

public class RAMItemAnimation: NSObject, RAMItemAnimationProtocol

Base class for UITabBarItems animation

  • The duration of the animation

    Declaration

    Swift

    @IBInspectable public var duration : CGFloat = 0.5
  • The text color in selected state.

    Declaration

    Swift

    @IBInspectable public var textSelectedColor: UIColor = UIColor.init(red: 0, green: 0.478431, blue: 1, alpha: 1)
  • The icon color in selected state.

    Declaration

    Swift

    @IBInspectable public var iconSelectedColor: UIColor!
  • Start animation, method call when UITabBarItem is selected

    Declaration

    Swift

    public func playAnimation(icon : UIImageView, textLabel : UILabel)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

  • Start animation, method call when UITabBarItem is unselected

    Declaration

    Swift

    public func deselectAnimation(icon : UIImageView, textLabel : UILabel, defaultTextColor : UIColor, defaultIconColor : UIColor)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

    defaultTextColor

    default UITabBarItem text color

    defaultIconColor

    default UITabBarItem icon color

  • Method call when TabBarController did load

    Declaration

    Swift

    public func selectedState(icon: UIImageView, textLabel : UILabel)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

================================================ FILE: docs/Classes/RAMRotationAnimation.html ================================================ RAMRotationAnimation Class Reference

RAMAnimatedTabBarDemo Docs (100% documented)

RAMRotationAnimation

public class RAMRotationAnimation : RAMItemAnimation

The RAMRotationAnimation class provides rotation animation.

  • Animation direction

    • Left: left direction
    • Right: right direction

    Declaration

    Swift

    public enum RAMRotationDirection
  • Animation direction (left, right)

    Declaration

    Swift

    public var direction : RAMRotationDirection!
  • Start animation, method call when UITabBarItem is selected

    Declaration

    Swift

    override public func playAnimation(icon : UIImageView, textLabel : UILabel)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

  • Start animation, method call when UITabBarItem is unselected

    Declaration

    Swift

    override public func deselectAnimation(icon : UIImageView, textLabel : UILabel, defaultTextColor : UIColor, defaultIconColor : UIColor)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

    defaultTextColor

    default UITabBarItem text color

    defaultIconColor

    default UITabBarItem icon color

  • Method call when TabBarController did load

    Declaration

    Swift

    override public func selectedState(icon : UIImageView, textLabel : UILabel)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

================================================ FILE: docs/Classes/RAMTransitionItemAnimations.html ================================================ RAMTransitionItemAnimations Class Reference

RAMAnimatedTabBarDemo Docs (100% documented)

RAMTransitionItemAnimations

public class RAMTransitionItemAnimations : RAMItemAnimation

Transition animtion

  • Options for animating. Default TransitionNone

    Declaration

    Swift

    public var transitionOptions : UIViewAnimationOptions!
  • Start animation, method call when UITabBarItem is selected

    Declaration

    Swift

    override public func playAnimation(icon : UIImageView, textLabel : UILabel)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

  • Start animation, method call when UITabBarItem is unselected

    Declaration

    Swift

    override public func deselectAnimation(icon : UIImageView, textLabel : UILabel, defaultTextColor : UIColor, defaultIconColor : UIColor)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

    defaultTextColor

    default UITabBarItem text color

    defaultIconColor

    default UITabBarItem icon color

  • Method call when TabBarController did load

    Declaration

    Swift

    override public func selectedState(icon : UIImageView, textLabel : UILabel)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

================================================ FILE: docs/Classes.html ================================================ Classes Reference

RAMAnimatedTabBarDemo Docs (100% documented)

Classes

The following classes are available globally.

  • The RAMFrameItemAnimation class provides keyframe animation.

    See more

    Declaration

    Swift

    public class RAMFrameItemAnimation: RAMItemAnimation
  • The RAMRotationAnimation class provides rotation animation.

    See more

    Declaration

    Swift

    public class RAMRotationAnimation : RAMItemAnimation
  • The RAMFumeAnimation class provides bounce animation.

    See more

    Declaration

    Swift

    public class RAMFumeAnimation : RAMItemAnimation
  • Base class for UITabBarItems animation

    See more

    Declaration

    Swift

    public class RAMItemAnimation: NSObject, RAMItemAnimationProtocol
  • The RAMBounceAnimation class provides bounce animation.

    See more

    Declaration

    Swift

    public class RAMBounceAnimation : RAMItemAnimation
================================================ FILE: docs/css/highlight.css ================================================ /* Credit to https://gist.github.com/wataru420/2048287 */ .highlight { /* Comment */ /* Error */ /* Keyword */ /* Operator */ /* Comment.Multiline */ /* Comment.Preproc */ /* Comment.Single */ /* Comment.Special */ /* Generic.Deleted */ /* Generic.Deleted.Specific */ /* Generic.Emph */ /* Generic.Error */ /* Generic.Heading */ /* Generic.Inserted */ /* Generic.Inserted.Specific */ /* Generic.Output */ /* Generic.Prompt */ /* Generic.Strong */ /* Generic.Subheading */ /* Generic.Traceback */ /* Keyword.Constant */ /* Keyword.Declaration */ /* Keyword.Pseudo */ /* Keyword.Reserved */ /* Keyword.Type */ /* Literal.Number */ /* Literal.String */ /* Name.Attribute */ /* Name.Builtin */ /* Name.Class */ /* Name.Constant */ /* Name.Entity */ /* Name.Exception */ /* Name.Function */ /* Name.Namespace */ /* Name.Tag */ /* Name.Variable */ /* Operator.Word */ /* Text.Whitespace */ /* Literal.Number.Float */ /* Literal.Number.Hex */ /* Literal.Number.Integer */ /* Literal.Number.Oct */ /* Literal.String.Backtick */ /* Literal.String.Char */ /* Literal.String.Doc */ /* Literal.String.Double */ /* Literal.String.Escape */ /* Literal.String.Heredoc */ /* Literal.String.Interpol */ /* Literal.String.Other */ /* Literal.String.Regex */ /* Literal.String.Single */ /* Literal.String.Symbol */ /* Name.Builtin.Pseudo */ /* Name.Variable.Class */ /* Name.Variable.Global */ /* Name.Variable.Instance */ /* Literal.Number.Integer.Long */ } .highlight .c { color: #999988; font-style: italic; } .highlight .err { color: #a61717; background-color: #e3d2d2; } .highlight .k { color: #000000; font-weight: bold; } .highlight .o { color: #000000; font-weight: bold; } .highlight .cm { color: #999988; font-style: italic; } .highlight .cp { color: #999999; font-weight: bold; } .highlight .c1 { color: #999988; font-style: italic; } .highlight .cs { color: #999999; font-weight: bold; font-style: italic; } .highlight .gd { color: #000000; background-color: #ffdddd; } .highlight .gd .x { color: #000000; background-color: #ffaaaa; } .highlight .ge { color: #000000; font-style: italic; } .highlight .gr { color: #aa0000; } .highlight .gh { color: #999999; } .highlight .gi { color: #000000; background-color: #ddffdd; } .highlight .gi .x { color: #000000; background-color: #aaffaa; } .highlight .go { color: #888888; } .highlight .gp { color: #555555; } .highlight .gs { font-weight: bold; } .highlight .gu { color: #aaaaaa; } .highlight .gt { color: #aa0000; } .highlight .kc { color: #000000; font-weight: bold; } .highlight .kd { color: #000000; font-weight: bold; } .highlight .kp { color: #000000; font-weight: bold; } .highlight .kr { color: #000000; font-weight: bold; } .highlight .kt { color: #445588; } .highlight .m { color: #009999; } .highlight .s { color: #d14; } .highlight .na { color: #008080; } .highlight .nb { color: #0086B3; } .highlight .nc { color: #445588; font-weight: bold; } .highlight .no { color: #008080; } .highlight .ni { color: #800080; } .highlight .ne { color: #990000; font-weight: bold; } .highlight .nf { color: #990000; } .highlight .nn { color: #555555; } .highlight .nt { color: #000080; } .highlight .nv { color: #008080; } .highlight .ow { color: #000000; font-weight: bold; } .highlight .w { color: #bbbbbb; } .highlight .mf { color: #009999; } .highlight .mh { color: #009999; } .highlight .mi { color: #009999; } .highlight .mo { color: #009999; } .highlight .sb { color: #d14; } .highlight .sc { color: #d14; } .highlight .sd { color: #d14; } .highlight .s2 { color: #d14; } .highlight .se { color: #d14; } .highlight .sh { color: #d14; } .highlight .si { color: #d14; } .highlight .sx { color: #d14; } .highlight .sr { color: #009926; } .highlight .s1 { color: #d14; } .highlight .ss { color: #990073; } .highlight .bp { color: #999999; } .highlight .vc { color: #008080; } .highlight .vg { color: #008080; } .highlight .vi { color: #008080; } .highlight .il { color: #009999; } ================================================ FILE: docs/css/jazzy.css ================================================ html, body, div, span, h1, h3, h4, p, a, code, em, img, ul, li, table, tbody, tr, td { background: transparent; border: 0; margin: 0; outline: 0; padding: 0; vertical-align: baseline; } body { background-color: #f2f2f2; font-family: Helvetica, freesans, Arial, sans-serif; font-size: 14px; -webkit-font-smoothing: subpixel-antialiased; word-wrap: break-word; } h1, h2, h3 { margin-top: 0.8em; margin-bottom: 0.3em; font-weight: 100; color: black; } h1 { font-size: 2.5em; } h2 { font-size: 2em; border-bottom: 1px solid #e2e2e2; } h4 { font-size: 13px; line-height: 1.5; margin-top: 21px; } h5 { font-size: 1.1em; } h6 { font-size: 1.1em; color: #777; } .section-name { color: gray; display: block; font-family: Helvetica; font-size: 22px; font-weight: 100; margin-bottom: 15px; } pre, code { font: 0.95em Menlo, monospace; color: #777; word-wrap: normal; } p code, li code { background-color: #eee; padding: 2px 4px; border-radius: 4px; } a { color: #0088cc; text-decoration: none; } ul { padding-left: 15px; } li { line-height: 1.8em; } img { max-width: 100%; } blockquote { margin-left: 0; padding: 0 10px; border-left: 4px solid #ccc; } .content-wrapper { margin: 0 auto; width: 980px; } header { font-size: 0.85em; line-height: 26px; background-color: #414141; position: fixed; width: 100%; z-index: 1; } header img { padding-right: 6px; vertical-align: -4px; height: 16px; } header a { color: #fff; } header p { float: left; color: #999; } header .header-right { float: right; margin-left: 16px; } #breadcrumbs { background-color: #f2f2f2; height: 27px; padding-top: 17px; position: fixed; width: 100%; z-index: 1; margin-top: 26px; } #breadcrumbs #carat { height: 10px; margin: 0 5px; } .sidebar { background-color: #f9f9f9; border: 1px solid #e2e2e2; overflow-y: auto; overflow-x: hidden; position: fixed; top: 70px; bottom: 0; width: 230px; word-wrap: normal; } .nav-groups { list-style-type: none; background: #fff; padding-left: 0; } .nav-group-name { border-bottom: 1px solid #e2e2e2; font-size: 1.1em; font-weight: 100; padding: 15px 0 15px 20px; } .nav-group-name > a { color: #333; } .nav-group-tasks { margin-top: 5px; } .nav-group-task { font-size: 0.9em; list-style-type: none; } .nav-group-task a { color: #888; } .main-content { background-color: #fff; border: 1px solid #e2e2e2; margin-left: 246px; position: absolute; overflow: hidden; padding-bottom: 60px; top: 70px; width: 734px; } .main-content p, .main-content a, .main-content code, .main-content em, .main-content ul, .main-content table, .main-content blockquote { margin-bottom: 1em; } .main-content p { line-height: 1.8em; } .main-content section .section:first-child { margin-top: 0; padding-top: 0; } .main-content section .task-group-section .task-group:first-of-type { padding-top: 10px; } .main-content section .task-group-section .task-group:first-of-type .section-name { padding-top: 15px; } .section { padding: 0 25px; } .highlight { background-color: #eee; padding: 10px 12px; border: 1px solid #e2e2e2; border-radius: 4px; overflow-x: auto; } .declaration .highlight { overflow-x: initial; padding: 0 40px 40px 0; margin-bottom: -25px; background-color: transparent; border: none; } .section-name { margin: 0; margin-left: 18px; } .task-group-section { padding-left: 6px; border-top: 1px solid #e2e2e2; } .task-group { padding-top: 0px; } .task-name-container a[name]:before { content: ""; display: block; padding-top: 70px; margin: -70px 0 0; } .item { padding-top: 8px; width: 100%; list-style-type: none; } .item a[name]:before { content: ""; display: block; padding-top: 70px; margin: -70px 0 0; } .item code { background-color: transparent; padding: 0; } .item .token { padding-left: 3px; margin-left: 15px; font-size: 11.9px; } .item .declaration-note { font-size: .85em; color: gray; font-style: italic; } .pointer-container { border-bottom: 1px solid #e2e2e2; left: -23px; padding-bottom: 13px; position: relative; width: 110%; } .pointer { background: #f9f9f9; border-left: 1px solid #e2e2e2; border-top: 1px solid #e2e2e2; height: 12px; left: 21px; top: -7px; -webkit-transform: rotate(45deg); -moz-transform: rotate(45deg); -o-transform: rotate(45deg); transform: rotate(45deg); position: absolute; width: 12px; } .height-container { display: none; left: -25px; padding: 0 25px; position: relative; width: 100%; overflow: hidden; } .height-container .section { background: #f9f9f9; border-bottom: 1px solid #e2e2e2; left: -25px; position: relative; width: 100%; padding-top: 10px; padding-bottom: 5px; } .aside, .language { padding: 6px 12px; margin: 12px 0; border-left: 5px solid #dddddd; overflow-y: hidden; } .aside .aside-title, .language .aside-title { font-size: 9px; letter-spacing: 2px; text-transform: uppercase; padding-bottom: 0; margin: 0; color: #aaa; -webkit-user-select: none; } .aside p:last-child, .language p:last-child { margin-bottom: 0; } .language { border-left: 5px solid #cde9f4; } .language .aside-title { color: #4b8afb; } .aside-warning { border-left: 5px solid #ff6666; } .aside-warning .aside-title { color: #ff0000; } .graybox { border-collapse: collapse; width: 100%; } .graybox p { margin: 0; word-break: break-word; min-width: 50px; } .graybox td { border: 1px solid #e2e2e2; padding: 5px 25px 5px 10px; vertical-align: middle; } .graybox tr td:first-of-type { text-align: right; padding: 7px; vertical-align: top; word-break: normal; width: 40px; } .slightly-smaller { font-size: 0.9em; } #footer { position: absolute; bottom: 10px; margin-left: 25px; } #footer p { margin: 0; color: #aaa; font-size: 0.8em; } html.dash header, html.dash #breadcrumbs, html.dash .sidebar { display: none; } html.dash .main-content { width: 980px; margin-left: 0; border: none; width: 100%; top: 0; padding-bottom: 0; } html.dash .height-container { display: block; } html.dash .item .token { margin-left: 0; } html.dash .content-wrapper { width: auto; } html.dash #footer { position: static; } ================================================ FILE: docs/docsets/RAMAnimatedTabBarDemo.docset/Contents/Info.plist ================================================ CFBundleIdentifier com.jazzy.ramanimatedtabbardemo CFBundleName RAMAnimatedTabBarDemo DocSetPlatformFamily jazzy isDashDocset dashIndexFilePath index.html isJavaScriptEnabled DashDocSetFamily dashtoc ================================================ FILE: docs/docsets/RAMAnimatedTabBarDemo.docset/Contents/Resources/Documents/Classes/RAMAnimatedTabBarController.html ================================================ RAMAnimatedTabBarController Class Reference

RAMAnimatedTabBarDemo Docs (100% documented)

RAMAnimatedTabBarController

public class RAMAnimatedTabBarController: UITabBarController

UITabBarController with item animations

  • Returns a newly initialized view controller with the nib file in the specified bundle.

    Declaration

    Swift

    public override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)

    Parameters

    nibNameOrNil

    The name of the nib file to associate with the view controller. The nib file name should not contain any leading path information. If you specify nil, the nibName property is set to nil.

    nibBundleOrNil

    The bundle in which to search for the nib file. This method looks for the nib file in the bundle’s language-specific project directories first, followed by the Resources directory. If this parameter is nil, the method uses the heuristics described below to locate the nib file.

    Return Value

    A newly initialized RAMAnimatedTabBarController object.

  • Returns a newly initialized view controller with the nib file in the specified bundle.

    Declaration

    Swift

    public init(viewControllers: [UIViewController])

    Parameters

    viewControllers

    Sets the root view controllers of the tab bar controller.

    Return Value

    A newly initialized RAMAnimatedTabBarController object.

  • Returns a newly initialized view controller with the nib file in the specified bundle.

    Declaration

    Swift

    required public init?(coder aDecoder: NSCoder)

    Parameters

    coder

    An unarchiver object.

    Return Value

    A newly initialized RAMAnimatedTabBarController object.

  • Change selected color for each UITabBarItem

    Declaration

    Swift

    public func changeSelectedColor(textSelectedColor:UIColor, iconSelectedColor:UIColor)

    Parameters

    textSelectedColor

    set new color for text

    iconSelectedColor

    set new color for icon

  • Hide UITabBarController

    Declaration

    Swift

    public func animationTabBarHidden(isHidden:Bool)

    Parameters

    isHidden

    A Boolean indicating whether the UITabBarController is displayed

  • Selected UITabBarItem with animaton

    Declaration

    Swift

    public func setSelectIndex(from from: Int, to: Int)

    Parameters

    from

    Index for unselected animation

    to

    Index for selected animation

================================================ FILE: docs/docsets/RAMAnimatedTabBarDemo.docset/Contents/Resources/Documents/Classes/RAMAnimatedTabBarItem.html ================================================ RAMAnimatedTabBarItem Class Reference

RAMAnimatedTabBarDemo Docs (100% documented)

RAMAnimatedTabBarItem

public class RAMAnimatedTabBarItem: UITabBarItem

UITabBarItem with animation

  • animation for UITabBarItem. use RAMFumeAnimation, RAMBounceAnimation, RAMRotationAnimation, RAMFrameItemAnimation, RAMTransitionAnimation or create custom anmation inherit RAMItemAnimation

    Declaration

    Swift

    @IBOutlet public var animation: RAMItemAnimation!
  • The font used to render the UITabBarItem text.

    Declaration

    Swift

    public var textFont: UIFont = UIFont.systemFontOfSize(10)
  • The color of the UITabBarItem text.

    Declaration

    Swift

    @IBInspectable public var textColor: UIColor = UIColor.blackColor()
  • The tint color of the UITabBarItem icon.

    Declaration

    Swift

    @IBInspectable public var iconColor: UIColor = UIColor.clearColor() // if alpha color is 0 color ignoring
  • Start selected animation

    Declaration

    Swift

    public func playAnimation()
  • Start unselected animation

    Declaration

    Swift

    public func deselectAnimation()
  • Set selected state without animation

    Declaration

    Swift

    public func selectedState()
  • The current badge value

    Declaration

    Swift

    override public var badgeValue: String?
================================================ FILE: docs/docsets/RAMAnimatedTabBarDemo.docset/Contents/Resources/Documents/Classes/RAMBounceAnimation.html ================================================ RAMBounceAnimation Class Reference

RAMAnimatedTabBarDemo Docs (100% documented)

RAMBounceAnimation

public class RAMBounceAnimation : RAMItemAnimation

The RAMBounceAnimation class provides bounce animation.

  • Start animation, method call when UITabBarItem is selected

    Declaration

    Swift

    override public func playAnimation(icon : UIImageView, textLabel : UILabel)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

  • Start animation, method call when UITabBarItem is unselected

    Declaration

    Swift

    override public func deselectAnimation(icon : UIImageView, textLabel : UILabel, defaultTextColor : UIColor, defaultIconColor: UIColor)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

    defaultTextColor

    default UITabBarItem text color

    defaultIconColor

    default UITabBarItem icon color

  • Method call when TabBarController did load

    Declaration

    Swift

    override public func selectedState(icon : UIImageView, textLabel : UILabel)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

================================================ FILE: docs/docsets/RAMAnimatedTabBarDemo.docset/Contents/Resources/Documents/Classes/RAMFrameItemAnimation.html ================================================ RAMFrameItemAnimation Class Reference

RAMAnimatedTabBarDemo Docs (100% documented)

RAMFrameItemAnimation

public class RAMFrameItemAnimation: RAMItemAnimation

The RAMFrameItemAnimation class provides keyframe animation.

  • A Boolean value indicated plaing revers animation when UITabBarItem unselected, if false image change immediately, defalut value true

    Declaration

    Swift

    @IBInspectable public var isDeselectAnimation: Bool = true
  • path to array of image names from plist file

    Declaration

    Swift

    @IBInspectable public var imagesPath: String!
  • Set images for keyframe animation

    Declaration

    Swift

    public func setAnimationImages(images: Array<UIImage>)

    Parameters

    images

    images for keyframe animation

  • Start animation, method call when UITabBarItem is selected

    Declaration

    Swift

    override public func playAnimation(icon : UIImageView, textLabel : UILabel)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

  • Start animation, method call when UITabBarItem is unselected

    Declaration

    Swift

    override public func deselectAnimation(icon : UIImageView, textLabel : UILabel, defaultTextColor : UIColor, defaultIconColor : UIColor)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

    defaultTextColor

    default UITabBarItem text color

    defaultIconColor

    default UITabBarItem icon color

  • Method call when TabBarController did load

    Declaration

    Swift

    override public func selectedState(icon : UIImageView, textLabel : UILabel)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

================================================ FILE: docs/docsets/RAMAnimatedTabBarDemo.docset/Contents/Resources/Documents/Classes/RAMFumeAnimation.html ================================================ RAMFumeAnimation Class Reference

RAMAnimatedTabBarDemo Docs (100% documented)

RAMFumeAnimation

public class RAMFumeAnimation : RAMItemAnimation

The RAMFumeAnimation class provides bounce animation.

  • Start animation, method call when UITabBarItem is selected

    Declaration

    Swift

    override public func playAnimation(icon : UIImageView, textLabel : UILabel)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

  • Start animation, method call when UITabBarItem is unselected

    Declaration

    Swift

    override public func deselectAnimation(icon : UIImageView, textLabel : UILabel, defaultTextColor : UIColor, defaultIconColor : UIColor)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

    defaultTextColor

    default UITabBarItem text color

    defaultIconColor

    default UITabBarItem icon color

  • Method call when TabBarController did load

    Declaration

    Swift

    override public func selectedState(icon : UIImageView, textLabel : UILabel)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

================================================ FILE: docs/docsets/RAMAnimatedTabBarDemo.docset/Contents/Resources/Documents/Classes/RAMItemAnimation.html ================================================ RAMItemAnimation Class Reference

RAMAnimatedTabBarDemo Docs (100% documented)

RAMItemAnimation

public class RAMItemAnimation: NSObject, RAMItemAnimationProtocol

Base class for UITabBarItems animation

  • The duration of the animation

    Declaration

    Swift

    @IBInspectable public var duration : CGFloat = 0.5
  • The text color in selected state.

    Declaration

    Swift

    @IBInspectable public var textSelectedColor: UIColor = UIColor.init(red: 0, green: 0.478431, blue: 1, alpha: 1)
  • The icon color in selected state.

    Declaration

    Swift

    @IBInspectable public var iconSelectedColor: UIColor!
  • Start animation, method call when UITabBarItem is selected

    Declaration

    Swift

    public func playAnimation(icon : UIImageView, textLabel : UILabel)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

  • Start animation, method call when UITabBarItem is unselected

    Declaration

    Swift

    public func deselectAnimation(icon : UIImageView, textLabel : UILabel, defaultTextColor : UIColor, defaultIconColor : UIColor)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

    defaultTextColor

    default UITabBarItem text color

    defaultIconColor

    default UITabBarItem icon color

  • Method call when TabBarController did load

    Declaration

    Swift

    public func selectedState(icon: UIImageView, textLabel : UILabel)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

================================================ FILE: docs/docsets/RAMAnimatedTabBarDemo.docset/Contents/Resources/Documents/Classes/RAMRotationAnimation.html ================================================ RAMRotationAnimation Class Reference

RAMAnimatedTabBarDemo Docs (100% documented)

RAMRotationAnimation

public class RAMRotationAnimation : RAMItemAnimation

The RAMRotationAnimation class provides rotation animation.

  • Animation direction

    • Left: left direction
    • Right: right direction

    Declaration

    Swift

    public enum RAMRotationDirection
  • Animation direction (left, right)

    Declaration

    Swift

    public var direction : RAMRotationDirection!
  • Start animation, method call when UITabBarItem is selected

    Declaration

    Swift

    override public func playAnimation(icon : UIImageView, textLabel : UILabel)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

  • Start animation, method call when UITabBarItem is unselected

    Declaration

    Swift

    override public func deselectAnimation(icon : UIImageView, textLabel : UILabel, defaultTextColor : UIColor, defaultIconColor : UIColor)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

    defaultTextColor

    default UITabBarItem text color

    defaultIconColor

    default UITabBarItem icon color

  • Method call when TabBarController did load

    Declaration

    Swift

    override public func selectedState(icon : UIImageView, textLabel : UILabel)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

================================================ FILE: docs/docsets/RAMAnimatedTabBarDemo.docset/Contents/Resources/Documents/Classes/RAMTransitionItemAnimations.html ================================================ RAMTransitionItemAnimations Class Reference

RAMAnimatedTabBarDemo Docs (100% documented)

RAMTransitionItemAnimations

public class RAMTransitionItemAnimations : RAMItemAnimation

Transition animtion

  • Options for animating. Default TransitionNone

    Declaration

    Swift

    public var transitionOptions : UIViewAnimationOptions!
  • Start animation, method call when UITabBarItem is selected

    Declaration

    Swift

    override public func playAnimation(icon : UIImageView, textLabel : UILabel)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

  • Start animation, method call when UITabBarItem is unselected

    Declaration

    Swift

    override public func deselectAnimation(icon : UIImageView, textLabel : UILabel, defaultTextColor : UIColor, defaultIconColor : UIColor)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

    defaultTextColor

    default UITabBarItem text color

    defaultIconColor

    default UITabBarItem icon color

  • Method call when TabBarController did load

    Declaration

    Swift

    override public func selectedState(icon : UIImageView, textLabel : UILabel)

    Parameters

    icon

    animating UITabBarItem icon

    textLabel

    animating UITabBarItem textLabel

================================================ FILE: docs/docsets/RAMAnimatedTabBarDemo.docset/Contents/Resources/Documents/Classes.html ================================================ Classes Reference

RAMAnimatedTabBarDemo Docs (100% documented)

Classes

The following classes are available globally.

  • The RAMFrameItemAnimation class provides keyframe animation.

    See more

    Declaration

    Swift

    public class RAMFrameItemAnimation: RAMItemAnimation
  • The RAMRotationAnimation class provides rotation animation.

    See more

    Declaration

    Swift

    public class RAMRotationAnimation : RAMItemAnimation
  • The RAMFumeAnimation class provides bounce animation.

    See more

    Declaration

    Swift

    public class RAMFumeAnimation : RAMItemAnimation
  • Base class for UITabBarItems animation

    See more

    Declaration

    Swift

    public class RAMItemAnimation: NSObject, RAMItemAnimationProtocol
  • The RAMBounceAnimation class provides bounce animation.

    See more

    Declaration

    Swift

    public class RAMBounceAnimation : RAMItemAnimation
================================================ FILE: docs/docsets/RAMAnimatedTabBarDemo.docset/Contents/Resources/Documents/css/highlight.css ================================================ /* Credit to https://gist.github.com/wataru420/2048287 */ .highlight { /* Comment */ /* Error */ /* Keyword */ /* Operator */ /* Comment.Multiline */ /* Comment.Preproc */ /* Comment.Single */ /* Comment.Special */ /* Generic.Deleted */ /* Generic.Deleted.Specific */ /* Generic.Emph */ /* Generic.Error */ /* Generic.Heading */ /* Generic.Inserted */ /* Generic.Inserted.Specific */ /* Generic.Output */ /* Generic.Prompt */ /* Generic.Strong */ /* Generic.Subheading */ /* Generic.Traceback */ /* Keyword.Constant */ /* Keyword.Declaration */ /* Keyword.Pseudo */ /* Keyword.Reserved */ /* Keyword.Type */ /* Literal.Number */ /* Literal.String */ /* Name.Attribute */ /* Name.Builtin */ /* Name.Class */ /* Name.Constant */ /* Name.Entity */ /* Name.Exception */ /* Name.Function */ /* Name.Namespace */ /* Name.Tag */ /* Name.Variable */ /* Operator.Word */ /* Text.Whitespace */ /* Literal.Number.Float */ /* Literal.Number.Hex */ /* Literal.Number.Integer */ /* Literal.Number.Oct */ /* Literal.String.Backtick */ /* Literal.String.Char */ /* Literal.String.Doc */ /* Literal.String.Double */ /* Literal.String.Escape */ /* Literal.String.Heredoc */ /* Literal.String.Interpol */ /* Literal.String.Other */ /* Literal.String.Regex */ /* Literal.String.Single */ /* Literal.String.Symbol */ /* Name.Builtin.Pseudo */ /* Name.Variable.Class */ /* Name.Variable.Global */ /* Name.Variable.Instance */ /* Literal.Number.Integer.Long */ } .highlight .c { color: #999988; font-style: italic; } .highlight .err { color: #a61717; background-color: #e3d2d2; } .highlight .k { color: #000000; font-weight: bold; } .highlight .o { color: #000000; font-weight: bold; } .highlight .cm { color: #999988; font-style: italic; } .highlight .cp { color: #999999; font-weight: bold; } .highlight .c1 { color: #999988; font-style: italic; } .highlight .cs { color: #999999; font-weight: bold; font-style: italic; } .highlight .gd { color: #000000; background-color: #ffdddd; } .highlight .gd .x { color: #000000; background-color: #ffaaaa; } .highlight .ge { color: #000000; font-style: italic; } .highlight .gr { color: #aa0000; } .highlight .gh { color: #999999; } .highlight .gi { color: #000000; background-color: #ddffdd; } .highlight .gi .x { color: #000000; background-color: #aaffaa; } .highlight .go { color: #888888; } .highlight .gp { color: #555555; } .highlight .gs { font-weight: bold; } .highlight .gu { color: #aaaaaa; } .highlight .gt { color: #aa0000; } .highlight .kc { color: #000000; font-weight: bold; } .highlight .kd { color: #000000; font-weight: bold; } .highlight .kp { color: #000000; font-weight: bold; } .highlight .kr { color: #000000; font-weight: bold; } .highlight .kt { color: #445588; } .highlight .m { color: #009999; } .highlight .s { color: #d14; } .highlight .na { color: #008080; } .highlight .nb { color: #0086B3; } .highlight .nc { color: #445588; font-weight: bold; } .highlight .no { color: #008080; } .highlight .ni { color: #800080; } .highlight .ne { color: #990000; font-weight: bold; } .highlight .nf { color: #990000; } .highlight .nn { color: #555555; } .highlight .nt { color: #000080; } .highlight .nv { color: #008080; } .highlight .ow { color: #000000; font-weight: bold; } .highlight .w { color: #bbbbbb; } .highlight .mf { color: #009999; } .highlight .mh { color: #009999; } .highlight .mi { color: #009999; } .highlight .mo { color: #009999; } .highlight .sb { color: #d14; } .highlight .sc { color: #d14; } .highlight .sd { color: #d14; } .highlight .s2 { color: #d14; } .highlight .se { color: #d14; } .highlight .sh { color: #d14; } .highlight .si { color: #d14; } .highlight .sx { color: #d14; } .highlight .sr { color: #009926; } .highlight .s1 { color: #d14; } .highlight .ss { color: #990073; } .highlight .bp { color: #999999; } .highlight .vc { color: #008080; } .highlight .vg { color: #008080; } .highlight .vi { color: #008080; } .highlight .il { color: #009999; } ================================================ FILE: docs/docsets/RAMAnimatedTabBarDemo.docset/Contents/Resources/Documents/css/jazzy.css ================================================ html, body, div, span, h1, h3, h4, p, a, code, em, img, ul, li, table, tbody, tr, td { background: transparent; border: 0; margin: 0; outline: 0; padding: 0; vertical-align: baseline; } body { background-color: #f2f2f2; font-family: Helvetica, freesans, Arial, sans-serif; font-size: 14px; -webkit-font-smoothing: subpixel-antialiased; word-wrap: break-word; } h1, h2, h3 { margin-top: 0.8em; margin-bottom: 0.3em; font-weight: 100; color: black; } h1 { font-size: 2.5em; } h2 { font-size: 2em; border-bottom: 1px solid #e2e2e2; } h4 { font-size: 13px; line-height: 1.5; margin-top: 21px; } h5 { font-size: 1.1em; } h6 { font-size: 1.1em; color: #777; } .section-name { color: gray; display: block; font-family: Helvetica; font-size: 22px; font-weight: 100; margin-bottom: 15px; } pre, code { font: 0.95em Menlo, monospace; color: #777; word-wrap: normal; } p code, li code { background-color: #eee; padding: 2px 4px; border-radius: 4px; } a { color: #0088cc; text-decoration: none; } ul { padding-left: 15px; } li { line-height: 1.8em; } img { max-width: 100%; } blockquote { margin-left: 0; padding: 0 10px; border-left: 4px solid #ccc; } .content-wrapper { margin: 0 auto; width: 980px; } header { font-size: 0.85em; line-height: 26px; background-color: #414141; position: fixed; width: 100%; z-index: 1; } header img { padding-right: 6px; vertical-align: -4px; height: 16px; } header a { color: #fff; } header p { float: left; color: #999; } header .header-right { float: right; margin-left: 16px; } #breadcrumbs { background-color: #f2f2f2; height: 27px; padding-top: 17px; position: fixed; width: 100%; z-index: 1; margin-top: 26px; } #breadcrumbs #carat { height: 10px; margin: 0 5px; } .sidebar { background-color: #f9f9f9; border: 1px solid #e2e2e2; overflow-y: auto; overflow-x: hidden; position: fixed; top: 70px; bottom: 0; width: 230px; word-wrap: normal; } .nav-groups { list-style-type: none; background: #fff; padding-left: 0; } .nav-group-name { border-bottom: 1px solid #e2e2e2; font-size: 1.1em; font-weight: 100; padding: 15px 0 15px 20px; } .nav-group-name > a { color: #333; } .nav-group-tasks { margin-top: 5px; } .nav-group-task { font-size: 0.9em; list-style-type: none; } .nav-group-task a { color: #888; } .main-content { background-color: #fff; border: 1px solid #e2e2e2; margin-left: 246px; position: absolute; overflow: hidden; padding-bottom: 60px; top: 70px; width: 734px; } .main-content p, .main-content a, .main-content code, .main-content em, .main-content ul, .main-content table, .main-content blockquote { margin-bottom: 1em; } .main-content p { line-height: 1.8em; } .main-content section .section:first-child { margin-top: 0; padding-top: 0; } .main-content section .task-group-section .task-group:first-of-type { padding-top: 10px; } .main-content section .task-group-section .task-group:first-of-type .section-name { padding-top: 15px; } .section { padding: 0 25px; } .highlight { background-color: #eee; padding: 10px 12px; border: 1px solid #e2e2e2; border-radius: 4px; overflow-x: auto; } .declaration .highlight { overflow-x: initial; padding: 0 40px 40px 0; margin-bottom: -25px; background-color: transparent; border: none; } .section-name { margin: 0; margin-left: 18px; } .task-group-section { padding-left: 6px; border-top: 1px solid #e2e2e2; } .task-group { padding-top: 0px; } .task-name-container a[name]:before { content: ""; display: block; padding-top: 70px; margin: -70px 0 0; } .item { padding-top: 8px; width: 100%; list-style-type: none; } .item a[name]:before { content: ""; display: block; padding-top: 70px; margin: -70px 0 0; } .item code { background-color: transparent; padding: 0; } .item .token { padding-left: 3px; margin-left: 15px; font-size: 11.9px; } .item .declaration-note { font-size: .85em; color: gray; font-style: italic; } .pointer-container { border-bottom: 1px solid #e2e2e2; left: -23px; padding-bottom: 13px; position: relative; width: 110%; } .pointer { background: #f9f9f9; border-left: 1px solid #e2e2e2; border-top: 1px solid #e2e2e2; height: 12px; left: 21px; top: -7px; -webkit-transform: rotate(45deg); -moz-transform: rotate(45deg); -o-transform: rotate(45deg); transform: rotate(45deg); position: absolute; width: 12px; } .height-container { display: none; left: -25px; padding: 0 25px; position: relative; width: 100%; overflow: hidden; } .height-container .section { background: #f9f9f9; border-bottom: 1px solid #e2e2e2; left: -25px; position: relative; width: 100%; padding-top: 10px; padding-bottom: 5px; } .aside, .language { padding: 6px 12px; margin: 12px 0; border-left: 5px solid #dddddd; overflow-y: hidden; } .aside .aside-title, .language .aside-title { font-size: 9px; letter-spacing: 2px; text-transform: uppercase; padding-bottom: 0; margin: 0; color: #aaa; -webkit-user-select: none; } .aside p:last-child, .language p:last-child { margin-bottom: 0; } .language { border-left: 5px solid #cde9f4; } .language .aside-title { color: #4b8afb; } .aside-warning { border-left: 5px solid #ff6666; } .aside-warning .aside-title { color: #ff0000; } .graybox { border-collapse: collapse; width: 100%; } .graybox p { margin: 0; word-break: break-word; min-width: 50px; } .graybox td { border: 1px solid #e2e2e2; padding: 5px 25px 5px 10px; vertical-align: middle; } .graybox tr td:first-of-type { text-align: right; padding: 7px; vertical-align: top; word-break: normal; width: 40px; } .slightly-smaller { font-size: 0.9em; } #footer { position: absolute; bottom: 10px; margin-left: 25px; } #footer p { margin: 0; color: #aaa; font-size: 0.8em; } html.dash header, html.dash #breadcrumbs, html.dash .sidebar { display: none; } html.dash .main-content { width: 980px; margin-left: 0; border: none; width: 100%; top: 0; padding-bottom: 0; } html.dash .height-container { display: block; } html.dash .item .token { margin-left: 0; } html.dash .content-wrapper { width: auto; } html.dash #footer { position: static; } ================================================ FILE: docs/docsets/RAMAnimatedTabBarDemo.docset/Contents/Resources/Documents/index.html ================================================ RAMAnimatedTabBarDemo Reference

RAMAnimatedTabBarDemo Docs (100% documented)

header

RAMAnimatedTabBarController

CocoaPods CocoaPods CocoaPods Carthage compatible Twitter Travis

RAMAnimatedTabBarController is a Swift module for adding animation to tabbar items. It has pre-set of animations which we prepare for you, and ability to use any custom animation you want. With this module you can make your tabbar alive like our shot on dribbble:

Animation

The iPhone mockup available here.

Screencast from our Demo

Animation

Requirements

  • iOS 7.0+
  • Xcode 6.1

Installation

Just add the RAMAnimatedTabBarController folder to your project.

or use CocoaPods with Podfile: ruby pod 'RAMAnimatedTabBarController'

or Carthage users can simply add to their Cartfile: github "Ramotion/animated-tab-bar"

Usage

  1. Create a new UITabBarController in your storyboard or nib.

  2. Set the class of the UITabBarController to RAMAnimatedTabBarController in your Storyboard or nib.

  3. For each UITabBarItem, set the class to RAMAnimatedTabBarItem.

  4. Add a custom image icon for each RAMAnimatedTabBarItem

  5. Add animation for each RAMAnimatedTabBarItem :

    • drag and drop an NSObject item into your ViewController
    • set its class to ANIMATION_CLASS (where ANIMATION_CLASS is the class name of the animation you want to use)
    • connect the outlet animation in RAMAnimatedTabBarItem to your ANIMATION_CLASS Demonstration video for step 5

Included Animations

  • RAMBounceAnimation
  • RAMLeftRotationAnimation
  • RAMRightRotationAnimation
  • RAMFlipLeftTransitionItemAnimations
  • RAMFlipRightTransitionItemAnimations
  • RAMFlipTopTransitionItemAnimations
  • RAMFlipBottomTransitionItemAnimations
  • RAMFrameItemAnimation
  • RAMFumeAnimation

Creating Custom Animations

  1. Create a new class which inherits from RAMItemAnimation:
     class NewAnimation : RAMItemAnimation
  1. Implement the methods in RAMItemAnimationProtocol:
    // method call when Tab Bar Item is selected
    override func playAnimation(icon : UIImageView, textLable : UILabel) {
      // add animation
    }
    // method call when Tab Bar Item is deselected
    override func deselectAnimation(icon : UIImageView, textLable : UILabel, defaultTextColor : UIColor) {
      // add animation
    }
    // method call when TabBarController did load
    override func selectedState(icon : UIImageView, textLable : UILabel) {
      // set selected state  
    }
  1. Example:
class RAMBounceAnimation : RAMItemAnimation {

    override func playAnimation(icon : UIImageView, textLable : UILabel) {
        playBounceAnimation(icon)
        textLable.textColor = textSelectedColor
    }

    override func deselectAnimation(icon : UIImageView, textLable : UILabel, defaultTextColor : UIColor) {
        textLable.textColor = defaultTextColor
    }

    override func selectedState(icon : UIImageView, textLable : UILabel) {
        textLable.textColor = textSelectedColor
    }

    func playBounceAnimation(icon : UIImageView) {

        let bounceAnimation = CAKeyframeAnimation(keyPath: "transform.scale")
        bounceAnimation.values = [1.0 ,1.4, 0.9, 1.15, 0.95, 1.02, 1.0]
        bounceAnimation.duration = NSTimeInterval(duration)
        bounceAnimation.calculationMode = kCAAnimationCubic

        icon.layer.addAnimation(bounceAnimation, forKey: "bounceAnimation")
    }
}

About

The project maintained by app development agency Ramotion Inc. See our other open-source projects or hire us to design, develop, and grow your product.

Twitter URL Twitter Follow

================================================ FILE: docs/docsets/RAMAnimatedTabBarDemo.docset/Contents/Resources/Documents/js/jazzy.js ================================================ window.jazzy = {'docset': false} if (typeof window.dash != 'undefined') { document.documentElement.className += ' dash' window.jazzy.docset = true } if (navigator.userAgent.match(/xcode/i)) { document.documentElement.className += ' xcode' window.jazzy.docset = true } // On doc load, toggle the URL hash discussion if present $(document).ready(function() { if (!window.jazzy.docset) { var linkToHash = $('a[href="' + window.location.hash +'"]'); linkToHash.trigger("click"); } }); // On token click, toggle its discussion and animate token.marginLeft $(".token").click(function(event) { if (window.jazzy.docset) { return; } var link = $(this); var animationDuration = 300; var tokenOffset = "15px"; var original = link.css('marginLeft') == tokenOffset; link.animate({'margin-left':original ? "0px" : tokenOffset}, animationDuration); $content = link.parent().parent().next(); $content.slideToggle(animationDuration); // Keeps the document from jumping to the hash. var href = $(this).attr('href'); if (history.pushState) { history.pushState({}, '', href); } else { location.hash = href; } event.preventDefault(); }); ================================================ FILE: docs/docsets/RAMAnimatedTabBarDemo.docset/Contents/Resources/Documents/undocumented.txt ================================================ ================================================ FILE: docs/index.html ================================================ RAMAnimatedTabBarDemo Reference

RAMAnimatedTabBarDemo Docs (100% documented)

header

RAMAnimatedTabBarController

CocoaPods CocoaPods CocoaPods Carthage compatible Twitter Travis

RAMAnimatedTabBarController is a Swift module for adding animation to tabbar items. It has pre-set of animations which we prepare for you, and ability to use any custom animation you want. With this module you can make your tabbar alive like our shot on dribbble:

Animation

The iPhone mockup avaiLabel here.

Screencast from our Demo

Animation

Requirements

  • iOS 7.0+
  • Xcode 6.1

Installation

Just add the RAMAnimatedTabBarController folder to your project.

or use CocoaPods with Podfile: ruby pod 'RAMAnimatedTabBarController'

or Carthage users can simply add to their Cartfile: github "Ramotion/animated-tab-bar"

Usage

  1. Create a new UITabBarController in your storyboard or nib.

  2. Set the class of the UITabBarController to RAMAnimatedTabBarController in your Storyboard or nib.

  3. For each UITabBarItem, set the class to RAMAnimatedTabBarItem.

  4. Add a custom image icon for each RAMAnimatedTabBarItem

  5. Add animation for each RAMAnimatedTabBarItem :

    • drag and drop an NSObject item into your ViewController
    • set its class to ANIMATION_CLASS (where ANIMATION_CLASS is the class name of the animation you want to use)
    • connect the outlet animation in RAMAnimatedTabBarItem to your ANIMATION_CLASS Demonstration video for step 5

Included Animations

  • RAMBounceAnimation
  • RAMLeftRotationAnimation
  • RAMRightRotationAnimation
  • RAMFlipLeftTransitionItemAnimations
  • RAMFlipRightTransitionItemAnimations
  • RAMFlipTopTransitionItemAnimations
  • RAMFlipBottomTransitionItemAnimations
  • RAMFrameItemAnimation
  • RAMFumeAnimation

Creating Custom Animations

  1. Create a new class which inherits from RAMItemAnimation:
     class NewAnimation : RAMItemAnimation
  1. Implement the methods in RAMItemAnimationProtocol:
    // method call when Tab Bar Item is selected
    override func playAnimation(icon : UIImageView, textLabel : UILabel) {
      // add animation
    }
    // method call when Tab Bar Item is deselected
    override func deselectAnimation(icon : UIImageView, textLabel : UILabel, defaultTextColor : UIColor) {
      // add animation
    }
    // method call when TabBarController did load
    override func selectedState(icon : UIImageView, textLabel : UILabel) {
      // set selected state  
    }
  1. Example:
class RAMBounceAnimation : RAMItemAnimation {

    override func playAnimation(icon : UIImageView, textLabel : UILabel) {
        playBounceAnimation(icon)
        textLabel.textColor = textSelectedColor
    }

    override func deselectAnimation(icon : UIImageView, textLabel : UILabel, defaultTextColor : UIColor) {
        textLabel.textColor = defaultTextColor
    }

    override func selectedState(icon : UIImageView, textLabel : UILabel) {
        textLabel.textColor = textSelectedColor
    }

    func playBounceAnimation(icon : UIImageView) {

        let bounceAnimation = CAKeyframeAnimation(keyPath: "transform.scale")
        bounceAnimation.values = [1.0 ,1.4, 0.9, 1.15, 0.95, 1.02, 1.0]
        bounceAnimation.duration = NSTimeInterval(duration)
        bounceAnimation.calculationMode = kCAAnimationCubic

        icon.layer.addAnimation(bounceAnimation, forKey: "bounceAnimation")
    }
}

About

The project maintained by app development agency Ramotion Inc. See our other open-source projects or hire us to design, develop, and grow your product.

Twitter URL Twitter Follow

================================================ FILE: docs/js/jazzy.js ================================================ window.jazzy = {'docset': false} if (typeof window.dash != 'undefined') { document.documentElement.className += ' dash' window.jazzy.docset = true } if (navigator.userAgent.match(/xcode/i)) { document.documentElement.className += ' xcode' window.jazzy.docset = true } // On doc load, toggle the URL hash discussion if present $(document).ready(function() { if (!window.jazzy.docset) { var linkToHash = $('a[href="' + window.location.hash +'"]'); linkToHash.trigger("click"); } }); // On token click, toggle its discussion and animate token.marginLeft $(".token").click(function(event) { if (window.jazzy.docset) { return; } var link = $(this); var animationDuration = 300; var tokenOffset = "15px"; var original = link.css('marginLeft') == tokenOffset; link.animate({'margin-left':original ? "0px" : tokenOffset}, animationDuration); $content = link.parent().parent().next(); $content.slideToggle(animationDuration); // Keeps the document from jumping to the hash. var href = $(this).attr('href'); if (history.pushState) { history.pushState({}, '', href); } else { location.hash = href; } event.preventDefault(); }); ================================================ FILE: docs/undocumented.txt ================================================