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:
[](http://cocoapods.org/pods/RAMAnimatedTabBarController)
[](http://cocoapods.org/pods/RAMAnimatedTabBarController)
[](https://github.com/Ramotion/animated-tab-bar)
[](https://developer.apple.com/swift/)
[](http://twitter.com/Ramotion)
[](https://travis-ci.org/Ramotion/animated-tab-bar)
[](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 Reference
RAMAnimatedTabBarController Class Reference
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 )
Return Value
A newly initialized RAMAnimatedTabBarController object.
Change selected color for each UITabBarItem
Declaration
Swift
public func changeSelectedColor ( textSelectedColor : UIColor , iconSelectedColor : UIColor )
Parameters
textSelectedColor
iconSelectedColor
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 Reference
RAMAnimatedTabBarItem Class Reference
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
Declaration
Swift
public func playAnimation ()
Start unselected animation
Declaration
Swift
public func deselectAnimation ()
Set selected state without animation
Declaration
Swift
public func selectedState ()
Declaration
Swift
override public var badgeValue : String ?
================================================
FILE: docs/Classes/RAMBounceAnimation.html
================================================
RAMBounceAnimation Class Reference
RAMAnimatedTabBarDemo Reference
RAMBounceAnimation Class Reference
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 Reference
RAMFrameItemAnimation Class Reference
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 Reference
RAMFumeAnimation Class Reference
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 Reference
RAMItemAnimation Class Reference
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 Reference
RAMRotationAnimation Class Reference
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 Reference
RAMTransitionItemAnimations Class Reference
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
Classes
The following classes are available globally.
The RAMFrameItemAnimation class provides keyframe animation.
See more
Declaration
Swift
public class RAMFrameItemAnimation : RAMItemAnimation
Declaration
Swift
public class RAMAnimatedTabBarItem : UITabBarItem
UITabBarController with item animations
See more
Declaration
Swift
public class RAMAnimatedTabBarController : UITabBarController
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
Declaration
Swift
public class RAMTransitionItemAnimations : 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 Reference
RAMAnimatedTabBarController Class Reference
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 )
Return Value
A newly initialized RAMAnimatedTabBarController object.
Change selected color for each UITabBarItem
Declaration
Swift
public func changeSelectedColor ( textSelectedColor : UIColor , iconSelectedColor : UIColor )
Parameters
textSelectedColor
iconSelectedColor
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 Reference
RAMAnimatedTabBarItem Class Reference
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
Declaration
Swift
public func playAnimation ()
Start unselected animation
Declaration
Swift
public func deselectAnimation ()
Set selected state without animation
Declaration
Swift
public func selectedState ()
Declaration
Swift
override public var badgeValue : String ?
================================================
FILE: docs/docsets/RAMAnimatedTabBarDemo.docset/Contents/Resources/Documents/Classes/RAMBounceAnimation.html
================================================
RAMBounceAnimation Class Reference
RAMAnimatedTabBarDemo Reference
RAMBounceAnimation Class Reference
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 Reference
RAMFrameItemAnimation Class Reference
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 Reference
RAMFumeAnimation Class Reference
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 Reference
RAMItemAnimation Class Reference
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 Reference
RAMRotationAnimation Class Reference
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 Reference
RAMTransitionItemAnimations Class Reference
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
Classes
The following classes are available globally.
The RAMFrameItemAnimation class provides keyframe animation.
See more
Declaration
Swift
public class RAMFrameItemAnimation : RAMItemAnimation
Declaration
Swift
public class RAMAnimatedTabBarItem : UITabBarItem
UITabBarController with item animations
See more
Declaration
Swift
public class RAMAnimatedTabBarController : UITabBarController
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
Declaration
Swift
public class RAMTransitionItemAnimations : 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 Reference
RAMAnimatedTabBarDemo Reference
RAMAnimatedTabBarController
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 :
The iPhone mockup available here .
Screencast from our Demo
Requirements
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
Create a new UITabBarController in your storyboard or nib.
Set the class of the UITabBarController to RAMAnimatedTabBarController in your Storyboard or nib.
For each UITabBarItem, set the class to RAMAnimatedTabBarItem.
Add a custom image icon for each RAMAnimatedTabBarItem
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
Create a new class which inherits from RAMItemAnimation:
class NewAnimation : RAMItemAnimation
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
}
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.
================================================
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 Reference
RAMAnimatedTabBarDemo Reference
RAMAnimatedTabBarController
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 :
The iPhone mockup avaiLabel here .
Screencast from our Demo
Requirements
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
Create a new UITabBarController in your storyboard or nib.
Set the class of the UITabBarController to RAMAnimatedTabBarController in your Storyboard or nib.
For each UITabBarItem, set the class to RAMAnimatedTabBarItem.
Add a custom image icon for each RAMAnimatedTabBarItem
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
Create a new class which inherits from RAMItemAnimation:
class NewAnimation : RAMItemAnimation
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
}
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.
================================================
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
================================================