Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Initial Commit

  • Loading branch information...
commit a897280f5d8b5bdaa18c249de858a248dbcdc6bc 0 parents
@jinthagerman jinthagerman authored
Showing with 1,701 additions and 0 deletions.
  1. +1 −0  .gitignore
  2. +15 −0 Classes/AppDelegate.h
  3. +80 −0 Classes/AppDelegate.m
  4. +13 −0 Classes/FifthViewController.h
  5. +29 −0 Classes/FifthViewController.m
  6. +13 −0 Classes/FirstViewController.h
  7. +24 −0 Classes/FirstViewController.m
  8. +13 −0 Classes/FourthViewController.h
  9. +29 −0 Classes/FourthViewController.m
  10. +47 −0 Classes/JBTabBarController-Info.plist
  11. +15 −0 Classes/JBTabBarController-Prefix.pch
  12. +13 −0 Classes/SecondViewController.h
  13. +29 −0 Classes/SecondViewController.m
  14. +13 −0 Classes/ThirdViewController.h
  15. +39 −0 Classes/ThirdViewController.m
  16. +2 −0  Classes/en.lproj/InfoPlist.strings
  17. +18 −0 Classes/main.m
  18. BIN  Extras/At.png
  19. +14 −0 Extras/At.svg
  20. BIN  Extras/Brain.png
  21. +38 −0 Extras/Brain.svg
  22. BIN  Extras/Elephant.png
  23. +5 −0 Extras/Elephant.svg
  24. BIN  Extras/Fist.png
  25. +49 −0 Extras/Fist.svg
  26. BIN  Extras/Levitate.png
  27. +5 −0 Extras/Levitate.svg
  28. BIN  Extras/iOSTabBarItemImageLayerStyles.asl
  29. +38 −0 JBTabBarController/JBTabBar.h
  30. +161 −0 JBTabBarController/JBTabBar.m
  31. +13 −0 JBTabBarController/JBTabBarButton.h
  32. +57 −0 JBTabBarController/JBTabBarButton.m
  33. +27 −0 JBTabBarController/JBTabBarController.h
  34. +133 −0 JBTabBarController/JBTabBarController.m
  35. +15 −0 JBTabBarController/UITabBarItem+JBAdditions.h
  36. +24 −0 JBTabBarController/UITabBarItem+JBAdditions.m
  37. +461 −0 JBTabBarControllerExample.xcodeproj/project.pbxproj
  38. +7 −0 JBTabBarControllerExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  39. BIN  ...ollerExample.xcodeproj/project.xcworkspace/xcuserdata/gbudelmann.xcuserdatad/UserInterfaceState.xcuserstate
  40. +10 −0 ...trollerExample.xcodeproj/project.xcworkspace/xcuserdata/gbudelmann.xcuserdatad/WorkspaceSettings.xcsettings
  41. +133 −0 JBTabBarControllerExample.xcodeproj/xcuserdata/gbudelmann.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist
  42. +84 −0 ...rControllerExample.xcodeproj/xcuserdata/gbudelmann.xcuserdatad/xcschemes/JBTabBarControllerExample.xcscheme
  43. +27 −0 JBTabBarControllerExample.xcodeproj/xcuserdata/gbudelmann.xcuserdatad/xcschemes/xcschememanagement.plist
  44. +7 −0 README
  45. BIN  Resources/TabBar Images/bg-selected.png
  46. BIN  Resources/TabBar Images/bg-selected@2x.png
  47. BIN  Resources/TabBar Images/bg.png
  48. BIN  Resources/TabBar Images/bg@2x.png
  49. BIN  Resources/TabBar Item Images/At-selected.png
  50. BIN  Resources/TabBar Item Images/At-selected@2x.png
  51. BIN  Resources/TabBar Item Images/At-unselected.png
  52. BIN  Resources/TabBar Item Images/At-unselected@2x.png
  53. BIN  Resources/TabBar Item Images/Brain-selected.png
  54. BIN  Resources/TabBar Item Images/Brain-selected@2x.png
  55. BIN  Resources/TabBar Item Images/Brain-unselected.png
  56. BIN  Resources/TabBar Item Images/Brain-unselected@2x.png
  57. BIN  Resources/TabBar Item Images/Elephant-selected.png
  58. BIN  Resources/TabBar Item Images/Elephant-selected@2x.png
  59. BIN  Resources/TabBar Item Images/Elephant-unselected.png
  60. BIN  Resources/TabBar Item Images/Elephant-unselected@2x.png
  61. BIN  Resources/TabBar Item Images/Fist-selected.png
  62. BIN  Resources/TabBar Item Images/Fist-selected@2x.png
  63. BIN  Resources/TabBar Item Images/Fist-unselected.png
  64. BIN  Resources/TabBar Item Images/Fist-unselected@2x.png
  65. BIN  Resources/TabBar Item Images/Levitate-selected.png
  66. BIN  Resources/TabBar Item Images/Levitate-selected@2x.png
  67. BIN  Resources/TabBar Item Images/Levitate-unselected.png
  68. BIN  Resources/TabBar Item Images/Levitate-unselected@2x.png
1  .gitignore
@@ -0,0 +1 @@
+.DS_Store
15 Classes/AppDelegate.h
@@ -0,0 +1,15 @@
+//
+// JBAppDelegate.h
+// JBTabBarController
+//
+// Created by Jin Budelmann on 3/02/12.
+// Copyright (c) 2012 BitCrank. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface AppDelegate : UIResponder <UIApplicationDelegate>
+
+@property (strong, nonatomic) UIWindow *window;
+
+@end
80 Classes/AppDelegate.m
@@ -0,0 +1,80 @@
+//
+// JBAppDelegate.m
+// JBTabBarController
+//
+// Created by Jin Budelmann on 3/02/12.
+// Copyright (c) 2012 BitCrank. All rights reserved.
+//
+
+#import "AppDelegate.h"
+#import "JBTabBarController.h"
+
+#import "FirstViewController.h"
+#import "SecondViewController.h"
+#import "ThirdViewController.h"
+#import "FourthViewController.h"
+#import "FifthViewController.h"
+
+@implementation AppDelegate
+
+@synthesize window = _window;
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+{
+ self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
+ // Override point for customization after application launch.
+ JBTabBarController* tabBarController = [[JBTabBarController alloc] init];
+ tabBarController.viewControllers = [NSArray arrayWithObjects:[[UINavigationController alloc] initWithRootViewController:[[FirstViewController alloc] init]],
+ [[UINavigationController alloc] initWithRootViewController:[[SecondViewController alloc] init]],
+ [[UINavigationController alloc] initWithRootViewController:[[ThirdViewController alloc] init]],
+ [[UINavigationController alloc] initWithRootViewController:[[FourthViewController alloc] init]],
+ [[UINavigationController alloc] initWithRootViewController:[[FifthViewController alloc] init]],
+ nil];
+
+
+ self.window.rootViewController = tabBarController;
+
+ [self.window makeKeyAndVisible];
+ return YES;
+}
+
+- (void)applicationWillResignActive:(UIApplication *)application
+{
+ /*
+ Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
+ Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
+ */
+}
+
+- (void)applicationDidEnterBackground:(UIApplication *)application
+{
+ /*
+ Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
+ If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
+ */
+}
+
+- (void)applicationWillEnterForeground:(UIApplication *)application
+{
+ /*
+ Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
+ */
+}
+
+- (void)applicationDidBecomeActive:(UIApplication *)application
+{
+ /*
+ Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
+ */
+}
+
+- (void)applicationWillTerminate:(UIApplication *)application
+{
+ /*
+ Called when the application is about to terminate.
+ Save data if appropriate.
+ See also applicationDidEnterBackground:.
+ */
+}
+
+@end
13 Classes/FifthViewController.h
@@ -0,0 +1,13 @@
+//
+// FifthViewController.h
+// JBTabBarControllerExample
+//
+// Created by Jin Budelmann on 20/02/12.
+// Copyright (c) 2012 BitCrank. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface FifthViewController : UIViewController
+
+@end
29 Classes/FifthViewController.m
@@ -0,0 +1,29 @@
+//
+// FifthViewController.m
+// JBTabBarControllerExample
+//
+// Created by Jin Budelmann on 20/02/12.
+// Copyright (c) 2012 BitCrank. All rights reserved.
+//
+
+#import "FifthViewController.h"
+
+@implementation FifthViewController
+
+- (id)init
+{
+ self = [super init];
+ if (self) {
+ self.title = @"Levitate";
+ self.tabBarItem.image = [UIImage imageNamed:@"Levitate-unselected"];
+ self.tabBarItem.selectedImage = [UIImage imageNamed:@"Levitate-selected"];
+ }
+ return self;
+}
+
+- (void)viewDidLoad {
+ self.view.backgroundColor = [UIColor purpleColor];
+}
+
+
+@end
13 Classes/FirstViewController.h
@@ -0,0 +1,13 @@
+//
+// FirstViewController.h
+// JBTabBarController
+//
+// Created by Jin Budelmann on 3/02/12.
+// Copyright (c) 2012 BitCrank. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface FirstViewController : UIViewController
+
+@end
24 Classes/FirstViewController.m
@@ -0,0 +1,24 @@
+//
+// FirstViewController.m
+// JBTabBarController
+//
+// Created by Jin Budelmann on 3/02/12.
+// Copyright (c) 2012 BitCrank. All rights reserved.
+//
+
+#import "FirstViewController.h"
+
+@implementation FirstViewController
+
+- (id)init
+{
+ self = [super init];
+ if (self) {
+ self.title = @"At";
+ self.tabBarItem.image = [UIImage imageNamed:@"At-unselected"];
+ self.tabBarItem.selectedImage = [UIImage imageNamed:@"At-selected"];
+ }
+ return self;
+}
+
+@end
13 Classes/FourthViewController.h
@@ -0,0 +1,13 @@
+//
+// FourthViewController.h
+// JBTabBarControllerExample
+//
+// Created by Jin Budelmann on 20/02/12.
+// Copyright (c) 2012 BitCrank. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface FourthViewController : UIViewController
+
+@end
29 Classes/FourthViewController.m
@@ -0,0 +1,29 @@
+//
+// FourthViewController.m
+// JBTabBarControllerExample
+//
+// Created by Jin Budelmann on 20/02/12.
+// Copyright (c) 2012 BitCrank. All rights reserved.
+//
+
+#import "FourthViewController.h"
+
+@implementation FourthViewController
+
+- (id)init
+{
+ self = [super init];
+ if (self) {
+ self.title = @"Fist";
+ self.tabBarItem.image = [UIImage imageNamed:@"Fist-unselected"];
+ self.tabBarItem.selectedImage = [UIImage imageNamed:@"Fist-selected"];
+ }
+ return self;
+}
+
+- (void)viewDidLoad {
+ self.view.backgroundColor = [UIColor orangeColor];
+}
+
+
+@end
47 Classes/JBTabBarController-Info.plist
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleDisplayName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIconFiles</key>
+ <array/>
+ <key>CFBundleIdentifier</key>
+ <string>bitcrank.${PRODUCT_NAME:rfc1034identifier}</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>UIRequiredDeviceCapabilities</key>
+ <array>
+ <string>armv7</string>
+ </array>
+ <key>UISupportedInterfaceOrientations</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+ <key>UISupportedInterfaceOrientations~ipad</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationPortraitUpsideDown</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+</dict>
+</plist>
15 Classes/JBTabBarController-Prefix.pch
@@ -0,0 +1,15 @@
+//
+// Prefix header for all source files of the 'JBTabBarController' target in the 'JBTabBarController' project
+//
+
+#import <Availability.h>
+
+#ifndef __IPHONE_3_0
+#warning "This project uses features only available in iOS SDK 3.0 and later."
+#endif
+
+#ifdef __OBJC__
+ #import <UIKit/UIKit.h>
+ #import <Foundation/Foundation.h>
+ #import "UITabBarItem+JBAdditions.h"
+#endif
13 Classes/SecondViewController.h
@@ -0,0 +1,13 @@
+//
+// SecondViewController.h
+// JBTabBarController
+//
+// Created by Jin Budelmann on 3/02/12.
+// Copyright (c) 2012 BitCrank. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface SecondViewController : UIViewController
+
+@end
29 Classes/SecondViewController.m
@@ -0,0 +1,29 @@
+//
+// SecondViewController.m
+// JBTabBarController
+//
+// Created by Jin Budelmann on 3/02/12.
+// Copyright (c) 2012 BitCrank. All rights reserved.
+//
+
+#import "SecondViewController.h"
+
+@implementation SecondViewController
+
+- (id)init
+{
+ self = [super init];
+ if (self) {
+ self.title = @"Brain";
+ self.tabBarItem.image = [UIImage imageNamed:@"Brain-unselected"];
+ self.tabBarItem.selectedImage = [UIImage imageNamed:@"Brain-selected"];
+ }
+ return self;
+}
+
+- (void)viewDidLoad {
+ self.view.backgroundColor = [UIColor blueColor];
+}
+
+
+@end
13 Classes/ThirdViewController.h
@@ -0,0 +1,13 @@
+//
+// ThirdViewController.h
+// JBTabBarController
+//
+// Created by Jin Budelmann on 3/02/12.
+// Copyright (c) 2012 BitCrank. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface ThirdViewController : UITableViewController
+
+@end
39 Classes/ThirdViewController.m
@@ -0,0 +1,39 @@
+//
+// ThirdViewController.m
+// JBTabBarController
+//
+// Created by Jin Budelmann on 3/02/12.
+// Copyright (c) 2012 BitCrank. All rights reserved.
+//
+
+#import "ThirdViewController.h"
+
+@implementation ThirdViewController
+
+- (id)init
+{
+ self = [super init];
+ if (self) {
+ self.title = @"Elephant";
+ self.tabBarItem.image = [UIImage imageNamed:@"Elephant-unselected"];
+ self.tabBarItem.selectedImage = [UIImage imageNamed:@"Elephant-selected"];
+ }
+ return self;
+}
+
+- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+ UITableViewCell* cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"test"];
+ cell.detailTextLabel.text = @"Test Cell";
+ cell.textLabel.text = [NSString stringWithFormat:@"cell %@",indexPath];
+ return cell;
+}
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
+ return 1;
+}
+
+- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+ return 30;
+}
+
+@end
2  Classes/en.lproj/InfoPlist.strings
@@ -0,0 +1,2 @@
+/* Localized versions of Info.plist keys */
+
18 Classes/main.m
@@ -0,0 +1,18 @@
+//
+// main.m
+// JBTabBarController
+//
+// Created by Jin Budelmann on 3/02/12.
+// Copyright (c) 2012 BitCrank. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+#import "AppDelegate.h"
+
+int main(int argc, char *argv[])
+{
+ @autoreleasepool {
+ return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
+ }
+}
BIN  Extras/At.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
14 Extras/At.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 14.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 43363) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="98.109px" height="100px" viewBox="0 0 98.109 100" enable-background="new 0 0 98.109 100" xml:space="preserve">
+<path d="M65.99,25.946h12.627l-5.909,31.979c-0.537,2.286-1.748,7.394,0.943,7.394c5.646,0,12.497-6.052,12.497-20.431
+ c0-21.506-14.787-32.526-35.218-32.526c-22.302,0-36.551,15.723-36.551,37.772c0,23.514,16.128,37.495,38.836,37.495
+ c10.082,0,18.826-2.961,25.401-7.93h13.176C82.252,92.875,68.54,100,52.147,100C23.517,100,0,79.3,0,50.134
+ C0,21.504,22.98,0,51.337,0c23.656,0,46.771,15.73,46.771,40.594c0,30.776-25.271,38.835-33.192,38.835
+ c-4.979,0-8.198-2.284-8.337-6.578h-0.265c-2.692,3.626-6.861,6.717-12.904,6.717c-11.566,0-22.184-11.02-22.184-24.327
+ c0-15.729,10.618-30.646,27.023-30.646c6.849,0,12.497,2.286,16.523,7.792L65.99,25.946z M60.877,49.996
+ c0-6.449-4.159-10.882-10.614-10.882c-7.791,0-13.31,6.986-13.31,13.973c0,6.181,3.636,11.02,10.224,11.02
+ C55.505,64.106,60.877,57.657,60.877,49.996z"/>
+</svg>
BIN  Extras/Brain.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
38 Extras/Brain.svg
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 14.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 43363) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="100px" height="85.407px" viewBox="0 0 100 85.407" enable-background="new 0 0 100 85.407" xml:space="preserve">
+<path d="M100,42.672c0,4.26-1.67,8.128-4.385,11.008c-0.466,6.078-4.317,11.208-9.685,13.521v0.057
+ c-6.555,3.817-10.474,10.333-11.667,18.149h-6.061V67.275c0.04-5.652,1.818-9.271,5.544-11.504c1.363-0.784,2.602-1.681,3.658-2.675
+ c2.766,0.994,5.214,2.942,6.771,5.714c0.324,0.545,0.903,0.852,1.477,0.852c0.278,0,0.568-0.068,0.829-0.222
+ c0.83-0.455,1.125-1.488,0.659-2.306h-0.011c-1.744-3.102-4.396-5.391-7.407-6.754c1.545-2.375,2.403-5.203,2.363-8.6
+ c0-0.017,0.023-0.034,0.023-0.057c0-1.534-0.227-3.027-0.636-4.431c3.539-0.676,6.657-2.471,8.952-5
+ c0.636-0.698,0.59-1.772-0.114-2.397c-0.699-0.63-1.755-0.574-2.38,0.108c-2,2.176-4.698,3.664-7.765,4.073
+ c-2.465-4.567-7.049-7.81-12.422-8.401c0.358-2.897,1.664-5.481,3.629-7.447c0.648-0.659,0.648-1.734,0-2.387
+ c-0.659-0.665-1.75-0.665-2.408,0c-2.516,2.518-4.198,5.88-4.618,9.624c-6.311-0.795-11.173-6.152-11.184-12.674
+ c0-0.926-0.767-1.698-1.676-1.698c-0.96,0-1.71,0.772-1.71,1.698c0,1.102,0.108,2.153,0.318,3.187
+ c-2.392,2.069-5.368,3.114-8.35,3.114c-1.471,0-2.948-0.261-4.339-0.767c0,0-0.023-0.006-0.04-0.011
+ c-1.715-0.619-3.289-1.604-4.652-2.967c-0.653-0.659-1.732-0.659-2.397,0c-0.665,0.659-0.665,1.729,0,2.393
+ c1.397,1.392,2.971,2.471,4.646,3.249c-0.335,4.22-2.789,7.85-6.22,9.889c-1.982-3.011-4.964-5.396-8.628-6.561
+ c-0.915-0.284-1.863,0.21-2.153,1.102c-0.25,0.892,0.205,1.841,1.108,2.119c2.721,0.863,4.908,2.539,6.481,4.675
+ c-1.056,0.284-2.141,0.437-3.294,0.437c0,0,0,0-0.018,0H22.05c-4.351,0-8.35,1.733-11.258,4.568
+ c-0.688,0.653-0.704,1.727-0.028,2.392c0.323,0.341,0.767,0.511,1.227,0.511c0.387,0,0.812-0.159,1.142-0.477
+ c2.307-2.25,5.453-3.607,8.918-3.607h0.182h0.005h0.018c8.156,0,14.933-6.074,15.995-13.946c1.159,0.25,2.317,0.386,3.493,0.386
+ c3.312,0,6.652-1.028,9.463-3.062c1.028,2.346,2.653,4.396,4.624,5.987c-2.011,2.477-3.192,5.419-3.504,8.429
+ c-0.847-0.136-1.738-0.21-2.63-0.21c-2.556,0-5.152,0.607-7.566,1.898c-0.829,0.438-1.142,1.465-0.704,2.295
+ c0.307,0.562,0.903,0.892,1.511,0.892c0.278,0,0.528-0.062,0.772-0.205c1.943-1.017,3.977-1.5,5.987-1.5
+ c0.897,0,1.783,0.097,2.63,0.278c0.369,3.431,1.852,6.788,4.402,9.458c0.341,0.353,0.778,0.523,1.216,0.523
+ c0.415,0,0.846-0.154,1.182-0.466c0.693-0.653,0.71-1.716,0.051-2.392h-0.011c-2.267-2.397-3.465-5.441-3.544-8.52
+ c0-0.046,0.011-0.08,0-0.131c0-0.062,0-0.125,0-0.188c0-2.989,1.034-5.943,3.079-8.317c2.153,1.074,4.606,1.699,7.203,1.699
+ c0,0,0.011,0.005,0.028,0.005c0,0,0.011,0,0.028,0c7.032,0.023,12.724,5.705,12.752,12.736c-1.334-0.352-2.709-0.534-4.118-0.534
+ c-2.016,0-4.061,0.369-6.032,1.182c-0.875,0.358-1.29,1.34-0.937,2.204c0.357,0.863,1.329,1.284,2.198,0.932
+ c1.579-0.63,3.187-0.937,4.771-0.937c1.278,0,2.545,0.193,3.732,0.562c-0.415,1.897-1.227,3.419-2.488,4.771
+ c-0.097,0.085-0.188,0.182-0.261,0.295c-0.966,0.949-2.125,1.823-3.556,2.692c-4.902,2.863-7.254,8.055-7.203,14.418v18.132h-5.783
+ V68.161c0-6.333-3.97-12.339-8.969-14.475c-2.386-0.926-4.874-2.477-6.686-4.505c-2.584,1.755-5.686,2.789-9.021,2.789
+ c-3.346,0-6.447-1.017-9.014-2.76c-2.556,1.681-5.641,2.664-8.94,2.664C7.333,51.875,0,44.524,0,35.464
+ c0-6.772,4.095-12.583,9.958-15.083c1.585-7.227,7.986-12.634,15.688-12.634c0.409,0,0.784,0.034,1.165,0.057
+ c2.903-4.243,7.782-7.027,13.309-7.027c2.738,0,5.306,0.682,7.561,1.897C50.225,0.982,53.269,0,56.546,0
+ c4.209,0,8.043,1.642,10.917,4.306c1.204-0.29,2.448-0.46,3.749-0.46c6.504,0,12.127,3.914,14.638,9.52
+ c6.601,2,11.406,8.124,11.406,15.372c0,1.454-0.193,2.857-0.551,4.192C98.762,35.635,100,39.009,100,42.672z"/>
+</svg>
BIN  Extras/Elephant.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 Extras/Elephant.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" width="100px" height="100px" viewBox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve">
+<path d="M90.85,64.833c-0.204,4.295-4.854,7.169-8.654,4.672c-2.271-1.492-2.523-3.887-2.518-6.335l0.002-17.319 c0-12.398-10.14-22.447-22.535-22.447h-0.433H44.361c0.003,4.286,0.006,8.573,0,12.859c-0.002,3.312-0.123,6.536,1.285,9.657 c2.431,5.396,7.871,8.663,13.719,8.663l0.018,0.001c2.873-0.018,6.028,0.946,8.213,2.835c2.306,1.994,3.231,4.566,3.456,7.299v0.125 c0.072,1.592,0.3,3.121,0.889,4.77c2.257,6.308,8.81,10.165,15.405,9.197c7.078-1.037,11.759-7.025,12.089-13.977 C99.694,59.312,91.11,59.323,90.85,64.833z"/>
+<path d="M43.647,67.583l5.192,5.91l-1.773,1.769c-2.595,2.599-2.595,6.807,0,9.402c2.597,2.597,6.806,2.597,9.405,0l5.73-5.781 c2.598-2.6,2.598-6.808,0-9.404l-3.33-3.328c-0.826-0.863-1.433-1.907-1.433-3.252c0-2.195,1.777-3.97,3.968-3.97 c0.381,0,0.746,0.056,1.094,0.155c-1.456-0.628-3.09-0.939-4.599-0.925c-0.004,0-0.008,0-0.008,0 c-10.082-0.024-17.063-8.089-17.112-17.843c-0.028-5.161-0.014-10.321-0.006-15.481H23.073c-12.397,0-22.448,10.05-22.448,22.448 v23.16l5.382-5.01v14.531c0,3.67,2.977,6.648,6.648,6.648c3.674,0,6.65-2.979,6.65-6.648V69.727c0.125-2.919,2.538-5.254,5.49-5.254 c2.951,0,5.424,2.335,5.547,5.254v10.237c0,3.67,2.978,6.648,6.649,6.648c3.674,0,6.65-2.979,6.65-6.648L43.647,67.583z"/>
+<circle cx="1.5" cy="68.375" r="0.875"/>
+</svg>
BIN  Extras/Fist.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
49 Extras/Fist.svg
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="65.18px" height="100px" viewBox="0 0 65.18 100" enable-background="new 0 0 65.18 100" xml:space="preserve">
+<path d="M35.479,39.365c-0.168,0.449-0.277,0.91-0.324,1.379c-0.053,0.518-0.039,1.039,0.057,1.555
+ c0.058,0.309,0.131,0.617,0.241,0.918c0.515,1.392,1.539,2.499,2.888,3.119c0.734,0.338,1.514,0.508,2.315,0.508
+ c0.996,0,1.949-0.279,2.781-0.764c0.45-0.262,0.863-0.584,1.227-0.964c0.325-0.339,0.605-0.725,0.839-1.145
+ c0.067-0.121,0.143-0.237,0.201-0.365c0,0,11.078-24.098,11.102-24.147c0.023-0.052,0.334-0.974,0.4-1.345
+ c0.434-2.428-0.783-4.941-3.127-6.02c-0.732-0.338-1.512-0.508-2.313-0.508c-1.688,0-3.258,0.78-4.3,2.052
+ c-0.293,0.359-0.551,0.75-0.748,1.183c0.001-0.004,0.002-0.008,0.004-0.011l-0.006,0.012c-0.001,0.001-0.002,0.004-0.004,0.006
+ L35.616,38.97C35.558,39.099,35.527,39.233,35.479,39.365z"/>
+<path d="M40.476,12.83c0.235,0.236,0.388,0.544,0.5,0.881c0.263,0.799,0.219,1.822,0.001,2.859
+ c-0.112,0.529-0.262,1.054-0.442,1.551c-0.068,0.191-0.137,0.384-0.214,0.564c-0.113,0.275-0.262,0.595-0.434,0.933
+ c-1.504,2.975-5.374,7.975-14.463,8.285c-0.005,0-0.012,0.001-0.017,0.001L21.62,35.79c2.366,0.559,6.577,1.881,10.227,4.73
+ l12.345-26.859c0.202-0.438,0.32-0.889,0.401-1.344c0.432-2.431-0.783-4.945-3.127-6.022c-0.734-0.336-1.514-0.508-2.313-0.508
+ c-1.688,0-3.257,0.779-4.298,2.052c-0.296,0.359-0.554,0.751-0.754,1.184c0.002-0.004,0.002-0.006,0.006-0.01l-0.006,0.01
+ l-0.003,0.007l-1.56,3.395h7.532L40.476,12.83z"/>
+<path d="M25.861,12.424h1.352h2.268l2.087-4.549c0.2-0.438,0.319-0.89,0.399-1.344c0.433-2.429-0.782-4.943-3.126-6.021
+ C28.105,0.174,27.327,0,26.527,0c-1.688,0-3.258,0.781-4.299,2.053c-0.293,0.359-0.552,0.751-0.751,1.185
+ c0,0.002-0.004,0.004-0.004,0.006l-4.213,9.18h4.614H25.861z"/>
+<polygon points="31.578,7.861 31.581,7.853 31.578,7.861 31.573,7.874 "/>
+<polygon points="55.551,28.84 55.55,28.84 55.55,28.841 "/>
+<polygon points="44.949,45.252 44.952,45.248 44.95,45.249 "/>
+<polygon points="44.954,45.241 44.952,45.245 44.952,45.246 "/>
+<g>
+ <path d="M38.862,92.954c1.833-0.246,3.513-0.967,4.918-2.04l-4.918-4.919V92.954z"/>
+ <path d="M36.083,92.954v-6.959l-4.917,4.919C32.57,91.987,34.25,92.708,36.083,92.954z"/>
+ <path d="M27.056,82.642c0,2.371,0.806,4.554,2.146,6.308l6.881-6.883v-9.738C30.996,73.011,27.056,77.37,27.056,82.642z"/>
+ <path d="M65.18,33.276c0-0.624-0.348-1.915-0.362-1.927c-0.785-2.115-2.805-3.628-5.191-3.628c-0.501,0-0.979,0.088-1.441,0.213
+ c-0.803,0.216-1.528,0.607-2.145,1.131c-0.724,0.617-1.282,1.405-1.615,2.315c-0.004,0.012-0.006,0.026-0.012,0.038l-6.939,14.99
+ h0.002c-0.205,0.447-0.308,0.913-0.332,1.377c-0.008,0.166,0,0.33,0.013,0.492c0.106,1.305,0.888,2.518,2.16,3.103
+ c0.604,0.279,1.255,0.362,1.89,0.297c0.828-0.086,1.627-0.432,2.242-0.996c0.295-0.271,0.539-0.6,0.731-0.962l3.605-7.787
+ l2.521,1.163l0.25-0.543l-3.742,8.143l-0.006,0.012c-0.062,0.135-0.137,0.259-0.211,0.386c-0.155,0.278-0.327,0.548-0.518,0.799
+ c-0.391,0.519-0.86,0.967-1.379,1.343c-1.006,0.733-2.213,1.183-3.494,1.247c-0.111,0.007-0.218,0.021-0.327,0.021h-0.001
+ c-0.943,0-1.859-0.202-2.723-0.598c-1.292-0.596-2.284-1.566-2.936-2.72c-0.314-0.557-0.537-1.157-0.678-1.781
+ c-0.054-0.233-0.096-0.466-0.123-0.705c-0.43,0.22-0.872,0.412-1.337,0.555c-0.776,0.238-1.593,0.368-2.425,0.368c0,0,0,0-0.001,0
+ c-0.965,0-1.61-0.172-2.511-0.497c0.512,1.676,0.831,3.528,0.831,5.63v10.526h-2.777V54.755c0-2.521-0.788-4.656-1.598-6.478
+ c-3.794-8.545-14.629-10.023-15.182-10.092l-1.914-0.24l6.146-12.802h0.875c0.232,0,0.43-0.029,0.652-0.035
+ c0.538-0.016,1.074-0.033,1.568-0.084c5.297-0.549,8.203-3.018,9.739-5.135c0.133-0.183,0.249-0.367,0.366-0.548
+ c0.272-0.426,0.499-0.842,0.69-1.248c0.219-0.463,0.389-0.906,0.517-1.313c0.195-0.628,0.298-1.174,0.328-1.578H15.408
+ c-2.75,0-5.154,1.458-6.5,3.64c-0.314,0.51-0.572,1.056-0.762,1.635l-7.218,15.48l-0.371,0.796C0.201,37.635,0,38.597,0,39.608
+ c0,1.382,0.373,2.675,1.014,3.794l0.781,1.12l17.738,23.491v31.984h33.331V100h2.777l0.002-23.609l8.821-17.957
+ c0.124-0.223,0.243-0.446,0.336-0.687c0.233-0.594,0.368-1.235,0.379-1.908C65.181,55.805,65.18,33.276,65.18,33.276z
+ M37.473,95.836c-7.276,0-13.194-5.919-13.194-13.194s5.918-13.193,13.194-13.193c7.274,0,13.194,5.918,13.194,13.193
+ S44.747,95.836,37.473,95.836z"/>
+ <path d="M38.862,72.328v9.738l6.881,6.883c1.34-1.754,2.146-3.937,2.146-6.308C47.89,77.37,43.949,73.011,38.862,72.328z"/>
+</g>
+</svg>
BIN  Extras/Levitate.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 Extras/Levitate.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0" x="0px" y="0px" width="65.586px" height="100px" viewBox="0 0 65.586 100" overflow="visible" enable-background="new 0 0 65.586 100" xml:space="preserve">
+ <path d="M32.796,19.596c5.417-0.002,9.799-4.389,9.799-9.795c0-5.413-4.383-9.797-9.799-9.8c-5.411,0.003-9.787,4.387-9.787,9.8 C23.009,15.207,27.385,19.594,32.796,19.596z"/>
+ <path d="M65.493,48.064c-0.101-0.463-0.296-0.881-0.54-1.259l0.013-0.007l-0.032-0.029c-0.322-0.489-0.751-0.889-1.241-1.183 l-7.548-7.18l-7.639-14.208l0,0l-0.355-0.661l-0.016,0.012c-0.912-1.39-2.51-2.214-4.213-2.108H21.663 c-1.704-0.105-3.301,0.718-4.212,2.108l-0.016-0.012l-0.356,0.661l0,0L9.44,38.406l-7.548,7.18 c-0.492,0.293-0.92,0.693-1.241,1.183l-0.032,0.029l0.012,0.007c-0.245,0.378-0.438,0.796-0.54,1.259 c-0.46,2.084,0.855,4.148,2.939,4.608c0.081,0.017,0.156,0.015,0.236,0.027c-0.483,0.941-0.782,1.99-0.782,3.12 c0,2.941,1.854,5.432,4.449,6.416L6.921,62.26l11.457,4.958l-2.341,1.179c-0.242,0.097-0.469,0.223-0.693,0.352l-0.028,0.015l0,0 c-1.694,0.978-2.851,2.787-2.851,4.884c0,3.125,2.535,5.657,5.66,5.657c0.694,0,1.354-0.143,1.969-0.373l0.008,0.019l0.166-0.07 c0.04-0.02,0.083-0.037,0.125-0.057l12.399-5.364l12.399,5.364c0.042,0.02,0.085,0.037,0.125,0.057l0.166,0.07l0.008-0.019 c0.615,0.23,1.275,0.373,1.968,0.373c3.125,0,5.66-2.532,5.66-5.657c0-2.097-1.155-3.906-2.85-4.884l0,0l-0.027-0.015 c-0.226-0.129-0.451-0.255-0.694-0.352l-2.341-1.179l11.456-4.958l-0.012-0.024c2.596-0.984,4.45-3.475,4.45-6.416 c0-1.13-0.3-2.179-0.783-3.12c0.081-0.013,0.155-0.011,0.236-0.027C64.638,52.212,65.954,50.148,65.493,48.064z M9.592,48.963 l6.715-5.888l3.291-5.324l1.116,16.112l-7.962-4.013l-0.006,0.012C11.807,49.329,10.74,49.002,9.592,48.963z M52.834,49.851 l-6.847,3.45l1.148-13.692l2.143,3.466l6.714,5.888c-1.147,0.039-2.215,0.365-3.152,0.899L52.834,49.851z"/>
+ <ellipse cx="32.792" cy="93.115" rx="31.664" ry="6.235"/>
+</svg>
BIN  Extras/iOSTabBarItemImageLayerStyles.asl
Binary file not shown
38 JBTabBarController/JBTabBar.h
@@ -0,0 +1,38 @@
+//
+// JBTabBar.h
+// JBTabBarController
+//
+// Created by Jin Budelmann on 3/02/12.
+// Copyright (c) 2012 BitCrank. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@protocol JBTabBarDelegate;
+
+@interface JBTabBar : UIView {
+ NSMutableArray *_buttons;
+ __unsafe_unretained id<JBTabBarDelegate> _delegate;
+ NSArray *_items;
+ __unsafe_unretained UITabBarItem *_selectedItem;
+ UIImage *_selectionIndicatorImage;
+ UIImageView *_backgroundView;
+}
+
+@property(nonatomic,unsafe_unretained) id<JBTabBarDelegate> delegate;
+@property(nonatomic,copy) NSArray *items;
+@property(nonatomic,unsafe_unretained) UITabBarItem *selectedItem;
+
+//- (void)setItems:(NSArray *)items animated:(BOOL)animated;
+
+@property(nonatomic,strong) UIImage *backgroundImage;
+@property(nonatomic,strong) UIImage *selectionIndicatorImage;
+
+@end
+
+@protocol JBTabBarDelegate<NSObject>
+@optional
+
+- (void)tabBar:(JBTabBar *)tabBar didSelectItem:(UITabBarItem *)item;
+
+@end
161 JBTabBarController/JBTabBar.m
@@ -0,0 +1,161 @@
+//
+// JBTabBar.m
+// JBTabBarController
+//
+// Created by Jin Budelmann on 3/02/12.
+// Copyright (c) 2012 BitCrank. All rights reserved.
+//
+
+#import "JBTabBar.h"
+#import "JBTabBarButton.h"
+#import "UITabBarItem+JBAdditions.h"
+
+@interface JBTabBar()
+-(UIButton*) buttonWithTabBarItem:(UITabBarItem*)item;
+@end
+
+static CGSize const kDefaultSize = {320.0f, 49.0f};
+
+@implementation JBTabBar
+
+@synthesize delegate = _delegate;
+@synthesize items = _items;
+@synthesize selectedItem = _selectedItem;
+
+@synthesize selectionIndicatorImage = _selectionIndicatorImage;
+
+- (id) init
+{
+ if (self = [super init])
+ {
+ self.backgroundColor = [UIColor blackColor];
+ _backgroundView = [[UIImageView alloc] initWithFrame:self.bounds];
+ _backgroundView.backgroundColor = [UIColor blackColor];
+ _backgroundView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth ;
+ [self addSubview:_backgroundView];
+ [self sendSubviewToBack:_backgroundView];
+
+ self.frame = CGRectMake(0.0f, 0.0f, kDefaultSize.width, kDefaultSize.height);
+ }
+ return self;
+}
+
+- (void) setItems:(NSArray *)items {
+ _items = items;
+
+ _buttons = [[NSMutableArray alloc] initWithCapacity:[_items count]];
+
+ for (UITabBarItem* item in _items)
+ {
+ UIButton* button = [self buttonWithTabBarItem:item];
+
+ [button addTarget:self action:@selector(touchDownAction:) forControlEvents:UIControlEventTouchDown];
+ [button addTarget:self action:@selector(otherTouchesAction:) forControlEvents:UIControlEventTouchUpInside | UIControlEventTouchUpOutside | UIControlEventTouchDragOutside | UIControlEventTouchDragInside];
+
+ [_buttons addObject:button];
+
+ [self addSubview:button];
+ }
+}
+
+- (void)layoutSubviews {
+ [super layoutSubviews];
+
+ NSUInteger itemCount = [_items count];
+
+ CGFloat horizontalOffset = 0;
+
+ for (NSUInteger i = 0 ; i < itemCount ; i++)
+ {
+ UIButton* button = [_buttons objectAtIndex:i];
+ button.frame = CGRectMake(horizontalOffset, 0.0, self.frame.size.width/itemCount, self.frame.size.height);
+
+ horizontalOffset = horizontalOffset + self.frame.size.width/itemCount;
+ }
+}
+
+- (void)setBackgroundImage:(UIImage *)backgroundImage {
+ _backgroundView.image = backgroundImage;
+}
+
+- (UIImage *)backgroundImage {
+ return _backgroundView.image;
+}
+
+- (void)setSelectionIndicatorImage:(UIImage *)selectionIndicatorImage {
+ for (JBTabBarButton* button in _buttons) {
+ [button setBackgroundImage:selectionIndicatorImage forState:UIControlStateHighlighted];
+ [button setBackgroundImage:selectionIndicatorImage forState:UIControlStateSelected];
+ }
+ _selectionIndicatorImage = selectionIndicatorImage;
+}
+
+-(void) dimAllButtonsExcept:(UIButton*)selectedButton
+{
+ for (UIButton* button in _buttons)
+ {
+ if (button == selectedButton)
+ {
+ button.selected = YES;
+ button.highlighted = NO;
+ }
+ else
+ {
+ button.selected = NO;
+ button.highlighted = NO;
+ }
+ }
+}
+
+- (void)touchDownAction:(UIButton*)button
+{
+ self.selectedItem = [_items objectAtIndex:[_buttons indexOfObject:button]];
+
+ if ([_delegate respondsToSelector:@selector(tabBar:didSelectItem:)])
+ [_delegate performSelector:@selector(tabBar:didSelectItem:) withObject:self withObject:_selectedItem];
+}
+
+- (void)otherTouchesAction:(UIButton*)button
+{
+ [self dimAllButtonsExcept:button];
+}
+
+- (void) selectItemAtIndex:(NSInteger)index
+{
+ UIButton* button = [_buttons objectAtIndex:index];
+
+ [self dimAllButtonsExcept:button];
+}
+
+- (UIButton*) buttonWithTabBarItem:(UITabBarItem *)item
+{
+ JBTabBarButton* button = [[JBTabBarButton alloc] init];
+ button.titleLabel.font = [UIFont boldSystemFontOfSize:10.0f];
+ button.titleLabel.textAlignment = UITextAlignmentCenter;
+
+ [button setTitleColor:[UIColor colorWithWhite:0.6f alpha:1.0f] forState:UIControlStateNormal];
+ [button setTitleColor:[UIColor whiteColor] forState:UIControlStateSelected];
+ [button setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted];
+
+ [button setImage:item.image forState:UIControlStateNormal];
+ [button setImage:item.selectedImage forState:UIControlStateHighlighted];
+ [button setImage:item.selectedImage forState:UIControlStateSelected];
+
+ [button setBackgroundImage:self.selectionIndicatorImage forState:UIControlStateHighlighted];
+ [button setBackgroundImage:self.selectionIndicatorImage forState:UIControlStateSelected];
+
+ [button setTitle:item.title forState:UIControlStateNormal];
+
+ button.adjustsImageWhenHighlighted = NO;
+
+ return button;
+}
+
+- (void)setSelectedItem:(UITabBarItem *)selectedItem {
+ if ([_items containsObject:selectedItem]) {
+ [self dimAllButtonsExcept:[_buttons objectAtIndex:[_items indexOfObject:selectedItem]]];
+ _selectedItem = selectedItem;
+ }
+}
+
+@end
13 JBTabBarController/JBTabBarButton.h
@@ -0,0 +1,13 @@
+//
+// JBTabBarButton.h
+// JBTabBarControllerExample
+//
+// Created by Jin Budelmann on 10/02/12.
+// Copyright (c) 2012 BitCrank. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface JBTabBarButton : UIButton
+
+@end
57 JBTabBarController/JBTabBarButton.m
@@ -0,0 +1,57 @@
+//
+// JBTabBarButton.m
+// JBTabBarControllerExample
+//
+// Created by Jin Budelmann on 10/02/12.
+// Copyright (c) 2012 BitCrank. All rights reserved.
+//
+
+#import "JBTabBarButton.h"
+
+@implementation JBTabBarButton
+
+- (void) layoutSubviews {
+ [super layoutSubviews];
+
+ self.titleLabel.numberOfLines = 1;
+ self.titleLabel.adjustsFontSizeToFitWidth = NO;
+ self.titleLabel.lineBreakMode = UILineBreakModeMiddleTruncation;
+
+ if (!![self currentImage] && !![self currentTitle]) {
+ CGFloat paddingV = 3.0f;
+ CGFloat imageHeight = self.bounds.size.height - self.titleLabel.font.lineHeight - 2*paddingV;
+ CGFloat imageScale = imageHeight/self.imageView.frame.size.height;
+
+ CGRect frame = self.imageView.frame;
+ frame.size.height *= imageScale;
+ frame.size.width *= imageScale;
+ frame.origin.x = (self.bounds.size.width - frame.size.width)/2;
+ frame.origin.y = paddingV;
+ self.imageView.frame = frame;
+
+ frame = self.titleLabel.frame;
+ frame.origin.x = 3.0f;
+ frame.origin.y = self.imageView.frame.size.height + paddingV;
+ frame.size.height = self.titleLabel.font.lineHeight;
+ frame.size.width = self.bounds.size.width - 2*frame.origin.x;
+ self.titleLabel.frame = frame;
+ } else if (![self currentImage] && !![self currentTitle]) {
+ CGFloat padding = (self.bounds.size.height - self.titleLabel.font.lineHeight)/2;
+
+ CGRect frame = self.titleLabel.frame;
+ frame.origin.x = 3.0f;
+ frame.origin.y = padding;
+ frame.size.height = self.titleLabel.font.lineHeight;
+ frame.size.width = self.bounds.size.width - 2*frame.origin.x;
+ self.titleLabel.frame = frame;
+ } else if (!![self currentImage] && ![self currentTitle]) {
+ CGFloat padding = (self.bounds.size.height - self.imageView.frame.size.height)/2;
+
+ CGRect frame = self.imageView.frame;
+ frame.origin.x = (self.bounds.size.width - frame.size.width)/2;
+ frame.origin.y = padding;
+ self.imageView.frame = frame;
+ }
+}
+
+@end
27 JBTabBarController/JBTabBarController.h
@@ -0,0 +1,27 @@
+//
+// JBTabBarController.h
+// JBTabBarController
+//
+// Created by Jin Budelmann on 3/02/12.
+// Copyright (c) 2012 BitCrank. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+#import "JBTabBar.h"
+
+@class JBTabBar;
+@protocol JBTabBarDelegate;
+
+@interface JBTabBarController : UIViewController <JBTabBarDelegate> {
+ NSArray* _viewControllers;
+ __unsafe_unretained UIViewController* _selectedViewController;
+}
+
+@property (nonatomic, readonly, retain) JBTabBar* tabBar;
+@property (nonatomic, retain) NSArray* viewControllers;
+
+@property (nonatomic, unsafe_unretained) UIViewController* selectedViewController;
+@property (nonatomic) NSUInteger selectedIndex;
+
+@end
133 JBTabBarController/JBTabBarController.m
@@ -0,0 +1,133 @@
+ //
+// JBTabBarController.m
+// JBTabBarController
+//
+// Created by Jin Budelmann on 3/02/12.
+// Copyright (c) 2012 BitCrank. All rights reserved.
+//
+
+#import "JBTabBarController.h"
+
+#import "JBTabBar.h"
+
+#import "UITabBarItem+JBAdditions.h"
+
+@interface JBTabBarController()
+
+@property (nonatomic, readwrite, retain) JBTabBar* tabBar;
+
+- (void) setUpTabBarItems;
+
+@end
+
+@implementation JBTabBarController
+
+@synthesize tabBar;
+@synthesize viewControllers = _viewControllers;
+
+#pragma mark - View lifecycle
+
+- (void)loadView
+{
+ self.view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
+ self.view.backgroundColor = [UIColor blackColor];
+
+ self.tabBar = [[JBTabBar alloc] init];
+ self.tabBar.delegate = self;
+
+ self.tabBar.backgroundImage = [UIImage imageNamed:@"bg"];
+ self.tabBar.selectionIndicatorImage = [[UIImage imageNamed:@"bg-selected"] resizableImageWithCapInsets:UIEdgeInsetsMake(6, 5, 5, 5)];
+
+ CGRect frame = self.tabBar.frame;
+ frame.origin.y = self.view.bounds.size.height - frame.size.height;
+ self.tabBar.frame = frame;
+ self.tabBar.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleWidth;
+ [self setUpTabBarItems];
+ self.selectedIndex = 0;
+
+ [self.view addSubview:self.tabBar];
+}
+
+- (void)viewDidUnload {
+ [super viewDidUnload];
+
+ self.tabBar = nil;
+}
+
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
+{
+ return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
+}
+
+- (void) setViewControllers:(NSArray *)viewControllers {
+ _viewControllers = viewControllers;
+ if (self.tabBar) {
+ [self setUpTabBarItems];
+ }
+}
+
+- (void) setUpTabBarItems {
+ if ([_viewControllers count]>0) {
+ NSMutableArray* items = [[NSMutableArray alloc] initWithCapacity:[_viewControllers count]];
+ for (id object in _viewControllers) {
+ NSAssert([object isKindOfClass:[UIViewController class]], @"Only UIViewControllers can be loaded into the JBTabBArController viewControllers");
+ UIViewController* controller = (UIViewController*) object;
+ [items addObject:controller.tabBarItem];
+ }
+ self.tabBar.items = items;
+ }
+}
+
+- (void)tabBar:(JBTabBar *)tabBar didSelectItem:(UITabBarItem *)item {
+ for (UIViewController* controller in _viewControllers) {
+ if ([controller.tabBarItem isEqual:item]) {
+ self.selectedViewController = controller;
+ return;
+ }
+ }
+}
+
+#pragma mark Selected Tab properties
+
+- (void)setSelectedIndex:(NSUInteger)selectedIndex {
+ self.selectedViewController = [_viewControllers objectAtIndex:selectedIndex];
+}
+
+- (NSUInteger)selectedIndex {
+ return [_viewControllers indexOfObject:_selectedViewController];
+}
+
+- (void)setSelectedViewController:(UIViewController *)selectedViewController {
+ if (selectedViewController != _selectedViewController && [_viewControllers containsObject:selectedViewController]) {
+ [_selectedViewController.view removeFromSuperview];
+
+ CGRect frame = self.view.bounds;
+ frame.size.height -= self.tabBar.frame.size.height;
+ selectedViewController.view.frame = frame;
+
+ [self.view insertSubview:selectedViewController.view belowSubview:self.tabBar];
+
+ _selectedViewController = selectedViewController;
+ if (self.tabBar.selectedItem != _selectedViewController.tabBarItem) {
+ self.tabBar.selectedItem = _selectedViewController.tabBarItem;
+ }
+ }
+}
+
+- (UIViewController*) selectedViewController {
+ return _selectedViewController;
+}
+
+- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
+ [_selectedViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
+}
+
+- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
+ [_selectedViewController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
+}
+
+- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
+ [_selectedViewController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
+}
+
+@end
15 JBTabBarController/UITabBarItem+JBAdditions.h
@@ -0,0 +1,15 @@
+//
+// UITabBarItem+JBAdditions.h
+// JBTabBarController
+//
+// Created by Jin Budelmann on 3/02/12.
+// Copyright (c) 2012 BitCrank. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface UITabBarItem (JBAdditions)
+
+@property (nonatomic, strong) UIImage* selectedImage;
+
+@end
24 JBTabBarController/UITabBarItem+JBAdditions.m
@@ -0,0 +1,24 @@
+//
+// UITabBarItem+JBAdditions.m
+// JBTabBarController
+//
+// Created by Jin Budelmann on 3/02/12.
+// Copyright (c) 2012 BitCrank. All rights reserved.
+//
+
+#import "UITabBarItem+JBAdditions.h"
+#import <objc/runtime.h>
+
+@implementation UITabBarItem (JBAdditions)
+
+static char selectedImageKey;
+
+- (UIImage*) selectedImage {
+ return (UIImage*)objc_getAssociatedObject(self, &selectedImageKey);
+}
+
+- (void) setSelectedImage:(UIImage*)image {
+ objc_setAssociatedObject(self, &selectedImageKey, image, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
+}
+
+@end
461 JBTabBarControllerExample.xcodeproj/project.pbxproj
@@ -0,0 +1,461 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 0E25B69E14E4B1D4004582F3 /* FirstViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E25B69714E4B1D2004582F3 /* FirstViewController.m */; };
+ 0E25B69F14E4B1D4004582F3 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E25B69914E4B1D2004582F3 /* AppDelegate.m */; };
+ 0E25B6A014E4B1D4004582F3 /* SecondViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E25B69B14E4B1D3004582F3 /* SecondViewController.m */; };
+ 0E25B6A114E4B1D4004582F3 /* ThirdViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E25B69D14E4B1D4004582F3 /* ThirdViewController.m */; };
+ 0E25B6A514E4B201004582F3 /* JBTabBarController-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 0E25B6A214E4B201004582F3 /* JBTabBarController-Info.plist */; };
+ 0E25B6A614E4B201004582F3 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E25B6A414E4B201004582F3 /* main.m */; };
+ 0E25B6AA14E4B216004582F3 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0E25B6A814E4B216004582F3 /* InfoPlist.strings */; };
+ 0E7D3FDF14DB31CF00E2D3A6 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E7D3FDE14DB31CF00E2D3A6 /* UIKit.framework */; };
+ 0E7D3FE114DB31CF00E2D3A6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E7D3FE014DB31CF00E2D3A6 /* Foundation.framework */; };
+ 0E7D3FE314DB31CF00E2D3A6 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E7D3FE214DB31CF00E2D3A6 /* CoreGraphics.framework */; };
+ 0E7D401014DB323500E2D3A6 /* JBTabBar.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E7D400F14DB323500E2D3A6 /* JBTabBar.m */; };
+ 0E7D401A14DB691C00E2D3A6 /* JBTabBarController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E7D401914DB691C00E2D3A6 /* JBTabBarController.m */; };
+ 0E7D401D14DB743100E2D3A6 /* UITabBarItem+JBAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E7D401C14DB743000E2D3A6 /* UITabBarItem+JBAdditions.m */; };
+ 0EC2724014F1CC7600C8FC3E /* At-selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 0EC2722C14F1CC7600C8FC3E /* At-selected.png */; };
+ 0EC2724114F1CC7600C8FC3E /* At-selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0EC2722D14F1CC7600C8FC3E /* At-selected@2x.png */; };
+ 0EC2724214F1CC7600C8FC3E /* At-unselected.png in Resources */ = {isa = PBXBuildFile; fileRef = 0EC2722E14F1CC7600C8FC3E /* At-unselected.png */; };
+ 0EC2724314F1CC7600C8FC3E /* At-unselected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0EC2722F14F1CC7600C8FC3E /* At-unselected@2x.png */; };
+ 0EC2724414F1CC7600C8FC3E /* Brain-selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 0EC2723014F1CC7600C8FC3E /* Brain-selected.png */; };
+ 0EC2724514F1CC7600C8FC3E /* Brain-selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0EC2723114F1CC7600C8FC3E /* Brain-selected@2x.png */; };
+ 0EC2724614F1CC7600C8FC3E /* Brain-unselected.png in Resources */ = {isa = PBXBuildFile; fileRef = 0EC2723214F1CC7600C8FC3E /* Brain-unselected.png */; };
+ 0EC2724714F1CC7600C8FC3E /* Brain-unselected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0EC2723314F1CC7600C8FC3E /* Brain-unselected@2x.png */; };
+ 0EC2724814F1CC7600C8FC3E /* Elephant-selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 0EC2723414F1CC7600C8FC3E /* Elephant-selected.png */; };
+ 0EC2724914F1CC7600C8FC3E /* Elephant-selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0EC2723514F1CC7600C8FC3E /* Elephant-selected@2x.png */; };
+ 0EC2724A14F1CC7600C8FC3E /* Elephant-unselected.png in Resources */ = {isa = PBXBuildFile; fileRef = 0EC2723614F1CC7600C8FC3E /* Elephant-unselected.png */; };
+ 0EC2724B14F1CC7600C8FC3E /* Elephant-unselected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0EC2723714F1CC7600C8FC3E /* Elephant-unselected@2x.png */; };
+ 0EC2724C14F1CC7600C8FC3E /* Fist-selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 0EC2723814F1CC7600C8FC3E /* Fist-selected.png */; };
+ 0EC2724D14F1CC7600C8FC3E /* Fist-selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0EC2723914F1CC7600C8FC3E /* Fist-selected@2x.png */; };
+ 0EC2724E14F1CC7600C8FC3E /* Fist-unselected.png in Resources */ = {isa = PBXBuildFile; fileRef = 0EC2723A14F1CC7600C8FC3E /* Fist-unselected.png */; };
+ 0EC2724F14F1CC7600C8FC3E /* Fist-unselected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0EC2723B14F1CC7600C8FC3E /* Fist-unselected@2x.png */; };
+ 0EC2725014F1CC7600C8FC3E /* Levitate-selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 0EC2723C14F1CC7600C8FC3E /* Levitate-selected.png */; };
+ 0EC2725114F1CC7600C8FC3E /* Levitate-selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0EC2723D14F1CC7600C8FC3E /* Levitate-selected@2x.png */; };
+ 0EC2725214F1CC7600C8FC3E /* Levitate-unselected.png in Resources */ = {isa = PBXBuildFile; fileRef = 0EC2723E14F1CC7600C8FC3E /* Levitate-unselected.png */; };
+ 0EC2725314F1CC7600C8FC3E /* Levitate-unselected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0EC2723F14F1CC7600C8FC3E /* Levitate-unselected@2x.png */; };
+ 0EC2725A14F1D46300C8FC3E /* FourthViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0EC2725914F1D46300C8FC3E /* FourthViewController.m */; };
+ 0EC2729314F1E14000C8FC3E /* bg-selected.png in Resources */ = {isa = PBXBuildFile; fileRef = 0EC2728F14F1E14000C8FC3E /* bg-selected.png */; };
+ 0EC2729414F1E14000C8FC3E /* bg-selected@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0EC2729014F1E14000C8FC3E /* bg-selected@2x.png */; };
+ 0EC2729514F1E14000C8FC3E /* bg.png in Resources */ = {isa = PBXBuildFile; fileRef = 0EC2729114F1E14000C8FC3E /* bg.png */; };
+ 0EC2729614F1E14000C8FC3E /* bg@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0EC2729214F1E14000C8FC3E /* bg@2x.png */; };
+ 0EC2729914F1E14D00C8FC3E /* FifthViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0EC2729814F1E14D00C8FC3E /* FifthViewController.m */; };
+ 0EEEE29F14E4C175002998DB /* JBTabBarButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 0EEEE29E14E4C175002998DB /* JBTabBarButton.m */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 0E25B69614E4B1D2004582F3 /* FirstViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FirstViewController.h; path = Classes/FirstViewController.h; sourceTree = "<group>"; };
+ 0E25B69714E4B1D2004582F3 /* FirstViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FirstViewController.m; path = Classes/FirstViewController.m; sourceTree = "<group>"; };
+ 0E25B69814E4B1D2004582F3 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Classes/AppDelegate.h; sourceTree = "<group>"; };
+ 0E25B69914E4B1D2004582F3 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = Classes/AppDelegate.m; sourceTree = "<group>"; };
+ 0E25B69A14E4B1D3004582F3 /* SecondViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SecondViewController.h; path = Classes/SecondViewController.h; sourceTree = "<group>"; };
+ 0E25B69B14E4B1D3004582F3 /* SecondViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SecondViewController.m; path = Classes/SecondViewController.m; sourceTree = "<group>"; };
+ 0E25B69C14E4B1D3004582F3 /* ThirdViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ThirdViewController.h; path = Classes/ThirdViewController.h; sourceTree = "<group>"; };
+ 0E25B69D14E4B1D4004582F3 /* ThirdViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ThirdViewController.m; path = Classes/ThirdViewController.m; sourceTree = "<group>"; };
+ 0E25B6A214E4B201004582F3 /* JBTabBarController-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "JBTabBarController-Info.plist"; path = "Classes/JBTabBarController-Info.plist"; sourceTree = SOURCE_ROOT; };
+ 0E25B6A314E4B201004582F3 /* JBTabBarController-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "JBTabBarController-Prefix.pch"; path = "Classes/JBTabBarController-Prefix.pch"; sourceTree = SOURCE_ROOT; };
+ 0E25B6A414E4B201004582F3 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Classes/main.m; sourceTree = SOURCE_ROOT; };
+ 0E25B6A914E4B216004582F3 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = Classes/en.lproj/InfoPlist.strings; sourceTree = SOURCE_ROOT; };
+ 0E7D3FDA14DB31CF00E2D3A6 /* JBTabBarControllerExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = JBTabBarControllerExample.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 0E7D3FDE14DB31CF00E2D3A6 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ 0E7D3FE014DB31CF00E2D3A6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ 0E7D3FE214DB31CF00E2D3A6 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+ 0E7D400E14DB323500E2D3A6 /* JBTabBar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JBTabBar.h; sourceTree = "<group>"; };
+ 0E7D400F14DB323500E2D3A6 /* JBTabBar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JBTabBar.m; sourceTree = "<group>"; };
+ 0E7D401814DB691C00E2D3A6 /* JBTabBarController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JBTabBarController.h; sourceTree = "<group>"; };
+ 0E7D401914DB691C00E2D3A6 /* JBTabBarController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JBTabBarController.m; sourceTree = "<group>"; };
+ 0E7D401B14DB743000E2D3A6 /* UITabBarItem+JBAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UITabBarItem+JBAdditions.h"; sourceTree = "<group>"; };
+ 0E7D401C14DB743000E2D3A6 /* UITabBarItem+JBAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UITabBarItem+JBAdditions.m"; sourceTree = "<group>"; };
+ 0EC2722C14F1CC7600C8FC3E /* At-selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "At-selected.png"; sourceTree = "<group>"; };
+ 0EC2722D14F1CC7600C8FC3E /* At-selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "At-selected@2x.png"; sourceTree = "<group>"; };
+ 0EC2722E14F1CC7600C8FC3E /* At-unselected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "At-unselected.png"; sourceTree = "<group>"; };
+ 0EC2722F14F1CC7600C8FC3E /* At-unselected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "At-unselected@2x.png"; sourceTree = "<group>"; };
+ 0EC2723014F1CC7600C8FC3E /* Brain-selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Brain-selected.png"; sourceTree = "<group>"; };
+ 0EC2723114F1CC7600C8FC3E /* Brain-selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Brain-selected@2x.png"; sourceTree = "<group>"; };
+ 0EC2723214F1CC7600C8FC3E /* Brain-unselected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Brain-unselected.png"; sourceTree = "<group>"; };
+ 0EC2723314F1CC7600C8FC3E /* Brain-unselected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Brain-unselected@2x.png"; sourceTree = "<group>"; };
+ 0EC2723414F1CC7600C8FC3E /* Elephant-selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Elephant-selected.png"; sourceTree = "<group>"; };
+ 0EC2723514F1CC7600C8FC3E /* Elephant-selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Elephant-selected@2x.png"; sourceTree = "<group>"; };
+ 0EC2723614F1CC7600C8FC3E /* Elephant-unselected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Elephant-unselected.png"; sourceTree = "<group>"; };
+ 0EC2723714F1CC7600C8FC3E /* Elephant-unselected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Elephant-unselected@2x.png"; sourceTree = "<group>"; };
+ 0EC2723814F1CC7600C8FC3E /* Fist-selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Fist-selected.png"; sourceTree = "<group>"; };
+ 0EC2723914F1CC7600C8FC3E /* Fist-selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Fist-selected@2x.png"; sourceTree = "<group>"; };
+ 0EC2723A14F1CC7600C8FC3E /* Fist-unselected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Fist-unselected.png"; sourceTree = "<group>"; };
+ 0EC2723B14F1CC7600C8FC3E /* Fist-unselected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Fist-unselected@2x.png"; sourceTree = "<group>"; };
+ 0EC2723C14F1CC7600C8FC3E /* Levitate-selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Levitate-selected.png"; sourceTree = "<group>"; };
+ 0EC2723D14F1CC7600C8FC3E /* Levitate-selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Levitate-selected@2x.png"; sourceTree = "<group>"; };
+ 0EC2723E14F1CC7600C8FC3E /* Levitate-unselected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Levitate-unselected.png"; sourceTree = "<group>"; };
+ 0EC2723F14F1CC7600C8FC3E /* Levitate-unselected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Levitate-unselected@2x.png"; sourceTree = "<group>"; };
+ 0EC2725814F1D46300C8FC3E /* FourthViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FourthViewController.h; path = Classes/FourthViewController.h; sourceTree = "<group>"; };
+ 0EC2725914F1D46300C8FC3E /* FourthViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FourthViewController.m; path = Classes/FourthViewController.m; sourceTree = "<group>"; };
+ 0EC2728F14F1E14000C8FC3E /* bg-selected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "bg-selected.png"; sourceTree = "<group>"; };
+ 0EC2729014F1E14000C8FC3E /* bg-selected@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "bg-selected@2x.png"; sourceTree = "<group>"; };
+ 0EC2729114F1E14000C8FC3E /* bg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bg.png; sourceTree = "<group>"; };
+ 0EC2729214F1E14000C8FC3E /* bg@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "bg@2x.png"; sourceTree = "<group>"; };
+ 0EC2729714F1E14D00C8FC3E /* FifthViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FifthViewController.h; path = Classes/FifthViewController.h; sourceTree = "<group>"; };
+ 0EC2729814F1E14D00C8FC3E /* FifthViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FifthViewController.m; path = Classes/FifthViewController.m; sourceTree = "<group>"; };
+ 0EEEE29D14E4C175002998DB /* JBTabBarButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JBTabBarButton.h; sourceTree = "<group>"; };
+ 0EEEE29E14E4C175002998DB /* JBTabBarButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JBTabBarButton.m; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 0E7D3FD714DB31CF00E2D3A6 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 0E7D3FDF14DB31CF00E2D3A6 /* UIKit.framework in Frameworks */,
+ 0E7D3FE114DB31CF00E2D3A6 /* Foundation.framework in Frameworks */,
+ 0E7D3FE314DB31CF00E2D3A6 /* CoreGraphics.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 0E25B6AB14E4B233004582F3 /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ 0EC2728E14F1E14000C8FC3E /* TabBar Images */,
+ 0EC2722B14F1CC7600C8FC3E /* TabBar Item Images */,
+ );
+ path = Resources;
+ sourceTree = "<group>";
+ };
+ 0E7D3FCF14DB31CE00E2D3A6 = {
+ isa = PBXGroup;
+ children = (
+ 0E7D3FE414DB31CF00E2D3A6 /* JBTabBarController */,
+ 0E7D400D14DB31F100E2D3A6 /* Classes */,
+ 0E25B6AB14E4B233004582F3 /* Resources */,
+ 0E7D3FDD14DB31CF00E2D3A6 /* Frameworks */,
+ 0E7D3FDB14DB31CF00E2D3A6 /* Products */,
+ );
+ sourceTree = "<group>";
+ };
+ 0E7D3FDB14DB31CF00E2D3A6 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 0E7D3FDA14DB31CF00E2D3A6 /* JBTabBarControllerExample.app */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 0E7D3FDD14DB31CF00E2D3A6 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 0E7D3FDE14DB31CF00E2D3A6 /* UIKit.framework */,
+ 0E7D3FE014DB31CF00E2D3A6 /* Foundation.framework */,
+ 0E7D3FE214DB31CF00E2D3A6 /* CoreGraphics.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
+ 0E7D3FE414DB31CF00E2D3A6 /* JBTabBarController */ = {
+ isa = PBXGroup;
+ children = (
+ 0EEEE29D14E4C175002998DB /* JBTabBarButton.h */,
+ 0EEEE29E14E4C175002998DB /* JBTabBarButton.m */,
+ 0E7D400E14DB323500E2D3A6 /* JBTabBar.h */,
+ 0E7D400F14DB323500E2D3A6 /* JBTabBar.m */,
+ 0E7D401814DB691C00E2D3A6 /* JBTabBarController.h */,
+ 0E7D401914DB691C00E2D3A6 /* JBTabBarController.m */,
+ 0E7D401B14DB743000E2D3A6 /* UITabBarItem+JBAdditions.h */,
+ 0E7D401C14DB743000E2D3A6 /* UITabBarItem+JBAdditions.m */,
+ );
+ path = JBTabBarController;
+ sourceTree = "<group>";
+ };
+ 0E7D3FE514DB31CF00E2D3A6 /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ 0E25B6A214E4B201004582F3 /* JBTabBarController-Info.plist */,
+ 0E25B6A314E4B201004582F3 /* JBTabBarController-Prefix.pch */,
+ 0E25B6A414E4B201004582F3 /* main.m */,
+ 0E25B6A814E4B216004582F3 /* InfoPlist.strings */,
+ );
+ name = "Supporting Files";
+ path = JBTabBarController;
+ sourceTree = "<group>";
+ };
+ 0E7D400D14DB31F100E2D3A6 /* Classes */ = {
+ isa = PBXGroup;
+ children = (
+ 0E25B69814E4B1D2004582F3 /* AppDelegate.h */,
+ 0E25B69914E4B1D2004582F3 /* AppDelegate.m */,
+ 0E25B69614E4B1D2004582F3 /* FirstViewController.h */,
+ 0E25B69714E4B1D2004582F3 /* FirstViewController.m */,
+ 0E25B69A14E4B1D3004582F3 /* SecondViewController.h */,
+ 0E25B69B14E4B1D3004582F3 /* SecondViewController.m */,
+ 0E25B69C14E4B1D3004582F3 /* ThirdViewController.h */,
+ 0E25B69D14E4B1D4004582F3 /* ThirdViewController.m */,
+ 0EC2725814F1D46300C8FC3E /* FourthViewController.h */,
+ 0EC2725914F1D46300C8FC3E /* FourthViewController.m */,
+ 0EC2729714F1E14D00C8FC3E /* FifthViewController.h */,
+ 0EC2729814F1E14D00C8FC3E /* FifthViewController.m */,
+ 0E7D3FE514DB31CF00E2D3A6 /* Supporting Files */,
+ );
+ name = Classes;
+ sourceTree = "<group>";
+ };
+ 0EC2722B14F1CC7600C8FC3E /* TabBar Item Images */ = {
+ isa = PBXGroup;
+ children = (
+ 0EC2722C14F1CC7600C8FC3E /* At-selected.png */,
+ 0EC2722D14F1CC7600C8FC3E /* At-selected@2x.png */,
+ 0EC2722E14F1CC7600C8FC3E /* At-unselected.png */,
+ 0EC2722F14F1CC7600C8FC3E /* At-unselected@2x.png */,
+ 0EC2723014F1CC7600C8FC3E /* Brain-selected.png */,
+ 0EC2723114F1CC7600C8FC3E /* Brain-selected@2x.png */,
+ 0EC2723214F1CC7600C8FC3E /* Brain-unselected.png */,
+ 0EC2723314F1CC7600C8FC3E /* Brain-unselected@2x.png */,
+ 0EC2723414F1CC7600C8FC3E /* Elephant-selected.png */,
+ 0EC2723514F1CC7600C8FC3E /* Elephant-selected@2x.png */,
+ 0EC2723614F1CC7600C8FC3E /* Elephant-unselected.png */,
+ 0EC2723714F1CC7600C8FC3E /* Elephant-unselected@2x.png */,
+ 0EC2723814F1CC7600C8FC3E /* Fist-selected.png */,
+ 0EC2723914F1CC7600C8FC3E /* Fist-selected@2x.png */,
+ 0EC2723A14F1CC7600C8FC3E /* Fist-unselected.png */,
+ 0EC2723B14F1CC7600C8FC3E /* Fist-unselected@2x.png */,
+ 0EC2723C14F1CC7600C8FC3E /* Levitate-selected.png */,
+ 0EC2723D14F1CC7600C8FC3E /* Levitate-selected@2x.png */,
+ 0EC2723E14F1CC7600C8FC3E /* Levitate-unselected.png */,
+ 0EC2723F14F1CC7600C8FC3E /* Levitate-unselected@2x.png */,
+ );
+ path = "TabBar Item Images";
+ sourceTree = "<group>";
+ };
+ 0EC2728E14F1E14000C8FC3E /* TabBar Images */ = {
+ isa = PBXGroup;
+ children = (
+ 0EC2728F14F1E14000C8FC3E /* bg-selected.png */,
+ 0EC2729014F1E14000C8FC3E /* bg-selected@2x.png */,
+ 0EC2729114F1E14000C8FC3E /* bg.png */,
+ 0EC2729214F1E14000C8FC3E /* bg@2x.png */,
+ );
+ path = "TabBar Images";
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 0E7D3FD914DB31CF00E2D3A6 /* JBTabBarControllerExample */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 0E7D400714DB31CF00E2D3A6 /* Build configuration list for PBXNativeTarget "JBTabBarControllerExample" */;
+ buildPhases = (
+ 0E7D3FD614DB31CF00E2D3A6 /* Sources */,
+ 0E7D3FD714DB31CF00E2D3A6 /* Frameworks */,
+ 0E7D3FD814DB31CF00E2D3A6 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = JBTabBarControllerExample;
+ productName = JBTabBarController;
+ productReference = 0E7D3FDA14DB31CF00E2D3A6 /* JBTabBarControllerExample.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 0E7D3FD114DB31CE00E2D3A6 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0420;
+ };
+ buildConfigurationList = 0E7D3FD414DB31CE00E2D3A6 /* Build configuration list for PBXProject "JBTabBarControllerExample" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ );
+ mainGroup = 0E7D3FCF14DB31CE00E2D3A6;
+ productRefGroup = 0E7D3FDB14DB31CF00E2D3A6 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 0E7D3FD914DB31CF00E2D3A6 /* JBTabBarControllerExample */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 0E7D3FD814DB31CF00E2D3A6 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 0E25B6A514E4B201004582F3 /* JBTabBarController-Info.plist in Resources */,
+ 0E25B6AA14E4B216004582F3 /* InfoPlist.strings in Resources */,
+ 0EC2724014F1CC7600C8FC3E /* At-selected.png in Resources */,
+ 0EC2724114F1CC7600C8FC3E /* At-selected@2x.png in Resources */,
+ 0EC2724214F1CC7600C8FC3E /* At-unselected.png in Resources */,
+ 0EC2724314F1CC7600C8FC3E /* At-unselected@2x.png in Resources */,
+ 0EC2724414F1CC7600C8FC3E /* Brain-selected.png in Resources */,
+ 0EC2724514F1CC7600C8FC3E /* Brain-selected@2x.png in Resources */,
+ 0EC2724614F1CC7600C8FC3E /* Brain-unselected.png in Resources */,
+ 0EC2724714F1CC7600C8FC3E /* Brain-unselected@2x.png in Resources */,
+ 0EC2724814F1CC7600C8FC3E /* Elephant-selected.png in Resources */,
+ 0EC2724914F1CC7600C8FC3E /* Elephant-selected@2x.png in Resources */,
+ 0EC2724A14F1CC7600C8FC3E /* Elephant-unselected.png in Resources */,
+ 0EC2724B14F1CC7600C8FC3E /* Elephant-unselected@2x.png in Resources */,
+ 0EC2724C14F1CC7600C8FC3E /* Fist-selected.png in Resources */,
+ 0EC2724D14F1CC7600C8FC3E /* Fist-selected@2x.png in Resources */,
+ 0EC2724E14F1CC7600C8FC3E /* Fist-unselected.png in Resources */,
+ 0EC2724F14F1CC7600C8FC3E /* Fist-unselected@2x.png in Resources */,
+ 0EC2725014F1CC7600C8FC3E /* Levitate-selected.png in Resources */,
+ 0EC2725114F1CC7600C8FC3E /* Levitate-selected@2x.png in Resources */,
+ 0EC2725214F1CC7600C8FC3E /* Levitate-unselected.png in Resources */,
+ 0EC2725314F1CC7600C8FC3E /* Levitate-unselected@2x.png in Resources */,
+ 0EC2729314F1E14000C8FC3E /* bg-selected.png in Resources */,
+ 0EC2729414F1E14000C8FC3E /* bg-selected@2x.png in Resources */,
+ 0EC2729514F1E14000C8FC3E /* bg.png in Resources */,
+ 0EC2729614F1E14000C8FC3E /* bg@2x.png in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 0E7D3FD614DB31CF00E2D3A6 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 0E7D401014DB323500E2D3A6 /* JBTabBar.m in Sources */,
+ 0E7D401A14DB691C00E2D3A6 /* JBTabBarController.m in Sources */,
+ 0E7D401D14DB743100E2D3A6 /* UITabBarItem+JBAdditions.m in Sources */,
+ 0E25B69E14E4B1D4004582F3 /* FirstViewController.m in Sources */,
+ 0E25B69F14E4B1D4004582F3 /* AppDelegate.m in Sources */,
+ 0E25B6A014E4B1D4004582F3 /* SecondViewController.m in Sources */,
+ 0E25B6A114E4B1D4004582F3 /* ThirdViewController.m in Sources */,
+ 0E25B6A614E4B201004582F3 /* main.m in Sources */,
+ 0EEEE29F14E4C175002998DB /* JBTabBarButton.m in Sources */,
+ 0EC2725A14F1D46300C8FC3E /* FourthViewController.m in Sources */,
+ 0EC2729914F1E14D00C8FC3E /* FifthViewController.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ 0E25B6A814E4B216004582F3 /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 0E25B6A914E4B216004582F3 /* en */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 0E7D400514DB31CF00E2D3A6 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ CLANG_ENABLE_OBJC_ARC = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 5.0;
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 0E7D400614DB31CF00E2D3A6 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ CLANG_ENABLE_OBJC_ARC = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 5.0;
+ OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ 0E7D400814DB31CF00E2D3A6 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_IDENTITY = "iPhone Developer: Jean-Seong Budelmann (GG22BJ2JU3)";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Jean-Seong Budelmann (GG22BJ2JU3)";
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "Classes/JBTabBarController-Prefix.pch";
+ INFOPLIST_FILE = "Classes/JBTabBarController-Info.plist";
+ IPHONEOS_DEPLOYMENT_TARGET = 4.0;
+ PRODUCT_NAME = JBTabBarControllerExample;
+ PROVISIONING_PROFILE = "F081904D-8886-4701-885A-56DC38085328";
+ "PROVISIONING_PROFILE[sdk=iphoneos*]" = "F081904D-8886-4701-885A-56DC38085328";
+ WRAPPER_EXTENSION = app;
+ };
+ name = Debug;
+ };
+ 0E7D400914DB31CF00E2D3A6 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_IDENTITY = "iPhone Developer: Jean-Seong Budelmann (GG22BJ2JU3)";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Jean-Seong Budelmann (GG22BJ2JU3)";
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "Classes/JBTabBarController-Prefix.pch";
+ INFOPLIST_FILE = "Classes/JBTabBarController-Info.plist";
+ IPHONEOS_DEPLOYMENT_TARGET = 4.0;
+ PRODUCT_NAME = JBTabBarControllerExample;
+ PROVISIONING_PROFILE = "F081904D-8886-4701-885A-56DC38085328";
+ "PROVISIONING_PROFILE[sdk=iphoneos*]" = "F081904D-8886-4701-885A-56DC38085328";
+ WRAPPER_EXTENSION = app;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 0E7D3FD414DB31CE00E2D3A6 /* Build configuration list for PBXProject "JBTabBarControllerExample" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 0E7D400514DB31CF00E2D3A6 /* Debug */,
+ 0E7D400614DB31CF00E2D3A6 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 0E7D400714DB31CF00E2D3A6 /* Build configuration list for PBXNativeTarget "JBTabBarControllerExample" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 0E7D400814DB31CF00E2D3A6 /* Debug */,
+ 0E7D400914DB31CF00E2D3A6 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 0E7D3FD114DB31CE00E2D3A6 /* Project object */;
+}
7 JBTabBarControllerExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+ version = "1.0">
+ <FileRef
+ location = "self:JBTabBarControllerExample.xcodeproj">
+ </FileRef>
+</Workspace>
BIN  ...proj/project.xcworkspace/xcuserdata/gbudelmann.xcuserdatad/UserInterfaceState.xcuserstate
Binary file not shown
10 ...deproj/project.xcworkspace/xcuserdata/gbudelmann.xcuserdatad/WorkspaceSettings.xcsettings
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>IDEWorkspaceUserSettings_HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges</key>
+ <true/>
+ <key>IDEWorkspaceUserSettings_SnapshotAutomaticallyBeforeSignificantChanges</key>
+ <true/>
+</dict>
+</plist>
133 ...llerExample.xcodeproj/xcuserdata/gbudelmann.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Bucket
+ type = "1"
+ version = "1.0">
+ <FileBreakpoints>
+ <FileBreakpoint
+ shouldBeEnabled = "No"
+ ignoreCount = "0"
+ continueAfterRunningActions = "No"
+ isPathRelative = "1"
+ filePath = "JBTabBarController/JBTabBar.m"
+ timestampString = "351397273.639387"
+ startingColumnNumber = "9223372036854775807"
+ endingColumnNumber = "9223372036854775807"
+ startingLineNumber = "149"
+ endingLineNumber = "149"
+ landmarkName = "-buttonWithTabBarItem:"
+ landmarkType = "5">
+ </FileBreakpoint>
+ <FileBreakpoint
+ shouldBeEnabled = "No"
+ ignoreCount = "0"
+ continueAfterRunningActions = "No"
+ isPathRelative = "1"
+ filePath = "JBTabBarController/JBTabBar.m"
+ timestampString = "351397273.639387"
+ startingColumnNumber = "9223372036854775807"
+ endingColumnNumber = "9223372036854775807"
+ startingLineNumber = "120"
+ endingLineNumber = "120"
+ landmarkName = "-otherTouchesAction:"
+ landmarkType = "5">
+ </FileBreakpoint>
+ <FileBreakpoint
+ shouldBeEnabled = "No"
+ ignoreCount = "0"
+ continueAfterRunningActions = "No"
+ isPathRelative = "1"
+ filePath = "JBTabBarController/JBTabBarController.m"
+ timestampString = "351397672.716922"
+ startingColumnNumber = "9223372036854775807"
+ endingColumnNumber = "9223372036854775807"
+ startingLineNumber = "38"
+ endingLineNumber = "38"
+ landmarkName = "-loadView"
+ landmarkType = "5">
+ </FileBreakpoint>
+ <FileBreakpoint
+ shouldBeEnabled = "No"
+ ignoreCount = "0"
+ continueAfterRunningActions = "No"
+ isPathRelative = "1"
+ filePath = "JBTabBarController/JBTabBarController.m"
+ timestampString = "351397672.716922"
+ startingColumnNumber = "9223372036854775807"
+ endingColumnNumber = "9223372036854775807"
+ startingLineNumber = "48"
+ endingLineNumber = "48"
+ landmarkName = "-loadView"
+ landmarkType = "5">
+ </FileBreakpoint>
+ <FileBreakpoint
+ shouldBeEnabled = "No"
+ ignoreCount = "0"
+ continueAfterRunningActions = "No"
+ isPathRelative = "1"
+ filePath = "JBTabBarController/JBTabBarButton.m"
+ timestampString = "351394771.305156"
+ startingColumnNumber = "9223372036854775807"
+ endingColumnNumber = "9223372036854775807"
+ startingLineNumber = "39"
+ endingLineNumber = "39"
+ landmarkName = "-layoutSubviews"
+ landmarkType = "5">
+ </FileBreakpoint>
+ <FileBreakpoint
+ shouldBeEnabled = "No"
+ ignoreCount = "0"
+ continueAfterRunningActions = "No"
+ isPathRelative = "1"
+ filePath = "JBTabBarController/JBTabBarButton.m"
+ timestampString = "351394771.305156"
+ startingColumnNumber = "9223372036854775807"
+ endingColumnNumber = "9223372036854775807"
+ startingLineNumber = "48"
+ endingLineNumber = "48"
+ landmarkName = "-layoutSubviews"
+ landmarkType = "5">
+ </FileBreakpoint>
+ <FileBreakpoint
+ shouldBeEnabled = "No"
+ ignoreCount = "0"
+ continueAfterRunningActions = "No"
+ isPathRelative = "1"
+ filePath = "JBTabBarController/JBTabBarButton.m"
+ timestampString = "351393971.340823"
+ startingColumnNumber = "9223372036854775807"
+ endingColumnNumber = "9223372036854775807"
+ startingLineNumber = "27"
+ endingLineNumber = "27"
+ landmarkName = "-layoutSubviews"
+ landmarkType = "5">
+ </FileBreakpoint>
+ <FileBreakpoint
+ shouldBeEnabled = "No"
+ ignoreCount = "0"
+ continueAfterRunningActions = "No"
+ isPathRelative = "1"
+ filePath = "JBTabBarController/JBTabBar.m"
+ timestampString = "351397072.146329"
+ startingColumnNumber = "9223372036854775807"
+ endingColumnNumber = "9223372036854775807"
+ startingLineNumber = "46"
+ endingLineNumber = "46"
+ landmarkName = "-setItems:"
+ landmarkType = "5">
+ </FileBreakpoint>
+ <FileBreakpoint
+ shouldBeEnabled = "No"
+ ignoreCount = "0"
+ continueAfterRunningActions = "No"
+ isPathRelative = "1"
+ filePath = "JBTabBarController/JBTabBar.m"
+ timestampString = "351397273.639387"
+ startingColumnNumber = "9223372036854775807"
+ endingColumnNumber = "9223372036854775807"
+ startingLineNumber = "86"
+ endingLineNumber = "86"
+ landmarkName = "-setSelectionIndicatorImage:"
+ landmarkType = "5">
+ </FileBreakpoint>
+ </FileBreakpoints>
+</Bucket>
84 ....xcodeproj/xcuserdata/gbudelmann.xcuserdatad/xcschemes/JBTabBarControllerExample.xcscheme
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "0E7D3FD914DB31CF00E2D3A6"
+ BuildableName = "JBTabBarControllerExample.app"
+ BlueprintName = "JBTabBarControllerExample"
+ ReferencedContainer = "container:JBTabBarControllerExample.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ buildConfiguration = "Debug">
+ <Testables>
+ </Testables>
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "0E7D3FD914DB31CF00E2D3A6"
+ BuildableName = "JBTabBarControllerExample.app"
+ BlueprintName = "JBTabBarControllerExample"
+ ReferencedContainer = "container:JBTabBarControllerExample.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ </TestAction>
+ <LaunchAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Debug"
+ debugDocumentVersioning = "YES"
+ allowLocationSimulation = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "0E7D3FD914DB31CF00E2D3A6"
+ BuildableName = "JBTabBarControllerExample.app"
+ BlueprintName = "JBTabBarControllerExample"
+ ReferencedContainer = "container:JBTabBarControllerExample.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Release"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "0E7D3FD914DB31CF00E2D3A6"
+ BuildableName = "JBTabBarControllerExample.app"
+ BlueprintName = "JBTabBarControllerExample"
+ ReferencedContainer = "container:JBTabBarControllerExample.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
27 ...lerExample.xcodeproj/xcuserdata/gbudelmann.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>SchemeUserState</key>
+ <dict>
+ <key>JBTabBarControllerExample.xcscheme</key>
+ <dict>
+ <key>orderHint</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <key>SuppressBuildableAutocreation</key>
+ <dict>
+ <key>0E7D3FD914DB31CF00E2D3A6</key>
+ <dict>
+ <key>primary</key>
+ <true/>
+ </dict>
+ <key>0E7D3FF414DB31CF00E2D3A6</key>
+ <dict>
+ <key>primary</key>
+ <true/>
+ </dict>
+ </dict>
+</dict>
+</plist>
7 README
@@ -0,0 +1,7 @@
+JBTabBarController aims to be a drop-in replacement of UITabBarController, but with the intention of letting developers easily customise its appearance. The JBTabBar uses images for each UI Element except for the labels on the TabBar items.
+
+In particular, the selected and unselected images for each TabBar item can be specified and are full colour images not clipping masks. UITabBarItem+JBAdditions.h adds an additional property to UITabBarItem which . I would recommend images of 30x30 pixels (60x60 pixels for Retina displays) for this purpose
+
+The included example attempts to emulate the standard UITabBar design provided by Apple. The layer styles used to create the
+
+You will need to import UITabBarItem+JBAdditions.h where ever you use the extra UITabBarItem property.
BIN  Resources/TabBar Images/bg-selected.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  Resources/TabBar Images/bg-selected@2x.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  Resources/TabBar Images/bg.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  Resources/TabBar Images/bg@2x.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  Resources/TabBar Item Images/At-selected.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  Resources/TabBar Item Images/At-selected@2x.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  Resources/TabBar Item Images/At-unselected.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  Resources/TabBar Item Images/At-unselected@2x.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  Resources/TabBar Item Images/Brain-selected.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  Resources/TabBar Item Images/Brain-selected@2x.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  Resources/TabBar Item Images/Brain-unselected.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  Resources/TabBar Item Images/Brain-unselected@2x.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  Resources/TabBar Item Images/Elephant-selected.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  Resources/TabBar Item Images/Elephant-selected@2x.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  Resources/TabBar Item Images/Elephant-unselected.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  Resources/TabBar Item Images/Elephant-unselected@2x.png
Diff not rendered
BIN  Resources/TabBar Item Images/Fist-selected.png
Diff not rendered
BIN  Resources/TabBar Item Images/Fist-selected@2x.png
Diff not rendered
BIN  Resources/TabBar Item Images/Fist-unselected.png
Diff not rendered
BIN  Resources/TabBar Item Images/Fist-unselected@2x.png
Diff not rendered
BIN  Resources/TabBar Item Images/Levitate-selected.png
Diff not rendered
BIN  Resources/TabBar Item Images/Levitate-selected@2x.png
Diff not rendered
BIN  Resources/TabBar Item Images/Levitate-unselected.png
Diff not rendered
BIN  Resources/TabBar Item Images/Levitate-unselected@2x.png
Diff not rendered

0 comments on commit a897280

Please sign in to comment.
Something went wrong with that request. Please try again.