├── .gitignore ├── AnimatedTabBar.gif ├── AnimatedTabBar.podspec ├── AnimatedTabBar ├── Assets │ └── .gitkeep └── Classes │ ├── AnimatedTabBar.swift │ ├── AnimatedTabBarAppearance.swift │ ├── AnimatedTabBarController.swift │ ├── AnimatedTabBarView.swift │ ├── CommonUIView.swift │ ├── LabelAndDot.swift │ └── Utils.swift ├── Example ├── .DS_Store ├── Example.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ ├── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ │ └── xcuserdata │ │ │ └── albertogarcia-munoz.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ └── xcuserdata │ │ └── albertogarcia-munoz.xcuserdatad │ │ └── xcschemes │ │ └── xcschememanagement.plist ├── Example.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ └── xcuserdata │ │ └── albertogarcia-munoz.xcuserdatad │ │ └── UserInterfaceState.xcuserstate ├── Example │ ├── .DS_Store │ ├── AppDelegate.swift │ ├── Assets.xcassets │ │ ├── .DS_Store │ │ ├── AppIcon.appiconset │ │ │ └── Contents.json │ │ ├── Contents.json │ │ ├── home.imageset │ │ │ ├── Contents.json │ │ │ ├── icons8-home-page-30.png │ │ │ ├── icons8-home-page-31.png │ │ │ └── icons8-home-page-32.png │ │ ├── search.imageset │ │ │ ├── Contents.json │ │ │ ├── icons8-search-30.png │ │ │ ├── icons8-search-31.png │ │ │ └── icons8-search-32.png │ │ └── thunder.imageset │ │ │ ├── Contents.json │ │ │ ├── icons8-lightning-bolt-30-2.png │ │ │ ├── icons8-lightning-bolt-30-3.png │ │ │ └── icons8-lightning-bolt-30-4.png │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ ├── Info.plist │ └── ViewController.swift ├── Podfile ├── Podfile.lock └── Pods │ ├── Local Podspecs │ └── AnimatedTabBar.podspec.json │ ├── Manifest.lock │ ├── Pods.xcodeproj │ ├── project.pbxproj │ └── xcuserdata │ │ └── albertogarcia-munoz.xcuserdatad │ │ └── xcschemes │ │ ├── AnimatedTabBar.xcscheme │ │ ├── Pods-Example.xcscheme │ │ └── xcschememanagement.plist │ └── Target Support Files │ ├── AnimatedTabBar │ ├── AnimatedTabBar-Info.plist │ ├── AnimatedTabBar-dummy.m │ ├── AnimatedTabBar-prefix.pch │ ├── AnimatedTabBar-umbrella.h │ ├── AnimatedTabBar.modulemap │ └── AnimatedTabBar.xcconfig │ └── Pods-Example │ ├── Pods-Example-Info.plist │ ├── Pods-Example-acknowledgements.markdown │ ├── Pods-Example-acknowledgements.plist │ ├── Pods-Example-dummy.m │ ├── Pods-Example-frameworks.sh │ ├── Pods-Example-umbrella.h │ ├── Pods-Example.debug.xcconfig │ ├── Pods-Example.modulemap │ └── Pods-Example.release.xcconfig ├── LICENSE ├── README.md └── _Pods.xcodeproj /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | -------------------------------------------------------------------------------- /AnimatedTabBar.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlbGarciam/AnimatedTabBar/b3aa409aaa3056a0ff40f9050a634369ffae7503/AnimatedTabBar.gif -------------------------------------------------------------------------------- /AnimatedTabBar.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # Be sure to run `pod lib lint AnimatedTabBar.podspec' to ensure this is a 3 | # valid spec before submitting. 4 | # 5 | # Any lines starting with a # are optional, but their use is encouraged 6 | # To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html 7 | # 8 | 9 | Pod::Spec.new do |s| 10 | s.name = 'AnimatedTabBar' 11 | s.version = '0.1.7' 12 | s.summary = 'Animated tabbar is Swift UI module framework for adding animations to iOS tabBar items and icons.' 13 | 14 | # This description is used to generate tags and improve search results. 15 | # * Think: What does it do? Why did you write it? What is the focus? 16 | # * Try to keep it short, snappy and to the point. 17 | # * Write the description between the DESC delimiters below. 18 | # * Finally, don't worry about the indent, CocoaPods strips it! 19 | 20 | s.description = <<-DESC 21 | AnimatedTabBar is a Swift UI module library for adding animation to iOS tabBar items and icons. iOS library made by @AlbGarciam 22 | DESC 23 | 24 | s.homepage = 'https://github.com/AlbGarciam/AnimatedTabBar' 25 | # s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' 26 | s.license = { :type => 'MIT', :file => 'LICENSE' } 27 | s.author = { 'alb.garciam@gmail.com' => 'alb.garciam@gmail.com' } 28 | s.source = { :git => 'https://github.com/AlbGarciam/AnimatedTabBar.git', :tag => s.version.to_s } 29 | # s.social_media_url = 'https://twitter.com/' 30 | 31 | s.platform = :ios 32 | s.ios.deployment_target = '10.0' 33 | s.swift_version = '5' 34 | 35 | s.source_files = 'AnimatedTabBar/Classes/**/*' 36 | 37 | # s.resource_bundles = { 38 | # 'AnimatedTabBar' => ['AnimatedTabBar/Assets/*.png'] 39 | # } 40 | 41 | end 42 | -------------------------------------------------------------------------------- /AnimatedTabBar/Assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlbGarciam/AnimatedTabBar/b3aa409aaa3056a0ff40f9050a634369ffae7503/AnimatedTabBar/Assets/.gitkeep -------------------------------------------------------------------------------- /AnimatedTabBar/Classes/AnimatedTabBar.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AnimatedTabBar.swift 3 | // TabBarTest 4 | // 5 | // Created by Alberto García-Muñoz on 17/12/2018. 6 | // Copyright © 2018 Alberto García-Muñoz. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public protocol AnimatedTabBarDelegate : AnyObject { 12 | var numberOfItems : Int { get } 13 | func tabBar(_ tabBar: AnimatedTabBar, itemFor index: Int) -> AnimatedTabBarItem 14 | func initialIndex(_ tabBar: AnimatedTabBar) -> Int? 15 | } 16 | 17 | internal protocol AnimatedTabBarInternalDelegate : AnyObject { 18 | func selected(_ tabbar: AnimatedTabBar, newItem: UIViewController?, oldItem: UIViewController?) 19 | } 20 | 21 | public struct AnimatedTabBarItem { 22 | public var icon: UIImage 23 | public var title: String 24 | public var controller: UIViewController 25 | 26 | public init(icon: UIImage, title: String, controller: UIViewController) { 27 | self.icon = icon 28 | self.title = title 29 | self.controller = controller 30 | } 31 | } 32 | 33 | open class AnimatedTabBar: CommonUIView { 34 | 35 | private var contentView : UIView! 36 | internal var stackView: UIStackView! 37 | open weak var delegate: AnimatedTabBarDelegate? 38 | internal weak var internalDelegate : AnimatedTabBarInternalDelegate? 39 | 40 | internal weak var containerView : UIView? 41 | private(set) var selected: AnimatedTabBarView? { 42 | didSet { 43 | internalDelegate?.selected(self, 44 | newItem: selected?.associatedController, 45 | oldItem: oldValue?.associatedController) 46 | } 47 | } 48 | 49 | override func commonInit() { 50 | super.commonInit() 51 | contentView = UIView() 52 | stackView = UIStackView() 53 | } 54 | 55 | override open func willMove(toSuperview newSuperview: UIView?) { 56 | super.willMove(toSuperview: newSuperview) 57 | configureContentView() 58 | if delegate?.numberOfItems ?? 0 > 0 { 59 | configureStackView() 60 | fillStackView() 61 | } 62 | } 63 | 64 | open override func didMoveToSuperview() { 65 | super.didMoveToSuperview() 66 | selectItem(at: selected?.position ?? delegate?.initialIndex(self) ?? 0) 67 | } 68 | 69 | private func configureContentView() { 70 | contentView.backgroundColor = .clear 71 | contentView.translatesAutoresizingMaskIntoConstraints = false 72 | addSubview(contentView) 73 | contentView.layer.masksToBounds = true 74 | contentView.widthAnchor.constraint(equalTo: widthAnchor, multiplier: 1.0).isActive = true 75 | contentView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true 76 | contentView.topAnchor.constraint(equalTo: topAnchor).isActive = true 77 | contentView.heightAnchor.constraint(equalToConstant: heightOfStackView).isActive = true 78 | } 79 | 80 | private func configureStackView() { 81 | stackView.alignment = .center 82 | stackView.distribution = .fillEqually 83 | stackView.axis = .horizontal 84 | stackView.translatesAutoresizingMaskIntoConstraints = false 85 | addSubview(stackView) 86 | 87 | stackView.widthAnchor.constraint(equalTo: contentView.widthAnchor, multiplier: 1.0).isActive = true 88 | stackView.heightAnchor.constraint(equalTo: contentView.heightAnchor, multiplier: 1.0).isActive = true 89 | stackView.centerXAnchor.constraint(equalTo: contentView.centerXAnchor).isActive = true 90 | stackView.centerYAnchor.constraint(equalTo: contentView.centerYAnchor).isActive = true 91 | } 92 | 93 | private func fillStackView() { 94 | for i in 0 ..< ( delegate?.numberOfItems ?? 0 ) { 95 | if let item = delegate?.tabBar(self, itemFor: i) { 96 | // Add View to the stack 97 | let view = AnimatedTabBarView() 98 | view.delegate = self 99 | stackView.addArrangedSubview(view) 100 | view.setupView(model: item) 101 | view.position = i 102 | view.isSelected = false 103 | } 104 | } 105 | } 106 | 107 | private func selectItem(at position: Int) { 108 | if position < stackView.arrangedSubviews.count && position >= 0 { 109 | selected?.isSelected = false 110 | selected = stackView.arrangedSubviews[position] as? AnimatedTabBarView 111 | selected?.isSelected = true 112 | } 113 | } 114 | } 115 | 116 | extension AnimatedTabBar : AnimatedTabBarViewDelegate { 117 | func didTapped(on item: AnimatedTabBarView) { 118 | if item.isSelected { // move to root 119 | if AnimatedTabBarAppearance.shared.popsToRoot, 120 | let nav = selected?.associatedController as? UINavigationController { 121 | nav.popToRootViewController(animated: true) 122 | } 123 | } else { // replace view 124 | selectItem(at: item.position) 125 | } 126 | } 127 | } 128 | -------------------------------------------------------------------------------- /AnimatedTabBar/Classes/AnimatedTabBarAppearance.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SoundTabBarAppearance.swift 3 | // TabBarTest 4 | // 5 | // Created by Alberto García-Muñoz on 23/12/2018. 6 | // Copyright © 2018 Alberto García-Muñoz. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | open class AnimatedTabBarAppearance { 13 | public static let shared : AnimatedTabBarAppearance = AnimatedTabBarAppearance() 14 | 15 | /// Animation duration 16 | open var animationDuration: TimeInterval = 1.5 17 | 18 | /// Dot color 19 | open var dotColor: UIColor = UIColor(red: 5/255, 20 | green: 9/255, 21 | blue: 80/255, 22 | alpha: 1) 23 | 24 | /// Text color in tabbar 25 | open var textColor: UIColor = UIColor(red: 5/255, 26 | green: 9/255, 27 | blue: 80/255, 28 | alpha: 1) 29 | 30 | /// Text font in tabbar 31 | open var textFont: UIFont = UIFont(name: "AppleSDGothicNeo-Bold", size: 10) ?? .boldSystemFont(ofSize: 10) 32 | 33 | /// Background color 34 | open var backgroundColor: UIColor = .white 35 | 36 | /// Pops to root if true 37 | open var popsToRoot: Bool = true 38 | } 39 | -------------------------------------------------------------------------------- /AnimatedTabBar/Classes/AnimatedTabBarController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AnimatedTabBarController.swift 3 | // TabBarTest 4 | // 5 | // Created by Alberto García-Muñoz on 30/12/2018. 6 | // Copyright © 2018 Alberto García-Muñoz. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | open class AnimatedTabBarController: UIViewController { 12 | open var tabBar : AnimatedTabBar! 13 | open var contentView : UIView! 14 | open weak var delegate: AnimatedTabBarDelegate? 15 | 16 | private var heightConstraint : NSLayoutConstraint! 17 | 18 | override public init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { 19 | super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 20 | } 21 | 22 | required public init?(coder aDecoder: NSCoder) { 23 | super.init(coder: aDecoder) 24 | } 25 | 26 | override open func viewDidLoad() { 27 | super.viewDidLoad() 28 | addContentView() 29 | addTabBar() 30 | contentView.bottomAnchor.constraint(equalTo: tabBar.topAnchor).isActive = true 31 | } 32 | 33 | override open func viewDidAppear(_ animated: Bool) { 34 | super.viewDidAppear(animated) 35 | 36 | heightConstraint = NSLayoutConstraint(item: tabBar!, 37 | attribute: .height, 38 | relatedBy: .equal, 39 | toItem: nil, 40 | attribute: .notAnAttribute, 41 | multiplier: 1, 42 | constant: heightOfStackView+bottomSafeAreaHeight) 43 | 44 | tabBar.addConstraint(heightConstraint) 45 | } 46 | open override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { 47 | super.viewWillTransition(to: size, with: coordinator) 48 | coordinator.animate(alongsideTransition: { [weak self] (_) in 49 | self?.addTabBarConstraint() 50 | }, completion: nil) 51 | } 52 | 53 | private func addTabBarConstraint() { 54 | if let heightConstraint = heightConstraint { 55 | heightConstraint.constant = heightOfStackView+bottomSafeAreaHeight 56 | } else { 57 | let heightConstraint = NSLayoutConstraint(item: tabBar!, 58 | attribute: .height, 59 | relatedBy: .equal, 60 | toItem: nil, 61 | attribute: .notAnAttribute, 62 | multiplier: 1, 63 | constant: heightOfStackView+bottomSafeAreaHeight) 64 | tabBar.addConstraint(heightConstraint) 65 | self.heightConstraint = heightConstraint 66 | } 67 | } 68 | 69 | private func addTabBar() { 70 | let tabBar = AnimatedTabBar() 71 | tabBar.internalDelegate = self 72 | tabBar.containerView = contentView 73 | tabBar.backgroundColor = AnimatedTabBarAppearance.shared.backgroundColor 74 | tabBar.translatesAutoresizingMaskIntoConstraints = false 75 | tabBar.delegate = delegate 76 | tabBar.clipsToBounds = true 77 | view.addSubview(tabBar) 78 | 79 | tabBar.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true 80 | tabBar.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 1).isActive = true 81 | tabBar.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 82 | self.tabBar = tabBar 83 | } 84 | 85 | private func addContentView() { 86 | let contentView = UIView() 87 | contentView.translatesAutoresizingMaskIntoConstraints = false 88 | view.addSubview(contentView) 89 | 90 | contentView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true 91 | contentView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true 92 | contentView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true 93 | self.contentView = contentView 94 | } 95 | } 96 | 97 | extension AnimatedTabBarController : AnimatedTabBarInternalDelegate { 98 | func selected(_ tabbar: AnimatedTabBar, newItem: UIViewController?, oldItem: UIViewController?) { 99 | if let oldController = oldItem { 100 | oldController.willMove(toParent: nil) 101 | oldController.removeFromParent() 102 | oldController.view.removeFromSuperview() 103 | oldController.didMove(toParent: nil) 104 | } 105 | if let newController = newItem { 106 | newController.willMove(toParent: self) 107 | addChild(newController) 108 | contentView.addSubview(newController.view) 109 | newController.view.frame = contentView.bounds 110 | newController.didMove(toParent: self) 111 | } 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /AnimatedTabBar/Classes/AnimatedTabBarView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AnimatedTabBarView.swift 3 | // TabBarTest 4 | // 5 | // Created by Alberto García-Muñoz on 17/12/2018. 6 | // Copyright © 2018 Alberto García-Muñoz. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | protocol AnimatedTabBarViewDelegate: AnyObject { 12 | func didTapped(on item: AnimatedTabBarView) 13 | } 14 | 15 | class AnimatedTabBarView: CommonUIView { 16 | 17 | private var contentView: UIView! 18 | private var imageView: UIImageView! 19 | private var labelAndDot : LabelAndDot! 20 | internal var position : Int = -1 21 | 22 | internal weak var delegate: AnimatedTabBarViewDelegate? 23 | internal var associatedController: UIViewController? 24 | 25 | private var topConstraint: NSLayoutConstraint! 26 | internal var isSelected : Bool! { 27 | didSet { 28 | let newValue = isSelected ?? false 29 | let imageHeight = -imageView.bounds.height 30 | labelAndDot.isSelected = isSelected 31 | UIView.animate(withDuration: AnimatedTabBarAppearance.shared.animationDuration 32 | , delay: 0, usingSpringWithDamping: 0.45, initialSpringVelocity: 0, options: .curveEaseInOut, animations: { [weak self] in 33 | self?.imageView.alpha = newValue ? 0 : 1 34 | self?.labelAndDot.alpha = newValue ? 1 : 0 35 | self?.topConstraint.constant = newValue ? imageHeight : 0 36 | self?.layoutIfNeeded() 37 | }, completion: nil) 38 | } 39 | } 40 | 41 | override func commonInit() { 42 | super.commonInit() 43 | contentView = UIView() 44 | imageView = UIImageView() 45 | labelAndDot = LabelAndDot() 46 | } 47 | 48 | override func willMove(toSuperview newSuperview: UIView?) { 49 | super.willMove(toSuperview: newSuperview) 50 | configureContentView() 51 | configureImageView() 52 | configureLabelAndDot() 53 | if newSuperview != nil { 54 | let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(AnimatedTabBarView.itemTapped(_:))) 55 | gestureRecognizer.numberOfTapsRequired = 1 56 | addGestureRecognizer(gestureRecognizer) 57 | } else { 58 | gestureRecognizers?.forEach(removeGestureRecognizer) 59 | } 60 | isUserInteractionEnabled = true 61 | } 62 | 63 | override func layoutSubviews() { 64 | super.layoutSubviews() 65 | topConstraint.constant = (isSelected ?? false) ? -imageView.bounds.height : 0 66 | } 67 | 68 | private func configureContentView() { 69 | contentView.backgroundColor = .clear 70 | 71 | contentView.translatesAutoresizingMaskIntoConstraints = false 72 | addSubview(contentView) 73 | 74 | contentView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true 75 | contentView.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true 76 | contentView.heightAnchor.constraint(equalTo: heightAnchor, multiplier: 0.85).isActive = true 77 | contentView.widthAnchor.constraint(equalTo: contentView.heightAnchor, multiplier: 1.0).isActive = true 78 | } 79 | 80 | private func generateTopConstraint() { 81 | topConstraint = NSLayoutConstraint(item: imageView!, 82 | attribute: .top, 83 | relatedBy: .equal, 84 | toItem: contentView, 85 | attribute: .top, 86 | multiplier: 1, 87 | constant: 0) 88 | } 89 | 90 | private func configureImageView() { 91 | imageView.contentMode = .scaleAspectFit 92 | 93 | imageView.translatesAutoresizingMaskIntoConstraints = false 94 | contentView.addSubview(imageView) 95 | 96 | imageView.heightAnchor.constraint(equalTo: contentView.heightAnchor, multiplier: 1).isActive = true 97 | imageView.widthAnchor.constraint(equalTo: contentView.widthAnchor, multiplier: 1).isActive = true 98 | imageView.centerXAnchor.constraint(equalTo: contentView.centerXAnchor).isActive = true 99 | if topConstraint == nil { 100 | generateTopConstraint() 101 | addConstraint(topConstraint) 102 | } 103 | } 104 | 105 | private func configureLabelAndDot() { 106 | labelAndDot.translatesAutoresizingMaskIntoConstraints = false 107 | contentView.addSubview(labelAndDot) 108 | 109 | labelAndDot.heightAnchor.constraint(equalTo: imageView.heightAnchor, multiplier: 1).isActive = true 110 | labelAndDot.widthAnchor.constraint(equalTo: imageView.widthAnchor, multiplier: 1).isActive = true 111 | labelAndDot.centerXAnchor.constraint(equalTo: imageView.centerXAnchor).isActive = true 112 | labelAndDot.topAnchor.constraint(equalTo: imageView.bottomAnchor).isActive = true 113 | } 114 | 115 | func setupView(model: AnimatedTabBarItem) { 116 | self.associatedController = model.controller 117 | labelAndDot.label.text = model.title 118 | imageView.image = model.icon.imageWithInsets(insetDimen: 4) 119 | } 120 | 121 | @objc private func itemTapped(_ sender: UITapGestureRecognizer) { 122 | delegate?.didTapped(on: self) 123 | } 124 | } 125 | 126 | extension UIImage { 127 | func imageWithInsets(insetDimen: CGFloat) -> UIImage { 128 | return imageWithInset(insets: UIEdgeInsets(top: insetDimen, left: insetDimen, bottom: insetDimen, right: insetDimen)) 129 | } 130 | 131 | func imageWithInset(insets: UIEdgeInsets) -> UIImage { 132 | UIGraphicsBeginImageContextWithOptions( 133 | CGSize(width: self.size.width + insets.left + insets.right, 134 | height: self.size.height + insets.top + insets.bottom), false, self.scale) 135 | let origin = CGPoint(x: insets.left, y: insets.top) 136 | self.draw(at: origin) 137 | let imageWithInsets = UIGraphicsGetImageFromCurrentImageContext() 138 | UIGraphicsEndImageContext() 139 | return imageWithInsets! 140 | } 141 | 142 | } 143 | -------------------------------------------------------------------------------- /AnimatedTabBar/Classes/CommonUIView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CommonUIView.swift 3 | // TabBarTest 4 | // 5 | // Created by Alberto García-Muñoz on 23/12/2018. 6 | // Copyright © 2018 Alberto García-Muñoz. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | open class CommonUIView: UIView { 12 | 13 | override public init(frame: CGRect) { 14 | super.init(frame: frame) 15 | commonInit() 16 | } 17 | 18 | required public init?(coder aDecoder: NSCoder) { 19 | super.init(coder: aDecoder) 20 | commonInit() 21 | } 22 | 23 | func commonInit() { 24 | 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /AnimatedTabBar/Classes/LabelAndDot.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LabelAndDot.swift 3 | // TabBarTest 4 | // 5 | // Created by Alberto García-Muñoz on 23/12/2018. 6 | // Copyright © 2018 Alberto García-Muñoz. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class LabelAndDot: CommonUIView { 12 | 13 | var dot: UIView! 14 | var label: UILabel! 15 | var text: String = "" 16 | 17 | var isSelected : Bool = false { 18 | didSet { 19 | let selected = isSelected 20 | UIView.animate(withDuration: AnimatedTabBarAppearance.shared.animationDuration 21 | , delay: 0, usingSpringWithDamping: 0.45, initialSpringVelocity: 0, options: .curveEaseInOut, animations: { [weak self] in 22 | self?.widthConstraint.constant = selected ? 4 : 0 23 | self?.heightConstraint.constant = selected ? 4 : 0 24 | self?.layoutIfNeeded() 25 | }, completion: nil) 26 | } 27 | } 28 | 29 | private var widthConstraint: NSLayoutConstraint! 30 | private var heightConstraint: NSLayoutConstraint! 31 | 32 | override func commonInit() { 33 | super.commonInit() 34 | dot = UIView() 35 | label = UILabel() 36 | } 37 | 38 | override func willMove(toSuperview newSuperview: UIView?) { 39 | super.willMove(toSuperview: newSuperview) 40 | if newSuperview == nil { return } 41 | configureLabel() 42 | configureDot() 43 | } 44 | 45 | private func configureDot() { 46 | dot.backgroundColor = AnimatedTabBarAppearance.shared.dotColor 47 | dot.layer.cornerRadius = 2 48 | 49 | dot.translatesAutoresizingMaskIntoConstraints = false 50 | addSubview(dot) 51 | 52 | widthConstraint = NSLayoutConstraint(item: dot!, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 4) 53 | heightConstraint = NSLayoutConstraint(item: dot!, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 4) 54 | addConstraints([widthConstraint, heightConstraint]) 55 | dot.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true 56 | dot.bottomAnchor.constraint(equalTo: bottomAnchor, constant: 0).isActive = true 57 | } 58 | 59 | private func configureLabel() { 60 | label.text = text 61 | label.font = AnimatedTabBarAppearance.shared.textFont 62 | label.textColor = AnimatedTabBarAppearance.shared.textColor 63 | label.textAlignment = .center 64 | 65 | label.translatesAutoresizingMaskIntoConstraints = false 66 | addSubview(label) 67 | 68 | label.widthAnchor.constraint(equalTo: widthAnchor, multiplier: 1.0).isActive = true 69 | label.heightAnchor.constraint(equalTo: heightAnchor, multiplier: 1.0).isActive = true 70 | label.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true 71 | label.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /AnimatedTabBar/Classes/Utils.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Utils.swift 3 | // TabBarTest 4 | // 5 | // Created by Alberto García-Muñoz on 30/12/2018. 6 | // Copyright © 2018 Alberto García-Muñoz. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | var bottomSafeAreaHeight : CGFloat { 12 | var bottom : CGFloat = 0 13 | if #available(iOS 11.0, *) { 14 | let window = UIApplication.shared.keyWindow 15 | bottom = window?.safeAreaInsets.bottom ?? 0 16 | } 17 | return bottom 18 | } 19 | 20 | var heightOfStackView : CGFloat { 21 | return 49.0 22 | } 23 | -------------------------------------------------------------------------------- /Example/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlbGarciam/AnimatedTabBar/b3aa409aaa3056a0ff40f9050a634369ffae7503/Example/.DS_Store -------------------------------------------------------------------------------- /Example/Example.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 28470B822F34C27F738BC6F7 /* Pods_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F99606EA38D16812F5412D3D /* Pods_Example.framework */; }; 11 | F81E6F602217154200637222 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F81E6F5F2217154200637222 /* AppDelegate.swift */; }; 12 | F81E6F622217154200637222 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F81E6F612217154200637222 /* ViewController.swift */; }; 13 | F81E6F652217154200637222 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F81E6F632217154200637222 /* Main.storyboard */; }; 14 | F81E6F672217154300637222 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F81E6F662217154300637222 /* Assets.xcassets */; }; 15 | F81E6F6A2217154300637222 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F81E6F682217154300637222 /* LaunchScreen.storyboard */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXFileReference section */ 19 | 3E5A3AAE0FF4A4AA4235459C /* Pods-Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example.release.xcconfig"; path = "Target Support Files/Pods-Example/Pods-Example.release.xcconfig"; sourceTree = ""; }; 20 | 68A825C7F8D8A6B9CAB1BE48 /* Pods-Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example.debug.xcconfig"; path = "Target Support Files/Pods-Example/Pods-Example.debug.xcconfig"; sourceTree = ""; }; 21 | F81E6F5C2217154200637222 /* Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 22 | F81E6F5F2217154200637222 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 23 | F81E6F612217154200637222 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 24 | F81E6F642217154200637222 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 25 | F81E6F662217154300637222 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 26 | F81E6F692217154300637222 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 27 | F81E6F6B2217154300637222 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 28 | F99606EA38D16812F5412D3D /* Pods_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 29 | /* End PBXFileReference section */ 30 | 31 | /* Begin PBXFrameworksBuildPhase section */ 32 | F81E6F592217154200637222 /* Frameworks */ = { 33 | isa = PBXFrameworksBuildPhase; 34 | buildActionMask = 2147483647; 35 | files = ( 36 | 28470B822F34C27F738BC6F7 /* Pods_Example.framework in Frameworks */, 37 | ); 38 | runOnlyForDeploymentPostprocessing = 0; 39 | }; 40 | /* End PBXFrameworksBuildPhase section */ 41 | 42 | /* Begin PBXGroup section */ 43 | 6F8147D5917EE7B2AF440023 /* Frameworks */ = { 44 | isa = PBXGroup; 45 | children = ( 46 | F99606EA38D16812F5412D3D /* Pods_Example.framework */, 47 | ); 48 | name = Frameworks; 49 | sourceTree = ""; 50 | }; 51 | F81E6F532217154200637222 = { 52 | isa = PBXGroup; 53 | children = ( 54 | F81E6F5E2217154200637222 /* Example */, 55 | F81E6F5D2217154200637222 /* Products */, 56 | FC535E30AC18A2F38CE0C690 /* Pods */, 57 | 6F8147D5917EE7B2AF440023 /* Frameworks */, 58 | ); 59 | sourceTree = ""; 60 | }; 61 | F81E6F5D2217154200637222 /* Products */ = { 62 | isa = PBXGroup; 63 | children = ( 64 | F81E6F5C2217154200637222 /* Example.app */, 65 | ); 66 | name = Products; 67 | sourceTree = ""; 68 | }; 69 | F81E6F5E2217154200637222 /* Example */ = { 70 | isa = PBXGroup; 71 | children = ( 72 | F81E6F5F2217154200637222 /* AppDelegate.swift */, 73 | F81E6F612217154200637222 /* ViewController.swift */, 74 | F81E6F632217154200637222 /* Main.storyboard */, 75 | F81E6F662217154300637222 /* Assets.xcassets */, 76 | F81E6F682217154300637222 /* LaunchScreen.storyboard */, 77 | F81E6F6B2217154300637222 /* Info.plist */, 78 | ); 79 | path = Example; 80 | sourceTree = ""; 81 | }; 82 | FC535E30AC18A2F38CE0C690 /* Pods */ = { 83 | isa = PBXGroup; 84 | children = ( 85 | 68A825C7F8D8A6B9CAB1BE48 /* Pods-Example.debug.xcconfig */, 86 | 3E5A3AAE0FF4A4AA4235459C /* Pods-Example.release.xcconfig */, 87 | ); 88 | path = Pods; 89 | sourceTree = ""; 90 | }; 91 | /* End PBXGroup section */ 92 | 93 | /* Begin PBXNativeTarget section */ 94 | F81E6F5B2217154200637222 /* Example */ = { 95 | isa = PBXNativeTarget; 96 | buildConfigurationList = F81E6F6E2217154300637222 /* Build configuration list for PBXNativeTarget "Example" */; 97 | buildPhases = ( 98 | 91EC7BB5B02AC01F8C699FC4 /* [CP] Check Pods Manifest.lock */, 99 | F81E6F582217154200637222 /* Sources */, 100 | F81E6F592217154200637222 /* Frameworks */, 101 | F81E6F5A2217154200637222 /* Resources */, 102 | 3035B5C65442FC412CD7DF3C /* [CP] Embed Pods Frameworks */, 103 | ); 104 | buildRules = ( 105 | ); 106 | dependencies = ( 107 | ); 108 | name = Example; 109 | productName = Example; 110 | productReference = F81E6F5C2217154200637222 /* Example.app */; 111 | productType = "com.apple.product-type.application"; 112 | }; 113 | /* End PBXNativeTarget section */ 114 | 115 | /* Begin PBXProject section */ 116 | F81E6F542217154200637222 /* Project object */ = { 117 | isa = PBXProject; 118 | attributes = { 119 | LastSwiftUpdateCheck = 1010; 120 | LastUpgradeCheck = 1010; 121 | ORGANIZATIONNAME = AlbGarciam; 122 | TargetAttributes = { 123 | F81E6F5B2217154200637222 = { 124 | CreatedOnToolsVersion = 10.1; 125 | }; 126 | }; 127 | }; 128 | buildConfigurationList = F81E6F572217154200637222 /* Build configuration list for PBXProject "Example" */; 129 | compatibilityVersion = "Xcode 9.3"; 130 | developmentRegion = en; 131 | hasScannedForEncodings = 0; 132 | knownRegions = ( 133 | en, 134 | Base, 135 | ); 136 | mainGroup = F81E6F532217154200637222; 137 | productRefGroup = F81E6F5D2217154200637222 /* Products */; 138 | projectDirPath = ""; 139 | projectRoot = ""; 140 | targets = ( 141 | F81E6F5B2217154200637222 /* Example */, 142 | ); 143 | }; 144 | /* End PBXProject section */ 145 | 146 | /* Begin PBXResourcesBuildPhase section */ 147 | F81E6F5A2217154200637222 /* Resources */ = { 148 | isa = PBXResourcesBuildPhase; 149 | buildActionMask = 2147483647; 150 | files = ( 151 | F81E6F6A2217154300637222 /* LaunchScreen.storyboard in Resources */, 152 | F81E6F672217154300637222 /* Assets.xcassets in Resources */, 153 | F81E6F652217154200637222 /* Main.storyboard in Resources */, 154 | ); 155 | runOnlyForDeploymentPostprocessing = 0; 156 | }; 157 | /* End PBXResourcesBuildPhase section */ 158 | 159 | /* Begin PBXShellScriptBuildPhase section */ 160 | 3035B5C65442FC412CD7DF3C /* [CP] Embed Pods Frameworks */ = { 161 | isa = PBXShellScriptBuildPhase; 162 | buildActionMask = 2147483647; 163 | files = ( 164 | ); 165 | inputFileListPaths = ( 166 | ); 167 | inputPaths = ( 168 | "${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks.sh", 169 | "${BUILT_PRODUCTS_DIR}/AnimatedTabBar/AnimatedTabBar.framework", 170 | ); 171 | name = "[CP] Embed Pods Frameworks"; 172 | outputFileListPaths = ( 173 | ); 174 | outputPaths = ( 175 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AnimatedTabBar.framework", 176 | ); 177 | runOnlyForDeploymentPostprocessing = 0; 178 | shellPath = /bin/sh; 179 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks.sh\"\n"; 180 | showEnvVarsInLog = 0; 181 | }; 182 | 91EC7BB5B02AC01F8C699FC4 /* [CP] Check Pods Manifest.lock */ = { 183 | isa = PBXShellScriptBuildPhase; 184 | buildActionMask = 2147483647; 185 | files = ( 186 | ); 187 | inputFileListPaths = ( 188 | ); 189 | inputPaths = ( 190 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 191 | "${PODS_ROOT}/Manifest.lock", 192 | ); 193 | name = "[CP] Check Pods Manifest.lock"; 194 | outputFileListPaths = ( 195 | ); 196 | outputPaths = ( 197 | "$(DERIVED_FILE_DIR)/Pods-Example-checkManifestLockResult.txt", 198 | ); 199 | runOnlyForDeploymentPostprocessing = 0; 200 | shellPath = /bin/sh; 201 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 202 | showEnvVarsInLog = 0; 203 | }; 204 | /* End PBXShellScriptBuildPhase section */ 205 | 206 | /* Begin PBXSourcesBuildPhase section */ 207 | F81E6F582217154200637222 /* Sources */ = { 208 | isa = PBXSourcesBuildPhase; 209 | buildActionMask = 2147483647; 210 | files = ( 211 | F81E6F622217154200637222 /* ViewController.swift in Sources */, 212 | F81E6F602217154200637222 /* AppDelegate.swift in Sources */, 213 | ); 214 | runOnlyForDeploymentPostprocessing = 0; 215 | }; 216 | /* End PBXSourcesBuildPhase section */ 217 | 218 | /* Begin PBXVariantGroup section */ 219 | F81E6F632217154200637222 /* Main.storyboard */ = { 220 | isa = PBXVariantGroup; 221 | children = ( 222 | F81E6F642217154200637222 /* Base */, 223 | ); 224 | name = Main.storyboard; 225 | sourceTree = ""; 226 | }; 227 | F81E6F682217154300637222 /* LaunchScreen.storyboard */ = { 228 | isa = PBXVariantGroup; 229 | children = ( 230 | F81E6F692217154300637222 /* Base */, 231 | ); 232 | name = LaunchScreen.storyboard; 233 | sourceTree = ""; 234 | }; 235 | /* End PBXVariantGroup section */ 236 | 237 | /* Begin XCBuildConfiguration section */ 238 | F81E6F6C2217154300637222 /* Debug */ = { 239 | isa = XCBuildConfiguration; 240 | buildSettings = { 241 | ALWAYS_SEARCH_USER_PATHS = NO; 242 | CLANG_ANALYZER_NONNULL = YES; 243 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 244 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 245 | CLANG_CXX_LIBRARY = "libc++"; 246 | CLANG_ENABLE_MODULES = YES; 247 | CLANG_ENABLE_OBJC_ARC = YES; 248 | CLANG_ENABLE_OBJC_WEAK = YES; 249 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 250 | CLANG_WARN_BOOL_CONVERSION = YES; 251 | CLANG_WARN_COMMA = YES; 252 | CLANG_WARN_CONSTANT_CONVERSION = YES; 253 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 254 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 255 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 256 | CLANG_WARN_EMPTY_BODY = YES; 257 | CLANG_WARN_ENUM_CONVERSION = YES; 258 | CLANG_WARN_INFINITE_RECURSION = YES; 259 | CLANG_WARN_INT_CONVERSION = YES; 260 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 261 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 262 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 263 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 264 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 265 | CLANG_WARN_STRICT_PROTOTYPES = YES; 266 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 267 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 268 | CLANG_WARN_UNREACHABLE_CODE = YES; 269 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 270 | CODE_SIGN_IDENTITY = "iPhone Developer"; 271 | COPY_PHASE_STRIP = NO; 272 | DEBUG_INFORMATION_FORMAT = dwarf; 273 | ENABLE_STRICT_OBJC_MSGSEND = YES; 274 | ENABLE_TESTABILITY = YES; 275 | GCC_C_LANGUAGE_STANDARD = gnu11; 276 | GCC_DYNAMIC_NO_PIC = NO; 277 | GCC_NO_COMMON_BLOCKS = YES; 278 | GCC_OPTIMIZATION_LEVEL = 0; 279 | GCC_PREPROCESSOR_DEFINITIONS = ( 280 | "DEBUG=1", 281 | "$(inherited)", 282 | ); 283 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 284 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 285 | GCC_WARN_UNDECLARED_SELECTOR = YES; 286 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 287 | GCC_WARN_UNUSED_FUNCTION = YES; 288 | GCC_WARN_UNUSED_VARIABLE = YES; 289 | IPHONEOS_DEPLOYMENT_TARGET = 12.1; 290 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 291 | MTL_FAST_MATH = YES; 292 | ONLY_ACTIVE_ARCH = YES; 293 | SDKROOT = iphoneos; 294 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 295 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 296 | SWIFT_VERSION = 5.0; 297 | }; 298 | name = Debug; 299 | }; 300 | F81E6F6D2217154300637222 /* Release */ = { 301 | isa = XCBuildConfiguration; 302 | buildSettings = { 303 | ALWAYS_SEARCH_USER_PATHS = NO; 304 | CLANG_ANALYZER_NONNULL = YES; 305 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 306 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 307 | CLANG_CXX_LIBRARY = "libc++"; 308 | CLANG_ENABLE_MODULES = YES; 309 | CLANG_ENABLE_OBJC_ARC = YES; 310 | CLANG_ENABLE_OBJC_WEAK = YES; 311 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 312 | CLANG_WARN_BOOL_CONVERSION = YES; 313 | CLANG_WARN_COMMA = YES; 314 | CLANG_WARN_CONSTANT_CONVERSION = YES; 315 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 316 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 317 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 318 | CLANG_WARN_EMPTY_BODY = YES; 319 | CLANG_WARN_ENUM_CONVERSION = YES; 320 | CLANG_WARN_INFINITE_RECURSION = YES; 321 | CLANG_WARN_INT_CONVERSION = YES; 322 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 323 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 324 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 325 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 326 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 327 | CLANG_WARN_STRICT_PROTOTYPES = YES; 328 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 329 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 330 | CLANG_WARN_UNREACHABLE_CODE = YES; 331 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 332 | CODE_SIGN_IDENTITY = "iPhone Developer"; 333 | COPY_PHASE_STRIP = NO; 334 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 335 | ENABLE_NS_ASSERTIONS = NO; 336 | ENABLE_STRICT_OBJC_MSGSEND = YES; 337 | GCC_C_LANGUAGE_STANDARD = gnu11; 338 | GCC_NO_COMMON_BLOCKS = YES; 339 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 340 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 341 | GCC_WARN_UNDECLARED_SELECTOR = YES; 342 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 343 | GCC_WARN_UNUSED_FUNCTION = YES; 344 | GCC_WARN_UNUSED_VARIABLE = YES; 345 | IPHONEOS_DEPLOYMENT_TARGET = 12.1; 346 | MTL_ENABLE_DEBUG_INFO = NO; 347 | MTL_FAST_MATH = YES; 348 | SDKROOT = iphoneos; 349 | SWIFT_COMPILATION_MODE = wholemodule; 350 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 351 | SWIFT_VERSION = 5.0; 352 | VALIDATE_PRODUCT = YES; 353 | }; 354 | name = Release; 355 | }; 356 | F81E6F6F2217154300637222 /* Debug */ = { 357 | isa = XCBuildConfiguration; 358 | baseConfigurationReference = 68A825C7F8D8A6B9CAB1BE48 /* Pods-Example.debug.xcconfig */; 359 | buildSettings = { 360 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 361 | CODE_SIGN_STYLE = Automatic; 362 | INFOPLIST_FILE = Example/Info.plist; 363 | LD_RUNPATH_SEARCH_PATHS = ( 364 | "$(inherited)", 365 | "@executable_path/Frameworks", 366 | ); 367 | PRODUCT_BUNDLE_IDENTIFIER = com.mobile.example.animatedtabbar.Example; 368 | PRODUCT_NAME = "$(TARGET_NAME)"; 369 | TARGETED_DEVICE_FAMILY = "1,2"; 370 | }; 371 | name = Debug; 372 | }; 373 | F81E6F702217154300637222 /* Release */ = { 374 | isa = XCBuildConfiguration; 375 | baseConfigurationReference = 3E5A3AAE0FF4A4AA4235459C /* Pods-Example.release.xcconfig */; 376 | buildSettings = { 377 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 378 | CODE_SIGN_STYLE = Automatic; 379 | INFOPLIST_FILE = Example/Info.plist; 380 | LD_RUNPATH_SEARCH_PATHS = ( 381 | "$(inherited)", 382 | "@executable_path/Frameworks", 383 | ); 384 | PRODUCT_BUNDLE_IDENTIFIER = com.mobile.example.animatedtabbar.Example; 385 | PRODUCT_NAME = "$(TARGET_NAME)"; 386 | TARGETED_DEVICE_FAMILY = "1,2"; 387 | }; 388 | name = Release; 389 | }; 390 | /* End XCBuildConfiguration section */ 391 | 392 | /* Begin XCConfigurationList section */ 393 | F81E6F572217154200637222 /* Build configuration list for PBXProject "Example" */ = { 394 | isa = XCConfigurationList; 395 | buildConfigurations = ( 396 | F81E6F6C2217154300637222 /* Debug */, 397 | F81E6F6D2217154300637222 /* Release */, 398 | ); 399 | defaultConfigurationIsVisible = 0; 400 | defaultConfigurationName = Release; 401 | }; 402 | F81E6F6E2217154300637222 /* Build configuration list for PBXNativeTarget "Example" */ = { 403 | isa = XCConfigurationList; 404 | buildConfigurations = ( 405 | F81E6F6F2217154300637222 /* Debug */, 406 | F81E6F702217154300637222 /* Release */, 407 | ); 408 | defaultConfigurationIsVisible = 0; 409 | defaultConfigurationName = Release; 410 | }; 411 | /* End XCConfigurationList section */ 412 | }; 413 | rootObject = F81E6F542217154200637222 /* Project object */; 414 | } 415 | -------------------------------------------------------------------------------- /Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/Example.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Example/Example.xcodeproj/project.xcworkspace/xcuserdata/albertogarcia-munoz.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlbGarciam/AnimatedTabBar/b3aa409aaa3056a0ff40f9050a634369ffae7503/Example/Example.xcodeproj/project.xcworkspace/xcuserdata/albertogarcia-munoz.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /Example/Example.xcodeproj/xcuserdata/albertogarcia-munoz.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Example.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 2 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /Example/Example.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Example/Example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Example/Example.xcworkspace/xcuserdata/albertogarcia-munoz.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlbGarciam/AnimatedTabBar/b3aa409aaa3056a0ff40f9050a634369ffae7503/Example/Example.xcworkspace/xcuserdata/albertogarcia-munoz.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /Example/Example/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlbGarciam/AnimatedTabBar/b3aa409aaa3056a0ff40f9050a634369ffae7503/Example/Example/.DS_Store -------------------------------------------------------------------------------- /Example/Example/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // AnimatedTabBar 4 | // 5 | // Created by alb.garciam@gmail.com on 01/03/2019. 6 | // Copyright (c) 2019 alb.garciam@gmail.com. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import AnimatedTabBar 11 | 12 | @UIApplicationMain 13 | class AppDelegate: UIResponder, UIApplicationDelegate { 14 | 15 | var items = [AnimatedTabBarItem(icon: UIImage(named: "thunder") ?? UIImage(), 16 | title: "New", controller: UIViewController()), 17 | AnimatedTabBarItem(icon: UIImage(named: "home") ?? UIImage(), 18 | title: "Home", controller: ViewController.create() ?? UIViewController()), 19 | AnimatedTabBarItem(icon: UIImage(named: "search") ?? UIImage(), 20 | title: "Search", controller: UIViewController())] 21 | var window: UIWindow? 22 | 23 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 24 | let controller = AnimatedTabBarController() 25 | controller.delegate = self 26 | 27 | self.window = UIWindow(frame: UIScreen.main.bounds) 28 | self.window?.backgroundColor = .white 29 | self.window?.rootViewController = controller 30 | self.window?.makeKeyAndVisible() 31 | return true 32 | } 33 | 34 | } 35 | 36 | extension AppDelegate : AnimatedTabBarDelegate { 37 | func initialIndex(_ tabBar: AnimatedTabBar) -> Int? { 38 | return 1 39 | } 40 | 41 | var numberOfItems: Int { 42 | return items.count 43 | } 44 | 45 | func tabBar(_ tabBar: AnimatedTabBar, itemFor index: Int) -> AnimatedTabBarItem { 46 | return items[index] 47 | } 48 | } 49 | 50 | -------------------------------------------------------------------------------- /Example/Example/Assets.xcassets/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlbGarciam/AnimatedTabBar/b3aa409aaa3056a0ff40f9050a634369ffae7503/Example/Example/Assets.xcassets/.DS_Store -------------------------------------------------------------------------------- /Example/Example/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ios-marketing", 45 | "size" : "1024x1024", 46 | "scale" : "1x" 47 | } 48 | ], 49 | "info" : { 50 | "version" : 1, 51 | "author" : "xcode" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /Example/Example/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Example/Example/Assets.xcassets/home.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "icons8-home-page-30.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "icons8-home-page-31.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "icons8-home-page-32.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Example/Example/Assets.xcassets/home.imageset/icons8-home-page-30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlbGarciam/AnimatedTabBar/b3aa409aaa3056a0ff40f9050a634369ffae7503/Example/Example/Assets.xcassets/home.imageset/icons8-home-page-30.png -------------------------------------------------------------------------------- /Example/Example/Assets.xcassets/home.imageset/icons8-home-page-31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlbGarciam/AnimatedTabBar/b3aa409aaa3056a0ff40f9050a634369ffae7503/Example/Example/Assets.xcassets/home.imageset/icons8-home-page-31.png -------------------------------------------------------------------------------- /Example/Example/Assets.xcassets/home.imageset/icons8-home-page-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlbGarciam/AnimatedTabBar/b3aa409aaa3056a0ff40f9050a634369ffae7503/Example/Example/Assets.xcassets/home.imageset/icons8-home-page-32.png -------------------------------------------------------------------------------- /Example/Example/Assets.xcassets/search.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "icons8-search-30.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "icons8-search-31.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "icons8-search-32.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Example/Example/Assets.xcassets/search.imageset/icons8-search-30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlbGarciam/AnimatedTabBar/b3aa409aaa3056a0ff40f9050a634369ffae7503/Example/Example/Assets.xcassets/search.imageset/icons8-search-30.png -------------------------------------------------------------------------------- /Example/Example/Assets.xcassets/search.imageset/icons8-search-31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlbGarciam/AnimatedTabBar/b3aa409aaa3056a0ff40f9050a634369ffae7503/Example/Example/Assets.xcassets/search.imageset/icons8-search-31.png -------------------------------------------------------------------------------- /Example/Example/Assets.xcassets/search.imageset/icons8-search-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlbGarciam/AnimatedTabBar/b3aa409aaa3056a0ff40f9050a634369ffae7503/Example/Example/Assets.xcassets/search.imageset/icons8-search-32.png -------------------------------------------------------------------------------- /Example/Example/Assets.xcassets/thunder.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "icons8-lightning-bolt-30-3.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "icons8-lightning-bolt-30-2.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "icons8-lightning-bolt-30-4.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Example/Example/Assets.xcassets/thunder.imageset/icons8-lightning-bolt-30-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlbGarciam/AnimatedTabBar/b3aa409aaa3056a0ff40f9050a634369ffae7503/Example/Example/Assets.xcassets/thunder.imageset/icons8-lightning-bolt-30-2.png -------------------------------------------------------------------------------- /Example/Example/Assets.xcassets/thunder.imageset/icons8-lightning-bolt-30-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlbGarciam/AnimatedTabBar/b3aa409aaa3056a0ff40f9050a634369ffae7503/Example/Example/Assets.xcassets/thunder.imageset/icons8-lightning-bolt-30-3.png -------------------------------------------------------------------------------- /Example/Example/Assets.xcassets/thunder.imageset/icons8-lightning-bolt-30-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlbGarciam/AnimatedTabBar/b3aa409aaa3056a0ff40f9050a634369ffae7503/Example/Example/Assets.xcassets/thunder.imageset/icons8-lightning-bolt-30-4.png -------------------------------------------------------------------------------- /Example/Example/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /Example/Example/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Example/Example/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationLandscapeLeft 41 | UIInterfaceOrientationLandscapeRight 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /Example/Example/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // Example 4 | // 5 | // Created by Alberto García-Muñoz on 15/02/2019. 6 | // Copyright © 2019 AlbGarciam. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class ViewController: UIViewController { 12 | 13 | class func create() -> UIViewController? { 14 | let storyboard = UIStoryboard.init(name: "Main", bundle: nil) 15 | let controller = storyboard.instantiateInitialViewController() 16 | return controller 17 | } 18 | 19 | override func viewDidLoad() { 20 | super.viewDidLoad() 21 | NSLog("ViewDidLoad") 22 | // Do any additional setup after loading the view. 23 | } 24 | 25 | override func viewWillAppear(_ animated: Bool) { 26 | super.viewWillAppear(animated) 27 | NSLog("ViewWillAppear") 28 | } 29 | 30 | override func viewWillDisappear(_ animated: Bool) { 31 | super.viewWillDisappear(animated) 32 | NSLog("ViewWillDisappear") 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Example/Podfile: -------------------------------------------------------------------------------- 1 | use_frameworks! 2 | 3 | target 'Example' do 4 | pod 'AnimatedTabBar', :path => '../' 5 | end -------------------------------------------------------------------------------- /Example/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - AnimatedTabBar (0.1.5) 3 | 4 | DEPENDENCIES: 5 | - AnimatedTabBar (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | AnimatedTabBar: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | AnimatedTabBar: 969204cc23401df27f5bf139ee427f2c1d19e045 13 | 14 | PODFILE CHECKSUM: fc65f9f27ba568edebbc876e6a99afcc1265bc10 15 | 16 | COCOAPODS: 1.6.0 17 | -------------------------------------------------------------------------------- /Example/Pods/Local Podspecs/AnimatedTabBar.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "AnimatedTabBar", 3 | "version": "0.1.5", 4 | "summary": "Animated tabbar is Swift UI module framework for adding animations to iOS tabBar items and icons.", 5 | "description": "AnimatedTabBar is a Swift UI module library for adding animation to iOS tabBar items and icons. iOS library made by @AlbGarciam", 6 | "homepage": "https://github.com/AlbGarciam/AnimatedTabBar", 7 | "license": { 8 | "type": "MIT", 9 | "file": "LICENSE" 10 | }, 11 | "authors": { 12 | "alb.garciam@gmail.com": "alb.garciam@gmail.com" 13 | }, 14 | "source": { 15 | "git": "https://github.com/AlbGarciam/AnimatedTabBar.git", 16 | "tag": "0.1.5" 17 | }, 18 | "platforms": { 19 | "ios": "10.0" 20 | }, 21 | "swift_version": "5", 22 | "source_files": "AnimatedTabBar/Classes/**/*" 23 | } 24 | -------------------------------------------------------------------------------- /Example/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - AnimatedTabBar (0.1.5) 3 | 4 | DEPENDENCIES: 5 | - AnimatedTabBar (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | AnimatedTabBar: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | AnimatedTabBar: 969204cc23401df27f5bf139ee427f2c1d19e045 13 | 14 | PODFILE CHECKSUM: fc65f9f27ba568edebbc876e6a99afcc1265bc10 15 | 16 | COCOAPODS: 1.6.0 17 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 0893B35F5AA168A8C3405A365D4FE1F7 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFBFEC208A9A22582E8AA53E04068E40 /* Utils.swift */; }; 11 | 226B220E38B1295F0F0CDD18C47022A0 /* CommonUIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97D5A4F9B949EFEA3C75952512734B2C /* CommonUIView.swift */; }; 12 | 4AAFD82605DB3F5B83962DF1BE62A624 /* Pods-Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 96575DA5A33E3BA4F12184BFE42BAD90 /* Pods-Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 13 | 50BE9AFB27EBB4E3F644E59985100F87 /* Pods-Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 76ACFBF7097B199449E8749F7EE01465 /* Pods-Example-dummy.m */; }; 14 | 5D409BC557F8A776CB184DA882BA4897 /* AnimatedTabBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D4F900F152A5AABB85399CA17DE08C5 /* AnimatedTabBarView.swift */; }; 15 | 5F77245832264CB54C9FD94B89649661 /* AnimatedTabBarAppearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93C46F7D0BDF24886AAFD9542C24F4ED /* AnimatedTabBarAppearance.swift */; }; 16 | 692AE896D07DC1D8E0399DE5876B2B6D /* AnimatedTabBar-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 184F0F970DB65F5B1B1687F0103B03D0 /* AnimatedTabBar-dummy.m */; }; 17 | 8521EB72D559FB59CDB46FB3D3749392 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB4607EFCA7C5F75397649E792E2AFCB /* Foundation.framework */; }; 18 | ACCE2670490EC9B34338A5AD1C86D8B2 /* AnimatedTabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 058EED23A887147D4BBD79ED4BD4DB4A /* AnimatedTabBar.swift */; }; 19 | ADEF0440C60708D1783237F3DF36F47A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB4607EFCA7C5F75397649E792E2AFCB /* Foundation.framework */; }; 20 | B02A85D9BAF05040B0994BDA7B9FC34B /* AnimatedTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42198CC81C18C874A5709E9DE5535DE6 /* AnimatedTabBarController.swift */; }; 21 | B11F07E1682FBCC97FF977D7E7A161AE /* AnimatedTabBar-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0557525B6D73A354E143BCD3BF862810 /* AnimatedTabBar-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 22 | CF76B2186BE240EB32B836F26A5BEF35 /* LabelAndDot.swift in Sources */ = {isa = PBXBuildFile; fileRef = F967F9004C1861E87CEB4631036B0793 /* LabelAndDot.swift */; }; 23 | /* End PBXBuildFile section */ 24 | 25 | /* Begin PBXContainerItemProxy section */ 26 | E486DD9490CB510F7644601298DCC8AB /* PBXContainerItemProxy */ = { 27 | isa = PBXContainerItemProxy; 28 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; 29 | proxyType = 1; 30 | remoteGlobalIDString = C26A59DB9AF55075F6835C953A936798; 31 | remoteInfo = AnimatedTabBar; 32 | }; 33 | /* End PBXContainerItemProxy section */ 34 | 35 | /* Begin PBXFileReference section */ 36 | 0557525B6D73A354E143BCD3BF862810 /* AnimatedTabBar-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AnimatedTabBar-umbrella.h"; sourceTree = ""; }; 37 | 058EED23A887147D4BBD79ED4BD4DB4A /* AnimatedTabBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnimatedTabBar.swift; path = AnimatedTabBar/Classes/AnimatedTabBar.swift; sourceTree = ""; }; 38 | 0D7670157C7D120B0D5E584600E00029 /* Pods-Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Example-Info.plist"; sourceTree = ""; }; 39 | 184F0F970DB65F5B1B1687F0103B03D0 /* AnimatedTabBar-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AnimatedTabBar-dummy.m"; sourceTree = ""; }; 40 | 2C162FC21D423A87FC143A0B632CFC08 /* Pods-Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Example-frameworks.sh"; sourceTree = ""; }; 41 | 35462EA424C9FD344F33D5102DE90237 /* AnimatedTabBar-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "AnimatedTabBar-Info.plist"; sourceTree = ""; }; 42 | 35E2C288A180219D12F161F8F67849E8 /* Pods-Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Example.debug.xcconfig"; sourceTree = ""; }; 43 | 415F61F11BD564043CA80AC49145E3C2 /* Pods-Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Example.release.xcconfig"; sourceTree = ""; }; 44 | 42198CC81C18C874A5709E9DE5535DE6 /* AnimatedTabBarController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnimatedTabBarController.swift; path = AnimatedTabBar/Classes/AnimatedTabBarController.swift; sourceTree = ""; }; 45 | 4A79EF2E8F0AB2B8FDD0A7AF717B83A9 /* AnimatedTabBar.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = AnimatedTabBar.modulemap; sourceTree = ""; }; 46 | 55D3ADE233900B5C67CEBDDED9DCECCC /* Pods-Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Example-acknowledgements.plist"; sourceTree = ""; }; 47 | 5D4F900F152A5AABB85399CA17DE08C5 /* AnimatedTabBarView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnimatedTabBarView.swift; path = AnimatedTabBar/Classes/AnimatedTabBarView.swift; sourceTree = ""; }; 48 | 617C9D513A3D6EA77E846387C7443B25 /* AnimatedTabBar-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AnimatedTabBar-prefix.pch"; sourceTree = ""; }; 49 | 700811552E1F883E52FFD920CC618678 /* AnimatedTabBar.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = AnimatedTabBar.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 50 | 76ACFBF7097B199449E8749F7EE01465 /* Pods-Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Example-dummy.m"; sourceTree = ""; }; 51 | 87343A9F8C1006184614FF87703935B6 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; 52 | 898F3BFEAE094F2C89E04E8997D2897A /* AnimatedTabBar.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AnimatedTabBar.xcconfig; sourceTree = ""; }; 53 | 93C46F7D0BDF24886AAFD9542C24F4ED /* AnimatedTabBarAppearance.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnimatedTabBarAppearance.swift; path = AnimatedTabBar/Classes/AnimatedTabBarAppearance.swift; sourceTree = ""; }; 54 | 96575DA5A33E3BA4F12184BFE42BAD90 /* Pods-Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Example-umbrella.h"; sourceTree = ""; }; 55 | 97D5A4F9B949EFEA3C75952512734B2C /* CommonUIView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CommonUIView.swift; path = AnimatedTabBar/Classes/CommonUIView.swift; sourceTree = ""; }; 56 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 57 | ADD0587B37B52C1E8ECBBA43CF7761CB /* Pods-Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Example-acknowledgements.markdown"; sourceTree = ""; }; 58 | BCD60B70C5F88E36546ECF46EC12364B /* AnimatedTabBar.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = AnimatedTabBar.framework; path = AnimatedTabBar.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 59 | C743D3A5AB93A727EA1A577CE93AF024 /* Pods-Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-Example.modulemap"; sourceTree = ""; }; 60 | CB4607EFCA7C5F75397649E792E2AFCB /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 61 | CFBFEC208A9A22582E8AA53E04068E40 /* Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Utils.swift; path = AnimatedTabBar/Classes/Utils.swift; sourceTree = ""; }; 62 | D2AB5F827496D37BFE9379E097AF43D2 /* Pods_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_Example.framework; path = "Pods-Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 63 | DFFD7BEFD126A2029A874E3AA5356D8B /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; 64 | F967F9004C1861E87CEB4631036B0793 /* LabelAndDot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LabelAndDot.swift; path = AnimatedTabBar/Classes/LabelAndDot.swift; sourceTree = ""; }; 65 | /* End PBXFileReference section */ 66 | 67 | /* Begin PBXFrameworksBuildPhase section */ 68 | 01B3B06F97104FE27173142C00845BB7 /* Frameworks */ = { 69 | isa = PBXFrameworksBuildPhase; 70 | buildActionMask = 2147483647; 71 | files = ( 72 | 8521EB72D559FB59CDB46FB3D3749392 /* Foundation.framework in Frameworks */, 73 | ); 74 | runOnlyForDeploymentPostprocessing = 0; 75 | }; 76 | 295EFACC9E7F8E417731D2F1A1E92B67 /* Frameworks */ = { 77 | isa = PBXFrameworksBuildPhase; 78 | buildActionMask = 2147483647; 79 | files = ( 80 | ADEF0440C60708D1783237F3DF36F47A /* Foundation.framework in Frameworks */, 81 | ); 82 | runOnlyForDeploymentPostprocessing = 0; 83 | }; 84 | /* End PBXFrameworksBuildPhase section */ 85 | 86 | /* Begin PBXGroup section */ 87 | 63E5855980ECAB21223D018EBC3EA9B6 /* Products */ = { 88 | isa = PBXGroup; 89 | children = ( 90 | BCD60B70C5F88E36546ECF46EC12364B /* AnimatedTabBar.framework */, 91 | D2AB5F827496D37BFE9379E097AF43D2 /* Pods_Example.framework */, 92 | ); 93 | name = Products; 94 | sourceTree = ""; 95 | }; 96 | 7E4F38A4EB7D3E6549A08641846D03BC /* AnimatedTabBar */ = { 97 | isa = PBXGroup; 98 | children = ( 99 | 058EED23A887147D4BBD79ED4BD4DB4A /* AnimatedTabBar.swift */, 100 | 93C46F7D0BDF24886AAFD9542C24F4ED /* AnimatedTabBarAppearance.swift */, 101 | 42198CC81C18C874A5709E9DE5535DE6 /* AnimatedTabBarController.swift */, 102 | 5D4F900F152A5AABB85399CA17DE08C5 /* AnimatedTabBarView.swift */, 103 | 97D5A4F9B949EFEA3C75952512734B2C /* CommonUIView.swift */, 104 | F967F9004C1861E87CEB4631036B0793 /* LabelAndDot.swift */, 105 | CFBFEC208A9A22582E8AA53E04068E40 /* Utils.swift */, 106 | F1C2511960A09EBBEB73B150A9F51BEE /* Pod */, 107 | D04B7BF5BF51E62F575691734C262994 /* Support Files */, 108 | ); 109 | name = AnimatedTabBar; 110 | path = ../..; 111 | sourceTree = ""; 112 | }; 113 | 9B055D0CFEA43187E72B03DED11F5662 /* iOS */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | CB4607EFCA7C5F75397649E792E2AFCB /* Foundation.framework */, 117 | ); 118 | name = iOS; 119 | sourceTree = ""; 120 | }; 121 | B881DAFBAE9890EB6C14BC23FAAE2652 /* Development Pods */ = { 122 | isa = PBXGroup; 123 | children = ( 124 | 7E4F38A4EB7D3E6549A08641846D03BC /* AnimatedTabBar */, 125 | ); 126 | name = "Development Pods"; 127 | sourceTree = ""; 128 | }; 129 | CE2E825F08D3AD0FD76E6D78D7512ED0 /* Targets Support Files */ = { 130 | isa = PBXGroup; 131 | children = ( 132 | F9A708936E99FD7F473C57BA21F7279D /* Pods-Example */, 133 | ); 134 | name = "Targets Support Files"; 135 | sourceTree = ""; 136 | }; 137 | CF1408CF629C7361332E53B88F7BD30C = { 138 | isa = PBXGroup; 139 | children = ( 140 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, 141 | B881DAFBAE9890EB6C14BC23FAAE2652 /* Development Pods */, 142 | D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */, 143 | 63E5855980ECAB21223D018EBC3EA9B6 /* Products */, 144 | CE2E825F08D3AD0FD76E6D78D7512ED0 /* Targets Support Files */, 145 | ); 146 | sourceTree = ""; 147 | }; 148 | D04B7BF5BF51E62F575691734C262994 /* Support Files */ = { 149 | isa = PBXGroup; 150 | children = ( 151 | 4A79EF2E8F0AB2B8FDD0A7AF717B83A9 /* AnimatedTabBar.modulemap */, 152 | 898F3BFEAE094F2C89E04E8997D2897A /* AnimatedTabBar.xcconfig */, 153 | 184F0F970DB65F5B1B1687F0103B03D0 /* AnimatedTabBar-dummy.m */, 154 | 35462EA424C9FD344F33D5102DE90237 /* AnimatedTabBar-Info.plist */, 155 | 617C9D513A3D6EA77E846387C7443B25 /* AnimatedTabBar-prefix.pch */, 156 | 0557525B6D73A354E143BCD3BF862810 /* AnimatedTabBar-umbrella.h */, 157 | ); 158 | name = "Support Files"; 159 | path = "Example/Pods/Target Support Files/AnimatedTabBar"; 160 | sourceTree = ""; 161 | }; 162 | D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = { 163 | isa = PBXGroup; 164 | children = ( 165 | 9B055D0CFEA43187E72B03DED11F5662 /* iOS */, 166 | ); 167 | name = Frameworks; 168 | sourceTree = ""; 169 | }; 170 | F1C2511960A09EBBEB73B150A9F51BEE /* Pod */ = { 171 | isa = PBXGroup; 172 | children = ( 173 | 700811552E1F883E52FFD920CC618678 /* AnimatedTabBar.podspec */, 174 | DFFD7BEFD126A2029A874E3AA5356D8B /* LICENSE */, 175 | 87343A9F8C1006184614FF87703935B6 /* README.md */, 176 | ); 177 | name = Pod; 178 | sourceTree = ""; 179 | }; 180 | F9A708936E99FD7F473C57BA21F7279D /* Pods-Example */ = { 181 | isa = PBXGroup; 182 | children = ( 183 | C743D3A5AB93A727EA1A577CE93AF024 /* Pods-Example.modulemap */, 184 | ADD0587B37B52C1E8ECBBA43CF7761CB /* Pods-Example-acknowledgements.markdown */, 185 | 55D3ADE233900B5C67CEBDDED9DCECCC /* Pods-Example-acknowledgements.plist */, 186 | 76ACFBF7097B199449E8749F7EE01465 /* Pods-Example-dummy.m */, 187 | 2C162FC21D423A87FC143A0B632CFC08 /* Pods-Example-frameworks.sh */, 188 | 0D7670157C7D120B0D5E584600E00029 /* Pods-Example-Info.plist */, 189 | 96575DA5A33E3BA4F12184BFE42BAD90 /* Pods-Example-umbrella.h */, 190 | 35E2C288A180219D12F161F8F67849E8 /* Pods-Example.debug.xcconfig */, 191 | 415F61F11BD564043CA80AC49145E3C2 /* Pods-Example.release.xcconfig */, 192 | ); 193 | name = "Pods-Example"; 194 | path = "Target Support Files/Pods-Example"; 195 | sourceTree = ""; 196 | }; 197 | /* End PBXGroup section */ 198 | 199 | /* Begin PBXHeadersBuildPhase section */ 200 | 9B8B52FB2584F83F0E63E6C7063D2D0C /* Headers */ = { 201 | isa = PBXHeadersBuildPhase; 202 | buildActionMask = 2147483647; 203 | files = ( 204 | B11F07E1682FBCC97FF977D7E7A161AE /* AnimatedTabBar-umbrella.h in Headers */, 205 | ); 206 | runOnlyForDeploymentPostprocessing = 0; 207 | }; 208 | D51565D53CAF269FB6DB5D83B3E3C186 /* Headers */ = { 209 | isa = PBXHeadersBuildPhase; 210 | buildActionMask = 2147483647; 211 | files = ( 212 | 4AAFD82605DB3F5B83962DF1BE62A624 /* Pods-Example-umbrella.h in Headers */, 213 | ); 214 | runOnlyForDeploymentPostprocessing = 0; 215 | }; 216 | /* End PBXHeadersBuildPhase section */ 217 | 218 | /* Begin PBXNativeTarget section */ 219 | A890D00DE3918C25B11E82F9A6381B1F /* Pods-Example */ = { 220 | isa = PBXNativeTarget; 221 | buildConfigurationList = 3AA439CB5A3274A15AC99A039B737304 /* Build configuration list for PBXNativeTarget "Pods-Example" */; 222 | buildPhases = ( 223 | D51565D53CAF269FB6DB5D83B3E3C186 /* Headers */, 224 | 0CDDE767F2A043F5245B8BB1D2E9933F /* Sources */, 225 | 295EFACC9E7F8E417731D2F1A1E92B67 /* Frameworks */, 226 | 8F165A5B45B37E1B42C518D4950BC86D /* Resources */, 227 | ); 228 | buildRules = ( 229 | ); 230 | dependencies = ( 231 | 513CA681FAE6194F821CBD7F7F5545EF /* PBXTargetDependency */, 232 | ); 233 | name = "Pods-Example"; 234 | productName = "Pods-Example"; 235 | productReference = D2AB5F827496D37BFE9379E097AF43D2 /* Pods_Example.framework */; 236 | productType = "com.apple.product-type.framework"; 237 | }; 238 | C26A59DB9AF55075F6835C953A936798 /* AnimatedTabBar */ = { 239 | isa = PBXNativeTarget; 240 | buildConfigurationList = 78F37A9EC3EC2708B47E7A0FB64CF839 /* Build configuration list for PBXNativeTarget "AnimatedTabBar" */; 241 | buildPhases = ( 242 | 9B8B52FB2584F83F0E63E6C7063D2D0C /* Headers */, 243 | 0B3D0372872E0B0F82BB0BE79861C238 /* Sources */, 244 | 01B3B06F97104FE27173142C00845BB7 /* Frameworks */, 245 | E7210C1A100242B985E2F403F70E8883 /* Resources */, 246 | ); 247 | buildRules = ( 248 | ); 249 | dependencies = ( 250 | ); 251 | name = AnimatedTabBar; 252 | productName = AnimatedTabBar; 253 | productReference = BCD60B70C5F88E36546ECF46EC12364B /* AnimatedTabBar.framework */; 254 | productType = "com.apple.product-type.framework"; 255 | }; 256 | /* End PBXNativeTarget section */ 257 | 258 | /* Begin PBXProject section */ 259 | BFDFE7DC352907FC980B868725387E98 /* Project object */ = { 260 | isa = PBXProject; 261 | attributes = { 262 | LastSwiftUpdateCheck = 0930; 263 | LastUpgradeCheck = 0930; 264 | }; 265 | buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; 266 | compatibilityVersion = "Xcode 3.2"; 267 | developmentRegion = English; 268 | hasScannedForEncodings = 0; 269 | knownRegions = ( 270 | en, 271 | ); 272 | mainGroup = CF1408CF629C7361332E53B88F7BD30C; 273 | productRefGroup = 63E5855980ECAB21223D018EBC3EA9B6 /* Products */; 274 | projectDirPath = ""; 275 | projectRoot = ""; 276 | targets = ( 277 | C26A59DB9AF55075F6835C953A936798 /* AnimatedTabBar */, 278 | A890D00DE3918C25B11E82F9A6381B1F /* Pods-Example */, 279 | ); 280 | }; 281 | /* End PBXProject section */ 282 | 283 | /* Begin PBXResourcesBuildPhase section */ 284 | 8F165A5B45B37E1B42C518D4950BC86D /* Resources */ = { 285 | isa = PBXResourcesBuildPhase; 286 | buildActionMask = 2147483647; 287 | files = ( 288 | ); 289 | runOnlyForDeploymentPostprocessing = 0; 290 | }; 291 | E7210C1A100242B985E2F403F70E8883 /* Resources */ = { 292 | isa = PBXResourcesBuildPhase; 293 | buildActionMask = 2147483647; 294 | files = ( 295 | ); 296 | runOnlyForDeploymentPostprocessing = 0; 297 | }; 298 | /* End PBXResourcesBuildPhase section */ 299 | 300 | /* Begin PBXSourcesBuildPhase section */ 301 | 0B3D0372872E0B0F82BB0BE79861C238 /* Sources */ = { 302 | isa = PBXSourcesBuildPhase; 303 | buildActionMask = 2147483647; 304 | files = ( 305 | 692AE896D07DC1D8E0399DE5876B2B6D /* AnimatedTabBar-dummy.m in Sources */, 306 | ACCE2670490EC9B34338A5AD1C86D8B2 /* AnimatedTabBar.swift in Sources */, 307 | 5F77245832264CB54C9FD94B89649661 /* AnimatedTabBarAppearance.swift in Sources */, 308 | B02A85D9BAF05040B0994BDA7B9FC34B /* AnimatedTabBarController.swift in Sources */, 309 | 5D409BC557F8A776CB184DA882BA4897 /* AnimatedTabBarView.swift in Sources */, 310 | 226B220E38B1295F0F0CDD18C47022A0 /* CommonUIView.swift in Sources */, 311 | CF76B2186BE240EB32B836F26A5BEF35 /* LabelAndDot.swift in Sources */, 312 | 0893B35F5AA168A8C3405A365D4FE1F7 /* Utils.swift in Sources */, 313 | ); 314 | runOnlyForDeploymentPostprocessing = 0; 315 | }; 316 | 0CDDE767F2A043F5245B8BB1D2E9933F /* Sources */ = { 317 | isa = PBXSourcesBuildPhase; 318 | buildActionMask = 2147483647; 319 | files = ( 320 | 50BE9AFB27EBB4E3F644E59985100F87 /* Pods-Example-dummy.m in Sources */, 321 | ); 322 | runOnlyForDeploymentPostprocessing = 0; 323 | }; 324 | /* End PBXSourcesBuildPhase section */ 325 | 326 | /* Begin PBXTargetDependency section */ 327 | 513CA681FAE6194F821CBD7F7F5545EF /* PBXTargetDependency */ = { 328 | isa = PBXTargetDependency; 329 | name = AnimatedTabBar; 330 | target = C26A59DB9AF55075F6835C953A936798 /* AnimatedTabBar */; 331 | targetProxy = E486DD9490CB510F7644601298DCC8AB /* PBXContainerItemProxy */; 332 | }; 333 | /* End PBXTargetDependency section */ 334 | 335 | /* Begin XCBuildConfiguration section */ 336 | 8EE67BD11D60E678D54BFF4633C7694F /* Debug */ = { 337 | isa = XCBuildConfiguration; 338 | baseConfigurationReference = 898F3BFEAE094F2C89E04E8997D2897A /* AnimatedTabBar.xcconfig */; 339 | buildSettings = { 340 | CLANG_ENABLE_OBJC_WEAK = NO; 341 | CODE_SIGN_IDENTITY = ""; 342 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 343 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 344 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 345 | CURRENT_PROJECT_VERSION = 1; 346 | DEFINES_MODULE = YES; 347 | DYLIB_COMPATIBILITY_VERSION = 1; 348 | DYLIB_CURRENT_VERSION = 1; 349 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 350 | GCC_PREFIX_HEADER = "Target Support Files/AnimatedTabBar/AnimatedTabBar-prefix.pch"; 351 | INFOPLIST_FILE = "Target Support Files/AnimatedTabBar/AnimatedTabBar-Info.plist"; 352 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 353 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 354 | LD_RUNPATH_SEARCH_PATHS = ( 355 | "$(inherited)", 356 | "@executable_path/Frameworks", 357 | "@loader_path/Frameworks", 358 | ); 359 | MODULEMAP_FILE = "Target Support Files/AnimatedTabBar/AnimatedTabBar.modulemap"; 360 | PRODUCT_MODULE_NAME = AnimatedTabBar; 361 | PRODUCT_NAME = AnimatedTabBar; 362 | SDKROOT = iphoneos; 363 | SKIP_INSTALL = YES; 364 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 365 | SWIFT_VERSION = 5; 366 | TARGETED_DEVICE_FAMILY = "1,2"; 367 | VERSIONING_SYSTEM = "apple-generic"; 368 | VERSION_INFO_PREFIX = ""; 369 | }; 370 | name = Debug; 371 | }; 372 | A07A7574702D10925DB8F8BC185F8FF1 /* Release */ = { 373 | isa = XCBuildConfiguration; 374 | baseConfigurationReference = 898F3BFEAE094F2C89E04E8997D2897A /* AnimatedTabBar.xcconfig */; 375 | buildSettings = { 376 | CLANG_ENABLE_OBJC_WEAK = NO; 377 | CODE_SIGN_IDENTITY = ""; 378 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 379 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 380 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 381 | CURRENT_PROJECT_VERSION = 1; 382 | DEFINES_MODULE = YES; 383 | DYLIB_COMPATIBILITY_VERSION = 1; 384 | DYLIB_CURRENT_VERSION = 1; 385 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 386 | GCC_PREFIX_HEADER = "Target Support Files/AnimatedTabBar/AnimatedTabBar-prefix.pch"; 387 | INFOPLIST_FILE = "Target Support Files/AnimatedTabBar/AnimatedTabBar-Info.plist"; 388 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 389 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 390 | LD_RUNPATH_SEARCH_PATHS = ( 391 | "$(inherited)", 392 | "@executable_path/Frameworks", 393 | "@loader_path/Frameworks", 394 | ); 395 | MODULEMAP_FILE = "Target Support Files/AnimatedTabBar/AnimatedTabBar.modulemap"; 396 | PRODUCT_MODULE_NAME = AnimatedTabBar; 397 | PRODUCT_NAME = AnimatedTabBar; 398 | SDKROOT = iphoneos; 399 | SKIP_INSTALL = YES; 400 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 401 | SWIFT_VERSION = 5; 402 | TARGETED_DEVICE_FAMILY = "1,2"; 403 | VALIDATE_PRODUCT = YES; 404 | VERSIONING_SYSTEM = "apple-generic"; 405 | VERSION_INFO_PREFIX = ""; 406 | }; 407 | name = Release; 408 | }; 409 | A105C1752A0A49B30ED621B71E226CDB /* Release */ = { 410 | isa = XCBuildConfiguration; 411 | buildSettings = { 412 | ALWAYS_SEARCH_USER_PATHS = NO; 413 | CLANG_ANALYZER_NONNULL = YES; 414 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 415 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 416 | CLANG_CXX_LIBRARY = "libc++"; 417 | CLANG_ENABLE_MODULES = YES; 418 | CLANG_ENABLE_OBJC_ARC = YES; 419 | CLANG_ENABLE_OBJC_WEAK = YES; 420 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 421 | CLANG_WARN_BOOL_CONVERSION = YES; 422 | CLANG_WARN_COMMA = YES; 423 | CLANG_WARN_CONSTANT_CONVERSION = YES; 424 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 425 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 426 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 427 | CLANG_WARN_EMPTY_BODY = YES; 428 | CLANG_WARN_ENUM_CONVERSION = YES; 429 | CLANG_WARN_INFINITE_RECURSION = YES; 430 | CLANG_WARN_INT_CONVERSION = YES; 431 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 432 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 433 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 434 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 435 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 436 | CLANG_WARN_STRICT_PROTOTYPES = YES; 437 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 438 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 439 | CLANG_WARN_UNREACHABLE_CODE = YES; 440 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 441 | COPY_PHASE_STRIP = NO; 442 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 443 | ENABLE_NS_ASSERTIONS = NO; 444 | ENABLE_STRICT_OBJC_MSGSEND = YES; 445 | GCC_C_LANGUAGE_STANDARD = gnu11; 446 | GCC_NO_COMMON_BLOCKS = YES; 447 | GCC_PREPROCESSOR_DEFINITIONS = ( 448 | "POD_CONFIGURATION_RELEASE=1", 449 | "$(inherited)", 450 | ); 451 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 452 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 453 | GCC_WARN_UNDECLARED_SELECTOR = YES; 454 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 455 | GCC_WARN_UNUSED_FUNCTION = YES; 456 | GCC_WARN_UNUSED_VARIABLE = YES; 457 | IPHONEOS_DEPLOYMENT_TARGET = 12.1; 458 | MTL_ENABLE_DEBUG_INFO = NO; 459 | MTL_FAST_MATH = YES; 460 | PRODUCT_NAME = "$(TARGET_NAME)"; 461 | STRIP_INSTALLED_PRODUCT = NO; 462 | SWIFT_COMPILATION_MODE = wholemodule; 463 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 464 | SWIFT_VERSION = 4.2; 465 | SYMROOT = "${SRCROOT}/../build"; 466 | }; 467 | name = Release; 468 | }; 469 | C1391485F05B41BD35738A433056B7FA /* Debug */ = { 470 | isa = XCBuildConfiguration; 471 | buildSettings = { 472 | ALWAYS_SEARCH_USER_PATHS = NO; 473 | CLANG_ANALYZER_NONNULL = YES; 474 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 475 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 476 | CLANG_CXX_LIBRARY = "libc++"; 477 | CLANG_ENABLE_MODULES = YES; 478 | CLANG_ENABLE_OBJC_ARC = YES; 479 | CLANG_ENABLE_OBJC_WEAK = YES; 480 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 481 | CLANG_WARN_BOOL_CONVERSION = YES; 482 | CLANG_WARN_COMMA = YES; 483 | CLANG_WARN_CONSTANT_CONVERSION = YES; 484 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 485 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 486 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 487 | CLANG_WARN_EMPTY_BODY = YES; 488 | CLANG_WARN_ENUM_CONVERSION = YES; 489 | CLANG_WARN_INFINITE_RECURSION = YES; 490 | CLANG_WARN_INT_CONVERSION = YES; 491 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 492 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 493 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 494 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 495 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 496 | CLANG_WARN_STRICT_PROTOTYPES = YES; 497 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 498 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 499 | CLANG_WARN_UNREACHABLE_CODE = YES; 500 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 501 | COPY_PHASE_STRIP = NO; 502 | DEBUG_INFORMATION_FORMAT = dwarf; 503 | ENABLE_STRICT_OBJC_MSGSEND = YES; 504 | ENABLE_TESTABILITY = YES; 505 | GCC_C_LANGUAGE_STANDARD = gnu11; 506 | GCC_DYNAMIC_NO_PIC = NO; 507 | GCC_NO_COMMON_BLOCKS = YES; 508 | GCC_OPTIMIZATION_LEVEL = 0; 509 | GCC_PREPROCESSOR_DEFINITIONS = ( 510 | "POD_CONFIGURATION_DEBUG=1", 511 | "DEBUG=1", 512 | "$(inherited)", 513 | ); 514 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 515 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 516 | GCC_WARN_UNDECLARED_SELECTOR = YES; 517 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 518 | GCC_WARN_UNUSED_FUNCTION = YES; 519 | GCC_WARN_UNUSED_VARIABLE = YES; 520 | IPHONEOS_DEPLOYMENT_TARGET = 12.1; 521 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 522 | MTL_FAST_MATH = YES; 523 | ONLY_ACTIVE_ARCH = YES; 524 | PRODUCT_NAME = "$(TARGET_NAME)"; 525 | STRIP_INSTALLED_PRODUCT = NO; 526 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 527 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 528 | SWIFT_VERSION = 4.2; 529 | SYMROOT = "${SRCROOT}/../build"; 530 | }; 531 | name = Debug; 532 | }; 533 | E2590EE36AAC69227017DC30183A4DBE /* Debug */ = { 534 | isa = XCBuildConfiguration; 535 | baseConfigurationReference = 35E2C288A180219D12F161F8F67849E8 /* Pods-Example.debug.xcconfig */; 536 | buildSettings = { 537 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 538 | CLANG_ENABLE_OBJC_WEAK = NO; 539 | CODE_SIGN_IDENTITY = ""; 540 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 541 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 542 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 543 | CURRENT_PROJECT_VERSION = 1; 544 | DEFINES_MODULE = YES; 545 | DYLIB_COMPATIBILITY_VERSION = 1; 546 | DYLIB_CURRENT_VERSION = 1; 547 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 548 | INFOPLIST_FILE = "Target Support Files/Pods-Example/Pods-Example-Info.plist"; 549 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 550 | IPHONEOS_DEPLOYMENT_TARGET = 12.1; 551 | LD_RUNPATH_SEARCH_PATHS = ( 552 | "$(inherited)", 553 | "@executable_path/Frameworks", 554 | "@loader_path/Frameworks", 555 | ); 556 | MACH_O_TYPE = staticlib; 557 | MODULEMAP_FILE = "Target Support Files/Pods-Example/Pods-Example.modulemap"; 558 | OTHER_LDFLAGS = ""; 559 | OTHER_LIBTOOLFLAGS = ""; 560 | PODS_ROOT = "$(SRCROOT)"; 561 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 562 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 563 | SDKROOT = iphoneos; 564 | SKIP_INSTALL = YES; 565 | TARGETED_DEVICE_FAMILY = "1,2"; 566 | VERSIONING_SYSTEM = "apple-generic"; 567 | VERSION_INFO_PREFIX = ""; 568 | }; 569 | name = Debug; 570 | }; 571 | E430529BF25B39E491CF9372C92D1419 /* Release */ = { 572 | isa = XCBuildConfiguration; 573 | baseConfigurationReference = 415F61F11BD564043CA80AC49145E3C2 /* Pods-Example.release.xcconfig */; 574 | buildSettings = { 575 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 576 | CLANG_ENABLE_OBJC_WEAK = NO; 577 | CODE_SIGN_IDENTITY = ""; 578 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 579 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 580 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 581 | CURRENT_PROJECT_VERSION = 1; 582 | DEFINES_MODULE = YES; 583 | DYLIB_COMPATIBILITY_VERSION = 1; 584 | DYLIB_CURRENT_VERSION = 1; 585 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 586 | INFOPLIST_FILE = "Target Support Files/Pods-Example/Pods-Example-Info.plist"; 587 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 588 | IPHONEOS_DEPLOYMENT_TARGET = 12.1; 589 | LD_RUNPATH_SEARCH_PATHS = ( 590 | "$(inherited)", 591 | "@executable_path/Frameworks", 592 | "@loader_path/Frameworks", 593 | ); 594 | MACH_O_TYPE = staticlib; 595 | MODULEMAP_FILE = "Target Support Files/Pods-Example/Pods-Example.modulemap"; 596 | OTHER_LDFLAGS = ""; 597 | OTHER_LIBTOOLFLAGS = ""; 598 | PODS_ROOT = "$(SRCROOT)"; 599 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 600 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 601 | SDKROOT = iphoneos; 602 | SKIP_INSTALL = YES; 603 | TARGETED_DEVICE_FAMILY = "1,2"; 604 | VALIDATE_PRODUCT = YES; 605 | VERSIONING_SYSTEM = "apple-generic"; 606 | VERSION_INFO_PREFIX = ""; 607 | }; 608 | name = Release; 609 | }; 610 | /* End XCBuildConfiguration section */ 611 | 612 | /* Begin XCConfigurationList section */ 613 | 3AA439CB5A3274A15AC99A039B737304 /* Build configuration list for PBXNativeTarget "Pods-Example" */ = { 614 | isa = XCConfigurationList; 615 | buildConfigurations = ( 616 | E2590EE36AAC69227017DC30183A4DBE /* Debug */, 617 | E430529BF25B39E491CF9372C92D1419 /* Release */, 618 | ); 619 | defaultConfigurationIsVisible = 0; 620 | defaultConfigurationName = Release; 621 | }; 622 | 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { 623 | isa = XCConfigurationList; 624 | buildConfigurations = ( 625 | C1391485F05B41BD35738A433056B7FA /* Debug */, 626 | A105C1752A0A49B30ED621B71E226CDB /* Release */, 627 | ); 628 | defaultConfigurationIsVisible = 0; 629 | defaultConfigurationName = Release; 630 | }; 631 | 78F37A9EC3EC2708B47E7A0FB64CF839 /* Build configuration list for PBXNativeTarget "AnimatedTabBar" */ = { 632 | isa = XCConfigurationList; 633 | buildConfigurations = ( 634 | 8EE67BD11D60E678D54BFF4633C7694F /* Debug */, 635 | A07A7574702D10925DB8F8BC185F8FF1 /* Release */, 636 | ); 637 | defaultConfigurationIsVisible = 0; 638 | defaultConfigurationName = Release; 639 | }; 640 | /* End XCConfigurationList section */ 641 | }; 642 | rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; 643 | } 644 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/xcuserdata/albertogarcia-munoz.xcuserdatad/xcschemes/AnimatedTabBar.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 45 | 46 | 52 | 53 | 55 | 56 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/xcuserdata/albertogarcia-munoz.xcuserdatad/xcschemes/Pods-Example.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 66 | 67 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/xcuserdata/albertogarcia-munoz.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | AnimatedTabBar.xcscheme 8 | 9 | isShown 10 | 11 | orderHint 12 | 0 13 | 14 | Pods-Example.xcscheme 15 | 16 | isShown 17 | 18 | orderHint 19 | 1 20 | 21 | 22 | SuppressBuildableAutocreation 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/AnimatedTabBar/AnimatedTabBar-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.1.5 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/AnimatedTabBar/AnimatedTabBar-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_AnimatedTabBar : NSObject 3 | @end 4 | @implementation PodsDummy_AnimatedTabBar 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/AnimatedTabBar/AnimatedTabBar-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/AnimatedTabBar/AnimatedTabBar-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double AnimatedTabBarVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char AnimatedTabBarVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/AnimatedTabBar/AnimatedTabBar.modulemap: -------------------------------------------------------------------------------- 1 | framework module AnimatedTabBar { 2 | umbrella header "AnimatedTabBar-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/AnimatedTabBar/AnimatedTabBar.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/AnimatedTabBar 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 4 | PODS_BUILD_DIR = ${BUILD_DIR} 5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 6 | PODS_ROOT = ${SRCROOT} 7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## AnimatedTabBar 5 | 6 | Copyright (c) 2019 alb.garciam@gmail.com 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy 9 | of this software and associated documentation files (the "Software"), to deal 10 | in the Software without restriction, including without limitation the rights 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | copies of the Software, and to permit persons to whom the Software is 13 | furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in 16 | all copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | THE SOFTWARE. 25 | 26 | Generated by CocoaPods - https://cocoapods.org 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Copyright (c) 2019 alb.garciam@gmail.com <alb.garciam@gmail.com> 18 | 19 | Permission is hereby granted, free of charge, to any person obtaining a copy 20 | of this software and associated documentation files (the "Software"), to deal 21 | in the Software without restriction, including without limitation the rights 22 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 23 | copies of the Software, and to permit persons to whom the Software is 24 | furnished to do so, subject to the following conditions: 25 | 26 | The above copyright notice and this permission notice shall be included in 27 | all copies or substantial portions of the Software. 28 | 29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 30 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 31 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 32 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 33 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 34 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 35 | THE SOFTWARE. 36 | 37 | License 38 | MIT 39 | Title 40 | AnimatedTabBar 41 | Type 42 | PSGroupSpecifier 43 | 44 | 45 | FooterText 46 | Generated by CocoaPods - https://cocoapods.org 47 | Title 48 | 49 | Type 50 | PSGroupSpecifier 51 | 52 | 53 | StringsTable 54 | Acknowledgements 55 | Title 56 | Acknowledgements 57 | 58 | 59 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_Example : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_Example 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | function on_error { 7 | echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" 8 | } 9 | trap 'on_error $LINENO' ERR 10 | 11 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then 12 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy 13 | # frameworks to, so exit 0 (signalling the script phase was successful). 14 | exit 0 15 | fi 16 | 17 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 18 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 19 | 20 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" 21 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 22 | 23 | # Used as a return value for each invocation of `strip_invalid_archs` function. 24 | STRIP_BINARY_RETVAL=0 25 | 26 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 27 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 28 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 29 | 30 | # Copies and strips a vendored framework 31 | install_framework() 32 | { 33 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 34 | local source="${BUILT_PRODUCTS_DIR}/$1" 35 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 36 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 37 | elif [ -r "$1" ]; then 38 | local source="$1" 39 | fi 40 | 41 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 42 | 43 | if [ -L "${source}" ]; then 44 | echo "Symlinked..." 45 | source="$(readlink "${source}")" 46 | fi 47 | 48 | # Use filter instead of exclude so missing patterns don't throw errors. 49 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 50 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 51 | 52 | local basename 53 | basename="$(basename -s .framework "$1")" 54 | binary="${destination}/${basename}.framework/${basename}" 55 | 56 | if ! [ -r "$binary" ]; then 57 | binary="${destination}/${basename}" 58 | elif [ -L "${binary}" ]; then 59 | echo "Destination binary is symlinked..." 60 | dirname="$(dirname "${binary}")" 61 | binary="${dirname}/$(readlink "${binary}")" 62 | fi 63 | 64 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 65 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 66 | strip_invalid_archs "$binary" 67 | fi 68 | 69 | # Resign the code if required by the build settings to avoid unstable apps 70 | code_sign_if_enabled "${destination}/$(basename "$1")" 71 | 72 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 73 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 74 | local swift_runtime_libs 75 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) 76 | for lib in $swift_runtime_libs; do 77 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 78 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 79 | code_sign_if_enabled "${destination}/${lib}" 80 | done 81 | fi 82 | } 83 | 84 | # Copies and strips a vendored dSYM 85 | install_dsym() { 86 | local source="$1" 87 | if [ -r "$source" ]; then 88 | # Copy the dSYM into a the targets temp dir. 89 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" 90 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" 91 | 92 | local basename 93 | basename="$(basename -s .framework.dSYM "$source")" 94 | binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" 95 | 96 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 97 | if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then 98 | strip_invalid_archs "$binary" 99 | fi 100 | 101 | if [[ $STRIP_BINARY_RETVAL == 1 ]]; then 102 | # Move the stripped file into its final destination. 103 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" 104 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" 105 | else 106 | # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. 107 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" 108 | fi 109 | fi 110 | } 111 | 112 | # Signs a framework with the provided identity 113 | code_sign_if_enabled() { 114 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 115 | # Use the current code_sign_identity 116 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 117 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 118 | 119 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 120 | code_sign_cmd="$code_sign_cmd &" 121 | fi 122 | echo "$code_sign_cmd" 123 | eval "$code_sign_cmd" 124 | fi 125 | } 126 | 127 | # Strip invalid architectures 128 | strip_invalid_archs() { 129 | binary="$1" 130 | # Get architectures for current target binary 131 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 132 | # Intersect them with the architectures we are building for 133 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 134 | # If there are no archs supported by this binary then warn the user 135 | if [[ -z "$intersected_archs" ]]; then 136 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 137 | STRIP_BINARY_RETVAL=0 138 | return 139 | fi 140 | stripped="" 141 | for arch in $binary_archs; do 142 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 143 | # Strip non-valid architectures in-place 144 | lipo -remove "$arch" -output "$binary" "$binary" 145 | stripped="$stripped $arch" 146 | fi 147 | done 148 | if [[ "$stripped" ]]; then 149 | echo "Stripped $binary of architectures:$stripped" 150 | fi 151 | STRIP_BINARY_RETVAL=1 152 | } 153 | 154 | 155 | if [[ "$CONFIGURATION" == "Debug" ]]; then 156 | install_framework "${BUILT_PRODUCTS_DIR}/AnimatedTabBar/AnimatedTabBar.framework" 157 | fi 158 | if [[ "$CONFIGURATION" == "Release" ]]; then 159 | install_framework "${BUILT_PRODUCTS_DIR}/AnimatedTabBar/AnimatedTabBar.framework" 160 | fi 161 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 162 | wait 163 | fi 164 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_ExampleVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_ExampleVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example.debug.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AnimatedTabBar" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AnimatedTabBar/AnimatedTabBar.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "AnimatedTabBar" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_Example { 2 | umbrella header "Pods-Example-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Example/Pods-Example.release.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AnimatedTabBar" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AnimatedTabBar/AnimatedTabBar.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "AnimatedTabBar" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2019 alb.garciam@gmail.com 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AnimatedTabBar 2 | 3 | [![Version](https://img.shields.io/cocoapods/v/AnimatedTabBar.svg?style=flat)](https://cocoapods.org/pods/AnimatedTabBar) 4 | [![License](https://img.shields.io/cocoapods/l/AnimatedTabBar.svg?style=flat)](https://cocoapods.org/pods/AnimatedTabBar) 5 | [![Platform](https://img.shields.io/cocoapods/p/AnimatedTabBar.svg?style=flat)](https://cocoapods.org/pods/AnimatedTabBar) 6 | 7 | ## Example 8 | 9 | To run the example project, clone the repo, and run `pod install` from the Example directory first. 10 | ![](https://github.com/AlbGarciam/AnimatedTabBar/blob/master/AnimatedTabBar.gif) 11 | 12 | ## Requirements 13 | * iOS 10.0+ 14 | * Swift 5 15 | 16 | ## Installation 17 | 18 | AnimatedTabBar is available through [CocoaPods](https://cocoapods.org). To install 19 | it, simply add the following line to your Podfile: 20 | 21 | ```ruby 22 | pod 'AnimatedTabBar' 23 | ``` 24 | 25 | ## Author 26 | 27 | **Alberto Garcia** - *Initial work* - [AlbGarciam](https://github.com/AlbGarciam) 28 | 29 | ## License 30 | 31 | AnimatedTabBar is available under the MIT license. See the LICENSE file for more info. 32 | -------------------------------------------------------------------------------- /_Pods.xcodeproj: -------------------------------------------------------------------------------- 1 | Example/Pods/Pods.xcodeproj --------------------------------------------------------------------------------