首先谈一谈自定义控件:
1,最常见的就是button,也是最简单的,苹果已经封装好了,只需要设置它的type为custom,然后设置其background就可以了;
2,segemented control,可以在xib里面对应的segement中设置其p_w_picpath就可以,不过有点需要注意的是假设你所有图片的宽度可能为70,那么你segemented control的宽度必须稍微短点,66即可。我以前在实践的时候,按照其本身宽度来设置,中间相连部分就会很难看;
3,navigation bar自定义也是十分常见,我所用的方法是定义一个p_w_picpathview,然后insertSubview到第0层。不过用这种方法有点不好的是会把系统navigation bar本身的标题,按钮盖住。所以我们有的时候需要重新自定义标题,按钮,然后addsubview到bar上面,具体可以参考我下面给的demo;
4,search bar自定义,最开始的时候以为是不能定义,后来在qq音乐里看到很漂亮的search bar,开始研究。类似与导航栏,这次我们需要insertSubview到第1层,p_w_picpathview的宽度最好设为search bar默认的高度44。接下来我们还可以自定义它上面的按钮,我们打印出它的子视图,找到按钮的那一层,取出按钮,然后重新在定义。
上个图,按钮必须在对应方法里才能看到;




上个图,按钮必须在对应方法里才能看到;



5,还有一个常见的需要自定义的,tableViewCell。自定义cell的方法其实很多,我就主要讲我常用的方法,先添加一个xib文件,里面只有一个tableviewcell,这个xib文件对应的主类应该是你需要自定义的那个类,在cell里面自定义图片和label,设置对应的tag为1和2。在那个主类里面定义uitableviewcell,并关联到刚才的xib文件。下面是调用的方法


 




6,tabbarcontroller也是可以自定义的,我所讲的是自己实践过成功过的方法,重写一个tabbarcontroller类文件,主要是隐藏tababr。接下来是在app文件里面定义一个viewcontroller,把刚才tabbarcontroller的类文件insert到第0层就可以了。具体可以参考我以前的demo。 http://www.devdiv.com/thread-63143-1-1.html

源代码:


Classes src: 
  
   

        CustomTabBar.h类文件 
  
   

      // 
   
//  CustomTabBar.h    
//  CustomTabBar    
//    
//  Created by Peter Boctor on 1/2/11.    
//    
// Copyright (c) 2011 Peter Boctor    
//    
// Permission is hereby granted, free of charge, to any person obtaining a copy    
// of this software and associated documentation files (the "Software"), to deal    
// in the Software without restriction, including without limitation the rights    
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell    
// copies of the Software, and to permit persons to whom the Software is    
// furnished to do so, subject to the following conditions:    
//    
// The above copyright notice and this permission notice shall be included in    
// all copies or substantial portions of the Software.    
//    
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR    
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,    
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE    
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER    
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,    
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN    
// THE SOFTWARE    
//      

    @class CustomTabBar; 
   
@protocol CustomTabBarDelegate      

    - (UIImage*) p_w_picpathFor:(CustomTabBar*)tabBar atIndex:(NSUInteger)itemIndex; 
   
- (UIImage*) backgroundImage;    
- (UIImage*) selectedItemBackgroundImage;    
- (UIImage*) glowImage;    
- (UIImage*) selectedItemImage;    
- (UIImage*) tabBarArrowImage;      

    @optional 
   
- (void) touchUpInsideItemAtIndex:(NSUInteger)itemIndex;    
- (void) touchDownAtItemAtIndex:(NSUInteger)itemIndex;    
@end      
    
@interface CustomTabBar : UIView    
{    
  NSObject <CustomTabBarDelegate> *delegate;    
  NSMutableArray* buttons;    
}      

    @property (nonatomic, retain) NSMutableArray* buttons; 
  
   

    - (id) initWithItemCount:(NSUInteger)itemCount itemSize:(CGSize)itemSize tag:(NSInteger)objectTag delegate:(NSObject <CustomTabBarDelegate>*)customTabBarDelegate; 
  
   

    - (void) selectItemAtIndex:(NSInteger)index; 
   
- (void) glowItemAtIndex:(NSInteger)index;    
- (void) removeGlowAtIndex:(NSInteger)index;      

    @end 
   
   

      
  
   

    // 
   
//  CustomTabBar.m    
//  CustomTabBar    
//    
//  Created by Peter Boctor on 1/2/11.    
//    
// Copyright (c) 2011 Peter Boctor    
//    
// Permission is hereby granted, free of charge, to any person obtaining a copy    
// of this software and associated documentation files (the "Software"), to deal    
// in the Software without restriction, including without limitation the rights    
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell    
// copies of the Software, and to permit persons to whom the Software is    
// furnished to do so, subject to the following conditions:    
//    
// The above copyright notice and this permission notice shall be included in    
// all copies or substantial portions of the Software.    
//    
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR    
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,    
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE    
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER    
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,    
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN    
// THE SOFTWARE    
//      

    #import "CustomTabBar.h" 
  
   

    #define GLOW_IMAGE_TAG 2394858 
   
#define TAB_ARROW_IMAGE_TAG 2394859      

    @interface CustomTabBar (PrivateMethods) 
   
- (CGFloat) horizontalLocationFor:(NSUInteger)tabIndex;    
- (void) addTabBarArrowAtIndex:(NSUInteger)itemIndex;    
-(UIButton*) buttonAtIndex:(NSUInteger)itemIndex width:(CGFloat)width;    
-(UIImage*) tabBarImage:(UIImage*)startImage size:(CGSize)targetSize backgroundImage:(UIImage*)backgroundImage;    
-(UIImage*) blackFilledImageWithWhiteBackgroundUsing:(UIImage*)startImage;    
-(UIImage*) tabBarBackgroundImageWithSize:(CGSize)targetSize backgroundImage:(UIImage*)backgroundImage;    
@end      

    @implementation CustomTabBar 
   
@synthesize buttons;      

    - (id) initWithItemCount:(NSUInteger)itemCount itemSize:(CGSize)itemSize tag:(NSInteger)objectTag delegate:(NSObject <CustomTabBarDelegate>*)customTabBarDelegate 
   
{    
  if (self = [super init])    
  {    
    // The tag allows callers withe multiple controls to distinguish between them    
    self.tag = objectTag;    
       
    // Set the delegate    
    delegate = customTabBarDelegate;    
       
    // Add the background p_w_picpath    
    UIImage* backgroundImage = [delegate backgroundImage];    
    UIImageView* backgroundImageView = [[[UIImageView alloc] initWithImage:backgroundImage] autorelease];    
    backgroundImageView.frame = CGRectMake(0, 0, backgroundImage.size.width, backgroundImage.size.height);    
    [self addSubview:backgroundImageView];      

        // Adjust our width based on the number of items & the width of each item 
   
    self.frame = CGRectMake(0, 0, itemSize.width * itemCount, itemSize.height);      

        // Initalize the array we use to store our buttons 
   
    self.buttons = [[NSMutableArray alloc] initWithCapacity:itemCount];      

        // horizontalOffset tracks the proper x value as we add buttons as subviews 
   
    CGFloat horizontalOffset = 0;    
       
    // Iterate through each item    
    for (NSUInteger i = 0 ; i < itemCount ; i++)    
    {    
      // Create a button    
      UIButton* button = [self buttonAtIndex:i width:self.frame.size.width/itemCount];      

          // Register for touch events 
   
      [button addTarget:self action:@selector(touchDownAction:) forControlEvents:UIControlEventTouchDown];    
      [button addTarget:self action:@selector(touchUpInsideAction:) forControlEvents:UIControlEventTouchUpInside];    
      [button addTarget:self action:@selector(otherTouchesAction:) forControlEvents:UIControlEventTouchUpOutside];    
      [button addTarget:self action:@selector(otherTouchesAction:) forControlEvents:UIControlEventTouchDragOutside];    
      [button addTarget:self action:@selector(otherTouchesAction:) forControlEvents:UIControlEventTouchDragInside];    
         
      // Add the button to our buttons array    
      [buttons addObject:button];      

          // Set the button's x offset 
   
      button.frame = CGRectMake(horizontalOffset, 0.0, button.frame.size.width, button.frame.size.height);      

          // Add the button as our subview 
   
      [self addSubview:button];    
         
      // Advance the horizontal offset    
      horizontalOffset = horizontalOffset + itemSize.width;    
    }    
  }      

      return self; 
   
}      

    -(void) dimAllButtonsExcept:(UIButton*)selectedButton 
   
{    
  for (UIButton* button in buttons)    
  {    
    if (button == selectedButton)    
    {    
      button.selected = YES;    
      button.highlighted = button.selected ? NO : YES;      

          UIImageView* tabBarArrow = (UIImageView*)[self viewWithTag:TAB_ARROW_IMAGE_TAG]; 
   
      NSUInteger selectedIndex = [buttons indexOfObjectIdenticalTo:button];    
      if (tabBarArrow)    
      {    
        [UIView beginAnimations:nil context:nil];    
        [UIView setAnimationDuration:0.2];    
        CGRect frame = tabBarArrow.frame;    
        frame.origin.x = [self horizontalLocationFor:selectedIndex];    
        tabBarArrow.frame = frame;    
        [UIView commitAnimations];    
      }    
      else    
      {    
        [self addTabBarArrowAtIndex:selectedIndex];    
      }    
    }    
    else    
    {    
      button.selected = NO;    
      button.highlighted = NO;    
    }    
  }    
}      

    - (void)touchDownAction:(UIButton*)button 
   
{    
  [self dimAllButtonsExcept:button];    
     
  if ([delegate respondsToSelector:@selector(touchDownAtItemAtIndex:)])    
    [delegate touchDownAtItemAtIndex:[buttons indexOfObject:button]];    
}      

    - (void)touchUpInsideAction:(UIButton*)button 
   
{    
  [self dimAllButtonsExcept:button];      

      if ([delegate respondsToSelector:@selector(touchUpInsideItemAtIndex:)]) 
   
    [delegate touchUpInsideItemAtIndex:[buttons indexOfObject:button]];    
}      

    - (void)otherTouchesAction:(UIButton*)button 
   
{    
  [self dimAllButtonsExcept:button];    
}      

    - (void) selectItemAtIndex:(NSInteger)index 
   
{    
  // Get the right button to select    
  UIButton* button = [buttons objectAtIndex:index];    
     
  [self dimAllButtonsExcept:button];    
}      

    // Add a glow at the bottom of the specified item 
   
- (void) glowItemAtIndex:(NSInteger)index    
{    
  // Get the right button. We'll use to calculate where to put the glow    
  UIButton* button = [buttons objectAtIndex:index];    
     
  // Ask the delegate for the glow p_w_picpath    
  UIImage* glowImage = [delegate glowImage];    
     
  // Create the p_w_picpath view that will hold the glow p_w_picpath    
  UIImageView* glowImageView = [[[UIImageView alloc] initWithImage:glowImage] autorelease];    
     
  // Center the glow p_w_picpath at the center of the button horizontally and at the bottom of the button vertically    
  glowImageView.frame = CGRectMake(button.frame.size.width/2.0 - glowImage.size.width/2.0, button.frame.origin.y + button.frame.size.height - glowImage.size.height, glowImage.size.width, glowImage.size.height);      

      // Set the glow p_w_picpath view's tag so we can find it later when we want to remove the glow 
   
  glowImageView.tag = GLOW_IMAGE_TAG;    
     
  // Add the glow p_w_picpath view to the button    
  [button addSubview:glowImageView];    
}      

    // Remove the glow at the bottom of the specified item 
   
- (void) removeGlowAtIndex:(NSInteger)index    
{    
  // Find the right button    
  UIButton* button = [buttons objectAtIndex:index];    
  // Find the glow p_w_picpath view    
  UIImageView* glowImageView = (UIImageView*)[button viewWithTag:GLOW_IMAGE_TAG];    
  // Remove it from the button    
  [glowImageView removeFromSuperview];    
}      

    - (CGFloat) horizontalLocationFor:(NSUInteger)tabIndex 
   
{    
  UIImageView* tabBarArrow = (UIImageView*)[self viewWithTag:TAB_ARROW_IMAGE_TAG];    
     
  // A single tab item's width is the entire width of the tab bar divided by number of items    
  CGFloat tabItemWidth = self.frame.size.width / buttons.count;    
  // A half width is tabItemWidth divided by 2 minus half the width of the arrow    
  CGFloat halfTabItemWidth = (tabItemWidth / 2.0) - (tabBarArrow.frame.size.width / 2.0);    
     
  // The horizontal location is the index times the width plus a half width    
  return (tabIndex * tabItemWidth) + halfTabItemWidth;    
}      

    - (void) addTabBarArrowAtIndex:(NSUInteger)itemIndex 
   
{    
  UIImage* tabBarArrowImage = [delegate tabBarArrowImage];    
  UIImageView* tabBarArrow = [[[UIImageView alloc] initWithImage:tabBarArrowImage] autorelease];    
  tabBarArrow.tag = TAB_ARROW_IMAGE_TAG;    
  // To get the vertical location we go up by the height of arrow and then come back down 2 pixels so the arrow is slightly on top of the tab bar.    
  CGFloat verticalLocation = -tabBarArrowImage.size.height + 2;    
  tabBarArrow.frame = CGRectMake([self horizontalLocationFor:itemIndex], verticalLocation, tabBarArrowImage.size.width, tabBarArrowImage.size.height);      

      [self addSubview:tabBarArrow]; 
   
}      

    // Create a button at the provided index 
   
- (UIButton*) buttonAtIndex:(NSUInteger)itemIndex width:(CGFloat)width    
{    
  // Create a new button with the right dimensions    
  UIButton* button = [UIButton buttonWithType:UIButtonTypeCustom];    
  button.frame = CGRectMake(0.0, 0.0, width, self.frame.size.height);      

      // Ask the delegate for the button's p_w_picpath 
   
  UIImage* rawButtonImage = [delegate p_w_picpathFor:self atIndex:itemIndex];    
  // Create the normal state p_w_picpath by converting the p_w_picpath's background to gray    
  UIImage* buttonImage = [self tabBarImage:rawButtonImage size:button.frame.size backgroundImage:nil];    
  // And create the pressed state p_w_picpath by converting the p_w_picpath's background to the background p_w_picpath we get from the delegate    
  UIImage* buttonPressedImage = [self tabBarImage:rawButtonImage size:button.frame.size backgroundImage:[delegate selectedItemBackgroundImage]];      

      // Set the gray & blue p_w_picpaths as the button states 
   
  [button setImage:buttonImage forState:UIControlStateNormal];    
  [button setImage:buttonPressedImage forState:UIControlStateHighlighted];    
  [button setImage:buttonPressedImage forState:UIControlStateSelected];      

      // Ask the delegate for the highlighted/selected state p_w_picpath & set it as the selected background state 
   
  [button setBackgroundImage:[delegate selectedItemImage] forState:UIControlStateHighlighted];    
  [button setBackgroundImage:[delegate selectedItemImage] forState:UIControlStateSelected];    
     
  button.adjustsImageWhenHighlighted = NO;    
     
  return button;    
}      

    // Create a tab bar p_w_picpath 
   
-(UIImage*) tabBarImage:(UIImage*)startImage size:(CGSize)targetSize backgroundImage:(UIImage*)backgroundImageSource    
{    
  // The background is either the passed in background p_w_picpath (for the blue selected state) or gray (for the non-selected state)    
  UIImage* backgroundImage = [self tabBarBackgroundImageWithSize:startImage.size backgroundImage:backgroundImageSource];    
     
  // Convert the passed in p_w_picpath to a white backround p_w_picpath with a black fill    
  UIImage* bwImage = [self blackFilledImageWithWhiteBackgroundUsing:startImage];    
     
  // Create an p_w_picpath mask    
  CGImageRef p_w_picpathMask = CGImageMaskCreate(CGImageGetWidth(bwImage.CGImage),    
    CGImageGetHeight(bwImage.CGImage),    
    CGImageGetBitsPerComponent(bwImage.CGImage),    
    CGImageGetBitsPerPixel(bwImage.CGImage),    
    CGImageGetBytesPerRow(bwImage.CGImage),    
    CGImageGetDataProvider(bwImage.CGImage), NULL, YES);      

      // Using the mask create a new p_w_picpath 
   
  CGImageRef tabBarImageRef = CGImageCreateWithMask(backgroundImage.CGImage, p_w_picpathMask);      

      UIImage* tabBarImage = [UIImage p_w_picpathWithCGImage:tabBarImageRef scale:startImage.scale orientation:startImage.p_w_picpathOrientation]; 
  
   

      // Cleanup 
   
  CGImageRelease(p_w_picpathMask);    
  CGImageRelease(tabBarImageRef);    
     
  // Create a new context with the right size    
  UIGraphicsBeginImageContextWithOptions(targetSize, NO, 0.0);      

      // Draw the new tab bar p_w_picpath at the center 
   
  [tabBarImage drawInRect:CGRectMake((targetSize.width/2.0) - (startImage.size.width/2.0), (targetSize.height/2.0) - (startImage.size.height/2.0), startImage.size.width, startImage.size.height)];    
     
  // Generate a new p_w_picpath    
  UIImage* resultImage = UIGraphicsGetImageFromCurrentImageContext();    
  UIGraphicsEndImageContext();    
     
  return resultImage;    
}      

    // Convert the p_w_picpath's fill color to black and background to white 
   
-(UIImage*) blackFilledImageWithWhiteBackgroundUsing:(UIImage*)startImage    
{    
  // Create the proper sized rect    
  CGRect p_w_picpathRect = CGRectMake(0, 0, CGImageGetWidth(startImage.CGImage), CGImageGetHeight(startImage.CGImage));      

      // Create a new bitmap context 
   
  CGContextRef context = CGBitmapContextCreate(NULL, p_w_picpathRect.size.width, p_w_picpathRect.size.height, 8, 0, CGImageGetColorSpace(startImage.CGImage), kCGImageAlphaPremultipliedLast);      

      CGContextSetRGBFillColor(context, 1, 1, 1, 1); 
   
  CGContextFillRect(context, p_w_picpathRect);      

      // Use the passed in p_w_picpath as a clipping mask 
   
  CGContextClipToMask(context, p_w_picpathRect, startImage.CGImage);    
  // Set the fill color to black: R:0 G:0 B:0 alpha:1    
  CGContextSetRGBFillColor(context, 0, 0, 0, 1);    
  // Fill with black    
  CGContextFillRect(context, p_w_picpathRect);      

      // Generate a new p_w_picpath 
   
  CGImageRef newCGImage = CGBitmapContextCreateImage(context);    
  UIImage* newImage = [UIImage p_w_picpathWithCGImage:newCGImage scale:startImage.scale orientation:startImage.p_w_picpathOrientation];      

      // Cleanup 
   
  CGContextRelease(context);    
  CGImageRelease(newCGImage);    
     
  return newImage;    
}      

    -(UIImage*) tabBarBackgroundImageWithSize:(CGSize)targetSize backgroundImage:(UIImage*)backgroundImage 
   
{    
  // The background is either the passed in background p_w_picpath (for the blue selected state) or gray (for the non-selected state)    
  UIGraphicsBeginImageContextWithOptions(targetSize, NO, 0.0);    
  if (backgroundImage)    
  {    
    // Draw the background p_w_picpath centered    
    [backgroundImage drawInRect:CGRectMake((targetSize.width - CGImageGetWidth(backgroundImage.CGImage)) / 2, (targetSize.height - CGImageGetHeight(backgroundImage.CGImage)) / 2, CGImageGetWidth(backgroundImage.CGImage), CGImageGetHeight(backgroundImage.CGImage))];    
  }    
  else    
  {    
    [[UIColor lightGrayColor] set];    
    UIRectFill(CGRectMake(0, 0, targetSize.width, targetSize.height));    
  }      

      UIImage* finalBackgroundImage = UIGraphicsGetImageFromCurrentImageContext(); 
   
  UIGraphicsEndImageContext();    
     
  return finalBackgroundImage;    
}      

    - (void)dealloc 
   
{    
  [super dealloc];    
  [buttons release];    
}      
    
@end       

      
  
   

    CustomTabBarAppDelegate src: 
  
   

      
  
   

    // 
   
//  CustomTabBarAppDelegate.h    
//  CustomTabBar    
//    
//  Created by Peter Boctor on 1/2/11.    
//    
// Copyright (c) 2011 Peter Boctor    
//    
// Permission is hereby granted, free of charge, to any person obtaining a copy    
// of this software and associated documentation files (the "Software"), to deal    
// in the Software without restriction, including without limitation the rights    
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell    
// copies of the Software, and to permit persons to whom the Software is    
// furnished to do so, subject to the following conditions:    
//    
// The above copyright notice and this permission notice shall be included in    
// all copies or substantial portions of the Software.    
//    
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR    
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,    
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE    
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER    
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,    
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN    
// THE SOFTWARE    
//      

    #import <UIKit/UIKit.h> 
  
   

    @class CustomTabBarViewController; 
  
   

    @interface CustomTabBarAppDelegate : NSObject <UIApplicationDelegate> { 
   
    UIWindow *window;    
    CustomTabBarViewController *viewController;    
}      

    @property (nonatomic, retain) IBOutlet UIWindow *window; 
   
@property (nonatomic, retain) IBOutlet CustomTabBarViewController *viewController;      

    @end 
  
   

      
  
   

      
  
   

    // 
   
//  CustomTabBarAppDelegate.m    
//  CustomTabBar    
//    
//  Created by Peter Boctor on 1/2/11.    
//    
// Copyright (c) 2011 Peter Boctor    
//    
// Permission is hereby granted, free of charge, to any person obtaining a copy    
// of this software and associated documentation files (the "Software"), to deal    
// in the Software without restriction, including without limitation the rights    
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell    
// copies of the Software, and to permit persons to whom the Software is    
// furnished to do so, subject to the following conditions:    
//    
// The above copyright notice and this permission notice shall be included in    
// all copies or substantial portions of the Software.    
//    
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR    
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,    
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE    
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER    
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,    
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN    
// THE SOFTWARE    
//      

    #import "CustomTabBarAppDelegate.h" 
   
#import "CustomTabBarViewController.h"      

    @implementation CustomTabBarAppDelegate 
  
   

    @synthesize window; 
   
@synthesize viewController;      
    
#pragma mark -    
#pragma mark Application lifecycle      

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
   
       
    // Override point for customization after application launch.      

        // Add the view controller's view to the window and display. 
   
    [self.window addSubview:viewController.view];    
    [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, called instead of applicationWillTerminate: when the user quits.    
     */    
}      
    
- (void)applicationWillEnterForeground:(UIApplication *)application {    
    /*    
     Called as part of  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.    
     See also applicationDidEnterBackground:.    
     */    
}      
    
#pragma mark -    
#pragma mark Memory management      

    - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application { 
   
    /*    
     Free up as much memory as possible by purging cached data objects that can be recreated (or reloaded from disk) later.    
     */    
}      
    
- (void)dealloc {    
    [viewController release];    
    [window release];    
    [super dealloc];    
}      
    
@end       

      
  
   

    CustomTabBarViewController  src 
  
   

      
  
   

    // 
   
//  CustomTabBarViewController.h    
//  CustomTabBar    
//    
//  Created by Peter Boctor on 1/2/11.    
//    
// Copyright (c) 2011 Peter Boctor    
//    
// Permission is hereby granted, free of charge, to any person obtaining a copy    
// of this software and associated documentation files (the "Software"), to deal    
// in the Software without restriction, including without limitation the rights    
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell    
// copies of the Software, and to permit persons to whom the Software is    
// furnished to do so, subject to the following conditions:    
//    
// The above copyright notice and this permission notice shall be included in    
// all copies or substantial portions of the Software.    
//    
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR    
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,    
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE    
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER    
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,    
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN    
// THE SOFTWARE    
//      

    #import "CustomTabBar.h" 
  
   

    @interface CustomTabBarViewController : UIViewController <CustomTabBarDelegate> 
   
{    
  CustomTabBar* tabBar;    
}      

    @property (nonatomic, retain) CustomTabBar* tabBar; 
  
   

    @end 
  
   

      
  
   

      
  
   

      
  
   

    // 
   
//  CustomTabBarViewController.m    
//  CustomTabBar    
//    
//  Created by Peter Boctor on 1/2/11.    
//    
// Copyright (c) 2011 Peter Boctor    
//    
// Permission is hereby granted, free of charge, to any person obtaining a copy    
// of this software and associated documentation files (the "Software"), to deal    
// in the Software without restriction, including without limitation the rights    
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell    
// copies of the Software, and to permit persons to whom the Software is    
// furnished to do so, subject to the following conditions:    
//    
// The above copyright notice and this permission notice shall be included in    
// all copies or substantial portions of the Software.    
//    
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR    
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,    
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE    
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER    
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,    
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN    
// THE SOFTWARE    
//      

    #import "CustomTabBarViewController.h" 
  
   

    #define SELECTED_VIEW_CONTROLLER_TAG 98456345 
  
   

    static NSArray* tabBarItems = nil; 
  
   

    @implementation CustomTabBarViewController 
   
@synthesize tabBar;      

    - (void) awakeFromNib 
   
{    
  // Set up some fake view controllers each with a different background color so we can visually see the controllers getting swapped around    
  UIViewController *detailController1 = [[[UIViewController alloc] init] autorelease];    
  detailController1.view.backgroundColor = [UIColor redColor];      

      UIViewController *detailController2 = [[[UIViewController alloc] init] autorelease]; 
   
  detailController2.view.backgroundColor = [UIColor greenColor];      

      UIViewController *detailController3 = [[[UIViewController alloc] init] autorelease]; 
   
  detailController3.view.backgroundColor = [UIColor blueColor];      

      UIViewController *detailController4 = [[[UIViewController alloc] init] autorelease]; 
   
  detailController4.view.backgroundColor = [UIColor cyanColor];      

      UIViewController *detailController5 = [[[UIViewController alloc] init] autorelease]; 
   
  detailController5.view.backgroundColor = [UIColor purpleColor];      

      tabBarItems = [[NSArray arrayWithObjects: 
   
              [NSDictionary dictionaryWithObjectsAndKeys:@"chat.png", @"p_w_picpath", detailController1, @"viewController", nil],    
              [NSDictionary dictionaryWithObjectsAndKeys:@"compose-at.png", @"p_w_picpath", detailController2, @"viewController", nil],    
              [NSDictionary dictionaryWithObjectsAndKeys:@"messages.png", @"p_w_picpath", detailController3, @"viewController", nil],    
              [NSDictionary dictionaryWithObjectsAndKeys:@"magnifying-glass.png", @"p_w_picpath", detailController4, @"viewController", nil],    
              [NSDictionary dictionaryWithObjectsAndKeys:@"more.png", @"p_w_picpath", detailController5, @"viewController", nil], nil] retain];    
}      

    - (void)viewDidLoad 
   
{    
  [super viewDidLoad];      

      // Use the TabBarGradient p_w_picpath to figure out the tab bar's height (22x2=44) 
   
  UIImage* tabBarGradient = [UIImage p_w_picpathNamed:@"TabBarGradient.png"];    
     
  // Create a custom tab bar passing in the number of items, the size of each item and setting ourself as the delegate    
  self.tabBar = [[[CustomTabBar alloc] initWithItemCount:tabBarItems.count itemSize:CGSizeMake(self.view.frame.size.width/tabBarItems.count, tabBarGradient.size.height*2) tag:0 delegate:self] autorelease];    
     
  // Place the tab bar at the bottom of our view    
  tabBar.frame = CGRectMake(0,self.view.frame.size.height-(tabBarGradient.size.height*2),self.view.frame.size.width, tabBarGradient.size.height*2);    
  [self.view addSubview:tabBar];    
     
  // Select the first tab    
  [tabBar selectItemAtIndex:0];    
  [self touchDownAtItemAtIndex:0];    
}      

    #pragma mark - 
   
#pragma mark CustomTabBarDelegate      

    - (UIImage*) p_w_picpathFor:(CustomTabBar*)tabBar atIndex:(NSUInteger)itemIndex 
   
{    
  // Get the right data    
  NSDictionary* data = [tabBarItems objectAtIndex:itemIndex];    
  // Return the p_w_picpath for this tab bar item    
  return [UIImage p_w_picpathNamed:[data objectForKey:@"p_w_picpath"]];    
}      

    - (UIImage*) backgroundImage 
   
{    
  // The tab bar's width is the same as our width    
  CGFloat width = self.view.frame.size.width;    
  // Get the p_w_picpath that will form the top of the background    
  UIImage* topImage = [UIImage p_w_picpathNamed:@"TabBarGradient.png"];    
     
  // Create a new p_w_picpath context    
  UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, topImage.size.height*2), NO, 0.0);    
     
  // Create a stretchable p_w_picpath for the top of the background and draw it    
  UIImage* stretchedTopImage = [topImage stretchableImageWithLeftCapWidth:0 topCapHeight:0];    
  [stretchedTopImage drawInRect:CGRectMake(0, 0, width, topImage.size.height)];    
     
  // Draw a solid black color for the bottom of the background    
  [[UIColor blackColor] set];    
  CGContextFillRect(UIGraphicsGetCurrentContext(), CGRectMake(0, topImage.size.height, width, topImage.size.height));    
     
  // Generate a new p_w_picpath    
  UIImage* resultImage = UIGraphicsGetImageFromCurrentImageContext();    
  UIGraphicsEndImageContext();      

      return resultImage; 
   
}      

    // This is the blue background shown for selected tab bar items 
   
- (UIImage*) selectedItemBackgroundImage    
{    
  return [UIImage p_w_picpathNamed:@"TabBarItemSelectedBackground.png"];    
}      

    // This is the glow p_w_picpath shown at the bottom of a tab bar to indicate there are new items 
   
- (UIImage*) glowImage    
{    
  UIImage* tabBarGlow = [UIImage p_w_picpathNamed:@"TabBarGlow.png"];    
     
  // Create a new p_w_picpath using the TabBarGlow p_w_picpath but offset 4 pixels down    
  UIGraphicsBeginImageContextWithOptions(CGSizeMake(tabBarGlow.size.width, tabBarGlow.size.height-4.0), NO, 0.0);      

      // Draw the p_w_picpath 
   
  [tabBarGlow drawAtPoint:CGPointZero];      

      // Generate a new p_w_picpath 
   
  UIImage* resultImage = UIGraphicsGetImageFromCurrentImageContext();    
  UIGraphicsEndImageContext();      

      return resultImage; 
   
}      

    // This is the embossed-like p_w_picpath shown around a selected tab bar item 
   
- (UIImage*) selectedItemImage    
{    
  // Use the TabBarGradient p_w_picpath to figure out the tab bar's height (22x2=44)    
  UIImage* tabBarGradient = [UIImage p_w_picpathNamed:@"TabBarGradient.png"];    
  CGSize tabBarItemSize = CGSizeMake(self.view.frame.size.width/tabBarItems.count, tabBarGradient.size.height*2);    
  UIGraphicsBeginImageContextWithOptions(tabBarItemSize, NO, 0.0);      

      // Create a stretchable p_w_picpath using the TabBarSelection p_w_picpath but offset 4 pixels down 
   
  [[[UIImage p_w_picpathNamed:@"TabBarSelection.png"] stretchableImageWithLeftCapWidth:4.0 topCapHeight:0] drawInRect:CGRectMake(0, 4.0, tabBarItemSize.width, tabBarItemSize.height-4.0)];       

      // Generate a new p_w_picpath 
   
  UIImage* selectedItemImage = UIGraphicsGetImageFromCurrentImageContext();    
  UIGraphicsEndImageContext();    
     
  return selectedItemImage;    
}      

    - (UIImage*) tabBarArrowImage 
   
{    
  return [UIImage p_w_picpathNamed:@"TabBarNipple.png"];    
}      

    - (void) touchDownAtItemAtIndex:(NSUInteger)itemIndex 
   
{    
  // Remove the current view controller's view    
  UIView* currentView = [self.view viewWithTag:SELECTED_VIEW_CONTROLLER_TAG];    
  [currentView removeFromSuperview];    
     
  // Get the right view controller    
  NSDictionary* data = [tabBarItems objectAtIndex:itemIndex];    
  UIViewController* viewController = [data objectForKey:@"viewController"];      

      // Use the TabBarGradient p_w_picpath to figure out the tab bar's height (22x2=44) 
   
  UIImage* tabBarGradient = [UIImage p_w_picpathNamed:@"TabBarGradient.png"];      

      // Set the view controller's frame to account for the tab bar 
   
  viewController.view.frame = CGRectMake(0,0,self.view.frame.size.width, self.view.frame.size.height-(tabBarGradient.size.height*2));      

      // Se the tag so we can find it later 
   
  viewController.view.tag = SELECTED_VIEW_CONTROLLER_TAG;    
     
  // Add the new view controller's view    
  [self.view insertSubview:viewController.view belowSubview:tabBar];    
     
  // In 1 second glow the selected tab    
  [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(addGlowTimerFireMethod:) userInfo:[NSNumber numberWithInteger:itemIndex] repeats:NO];    
     
}      

    - (void)addGlowTimerFireMethod:(NSTimer*)theTimer 
   
{    
  // Remove the glow from all tab bar items    
  for (NSUInteger i = 0 ; i < tabBarItems.count ; i++)    
  {    
    [tabBar removeGlowAtIndex:i];    
  }    
     
  // Then add it to this tab bar item    
  [tabBar glowItemAtIndex:[[theTimer userInfo] integerValue]];    
}      

    - (void)dealloc 
   
{    
  [super dealloc];    
  [tabBar release];    
}      

    @end 
   
   

      
  
   

    main src: 
  
   

      
  
   

    // 
   
//  main.m    
//  CustomTabBar    
//    
//  Created by Peter Boctor on 1/2/11.    
//    
// Copyright (c) 2011 Peter Boctor    
//    
// Permission is hereby granted, free of charge, to any person obtaining a copy    
// of this software and associated documentation files (the "Software"), to deal    
// in the Software without restriction, including without limitation the rights    
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell    
// copies of the Software, and to permit persons to whom the Software is    
// furnished to do so, subject to the following conditions:    
//    
// The above copyright notice and this permission notice shall be included in    
// all copies or substantial portions of the Software.    
//    
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR    
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,    
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE    
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER    
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,    
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN    
// THE SOFTWARE    
//      

    #import <UIKit/UIKit.h> 
  
   

    int main(int argc, char *argv[]) { 
   
       
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];    
    int retVal = UIApplicationMain(argc, argv, nil, nil);    
    [pool release];    
    return retVal;    
}       

      
  
   

    mainWindow.xlib 
  
   

      
  
   

    <?xml version="1.0" encoding="UTF-8"?> 
   
<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="7.10">    
 <data>    
  <int key="IBDocument.SystemTarget">1024</int>    
  <string key="IBDocument.SystemVersion">10D571</string>    
  <string key="IBDocument.InterfaceBuilderVersion">786</string>    
  <string key="IBDocument.AppKitVersion">1038.29</string>    
  <string key="IBDocument.HIToolboxVersion">460.00</string>    
  <object class="NSMutableDictionary" key="IBDocument.PluginVersions">    
   <string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>    
   <string key="NS.object.0">112</string>    
  </object>    
  <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">    
   <bool key="EncodedWithXMLCoder">YES</bool>    
   <integer value="10"/>    
  </object>    
  <object class="NSArray" key="IBDocument.PluginDependencies">    
   <bool key="EncodedWithXMLCoder">YES</bool>    
   <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>    
  </object>    
  <object class="NSMutableDictionary" key="IBDocument.Metadata">    
   <bool key="EncodedWithXMLCoder">YES</bool>    
   <object class="NSArray" key="dict.sortedKeys" id="0">    
    <bool key="EncodedWithXMLCoder">YES</bool>    
   </object>    
   <object class="NSMutableArray" key="dict.values">    
    <bool key="EncodedWithXMLCoder">YES</bool>    
   </object>    
  </object>    
  <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">    
   <bool key="EncodedWithXMLCoder">YES</bool>    
   <object class="IBProxyObject" id="841351856">    
    <string key="IBProxiedObjectIdentifier">IBFilesOwner</string>    
    <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>    
   </object>    
   <object class="IBProxyObject" id="427554174">    
    <string key="IBProxiedObjectIdentifier">IBFirstResponder</string>    
    <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>    
   </object>    
   <object class="IBUICustomObject" id="664661524">    
    <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>    
   </object>    
   <object class="IBUIViewController" id="943309135">    
    <string key="IBUINibName">CustomTabBarViewController</string>    
    <object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/>    
    <object class="IBUISimulatedOrientationMetrics" key="IBUISimulatedOrientationMetrics">    
     <int key="interfaceOrientation">1</int>    
    </object>    
    <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>    
    <bool key="IBUIHorizontal">NO</bool>    
   </object>    
   <object class="IBUIWindow" id="117978783">    
    <nil key="NSNextResponder"/>    
    <int key="NSvFlags">292</int>    
    <string key="NSFrameSize">{320, 480}</string>    
    <object class="NSColor" key="IBUIBackgroundColor">    
     <int key="NSColorSpace">1</int>    
     <bytes key="NSRGB">MSAxIDEAA</bytes>    
    </object>    
    <bool key="IBUIOpaque">NO</bool>    
    <bool key="IBUIClearsContextBeforeDrawing">NO</bool>    
    <object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/>    
    <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>    
    <bool key="IBUIResizesToFullScreen">YES</bool>    
   </object>    
  </object>    
  <object class="IBObjectContainer" key="IBDocument.Objects">    
   <object class="NSMutableArray" key="connectionRecords">    
    <bool key="EncodedWithXMLCoder">YES</bool>    
    <object class="IBConnectionRecord">    
     <object class="IBCocoaTouchOutletConnection" key="connection">    
      <string key="label">delegate</string>    
      <reference key="source" ref="841351856"/>    
      <reference key="destination" ref="664661524"/>    
     </object>    
     <int key="connectionID">4</int>    
    </object>    
    <object class="IBConnectionRecord">    
     <object class="IBCocoaTouchOutletConnection" key="connection">    
      <string key="label">viewController</string>    
      <reference key="source" ref="664661524"/>    
      <reference key="destination" ref="943309135"/>    
     </object>    
     <int key="connectionID">11</int>    
    </object>    
    <object class="IBConnectionRecord">    
     <object class="IBCocoaTouchOutletConnection" key="connection">    
      <string key="label">window</string>    
      <reference key="source" ref="664661524"/>    
      <reference key="destination" ref="117978783"/>    
     </object>    
     <int key="connectionID">14</int>    
    </object>    
   </object>    
   <object class="IBMutableOrderedSet" key="objectRecords">    
    <object class="NSArray" key="orderedObjects">    
     <bool key="EncodedWithXMLCoder">YES</bool>    
     <object class="IBObjectRecord">    
      <int key="objectID">0</int>    
      <reference key="object" ref="0"/>    
      <reference key="children" ref="1000"/>    
      <nil key="parent"/>    
     </object>    
     <object class="IBObjectRecord">    
      <int key="objectID">-1</int>    
      <reference key="object" ref="841351856"/>    
      <reference key="parent" ref="0"/>    
      <string key="objectName">File's Owner</string>    
     </object>    
     <object class="IBObjectRecord">    
      <int key="objectID">3</int>    
      <reference key="object" ref="664661524"/>    
      <reference key="parent" ref="0"/>    
      <string key="objectName">CustomTabBar App Delegate</string>    
     </object>    
     <object class="IBObjectRecord">    
      <int key="objectID">-2</int>    
      <reference key="object" ref="427554174"/>    
      <reference key="parent" ref="0"/>    
     </object>    
     <object class="IBObjectRecord">    
      <int key="objectID">10</int>    
      <reference key="object" ref="943309135"/>    
      <reference key="parent" ref="0"/>    
     </object>    
     <object class="IBObjectRecord">    
      <int key="objectID">12</int>    
      <reference key="object" ref="117978783"/>    
      <reference key="parent" ref="0"/>    
     </object>    
    </object>    
   </object>    
   <object class="NSMutableDictionary" key="flattenedProperties">    
    <bool key="EncodedWithXMLCoder">YES</bool>    
    <object class="NSArray" key="dict.sortedKeys">    
     <bool key="EncodedWithXMLCoder">YES</bool>    
     <string>-1.CustomClassName</string>    
     <string>-2.CustomClassName</string>    
     <string>10.CustomClassName</string>    
     <string>10.IBEditorWindowLastContentRect</string>    
     <string>10.IBPluginDependency</string>    
     <string>12.IBEditorWindowLastContentRect</string>    
     <string>12.IBPluginDependency</string>    
     <string>3.CustomClassName</string>    
     <string>3.IBPluginDependency</string>    
    </object>    
    <object class="NSMutableArray" key="dict.values">    
     <bool key="EncodedWithXMLCoder">YES</bool>    
     <string>UIApplication</string>    
     <string>UIResponder</string>    
     <string>CustomTabBarViewController</string>    
     <string>{{234, 376}, {320, 480}}</string>    
     <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>    
     <string>{{525, 346}, {320, 480}}</string>    
     <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>    
     <string>CustomTabBarAppDelegate</string>    
     <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>    
    </object>    
   </object>    
   <object class="NSMutableDictionary" key="unlocalizedProperties">    
    <bool key="EncodedWithXMLCoder">YES</bool>    
    <reference key="dict.sortedKeys" ref="0"/>    
    <object class="NSMutableArray" key="dict.values">    
     <bool key="EncodedWithXMLCoder">YES</bool>    
    </object>    
   </object>    
   <nil key="activeLocalization"/>    
   <object class="NSMutableDictionary" key="localizations">    
    <bool key="EncodedWithXMLCoder">YES</bool>    
    <reference key="dict.sortedKeys" ref="0"/>    
    <object class="NSMutableArray" key="dict.values">    
     <bool key="EncodedWithXMLCoder">YES</bool>    
    </object>    
   </object>    
   <nil key="sourceID"/>    
   <int key="maxID">15</int>    
  </object>    
  <object class="IBClassDescriber" key="IBDocument.Classes">    
   <object class="NSMutableArray" key="referencedPartialClassDescriptions">    
    <bool key="EncodedWithXMLCoder">YES</bool>    
    <object class="IBPartialClassDescription">    
     <string key="className">UIWindow</string>    
     <string key="superclassName">UIView</string>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier">    
      <string key="majorKey">IBUserSource</string>    
      <string key="minorKey"/>    
     </object>    
    </object>    
    <object class="IBPartialClassDescription">    
     <string key="className">CustomTabBarAppDelegate</string>    
     <string key="superclassName">NSObject</string>    
     <object class="NSMutableDictionary" key="outlets">    
      <bool key="EncodedWithXMLCoder">YES</bool>    
      <object class="NSArray" key="dict.sortedKeys">    
       <bool key="EncodedWithXMLCoder">YES</bool>    
       <string>viewController</string>    
       <string>window</string>    
      </object>    
      <object class="NSMutableArray" key="dict.values">    
       <bool key="EncodedWithXMLCoder">YES</bool>    
       <string>CustomTabBarViewController</string>    
       <string>UIWindow</string>    
      </object>    
     </object>    
     <object class="NSMutableDictionary" key="toOneOutletInfosByName">    
      <bool key="EncodedWithXMLCoder">YES</bool>    
      <object class="NSArray" key="dict.sortedKeys">    
       <bool key="EncodedWithXMLCoder">YES</bool>    
       <string>viewController</string>    
       <string>window</string>    
      </object>    
      <object class="NSMutableArray" key="dict.values">    
       <bool key="EncodedWithXMLCoder">YES</bool>    
       <object class="IBToOneOutletInfo">    
        <string key="name">viewController</string>    
        <string key="candidateClassName">CustomTabBarViewController</string>    
       </object>    
       <object class="IBToOneOutletInfo">    
        <string key="name">window</string>    
        <string key="candidateClassName">UIWindow</string>    
       </object>    
      </object>    
     </object>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier">    
      <string key="majorKey">IBProjectSource</string>    
      <string key="minorKey">Classes/CustomTabBarAppDelegate.h</string>    
     </object>    
    </object>    
    <object class="IBPartialClassDescription">    
     <string key="className">CustomTabBarAppDelegate</string>    
     <string key="superclassName">NSObject</string>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier">    
      <string key="majorKey">IBUserSource</string>    
      <string key="minorKey"/>    
     </object>    
    </object>    
    <object class="IBPartialClassDescription">    
     <string key="className">CustomTabBarViewController</string>    
     <string key="superclassName">UIViewController</string>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier">    
      <string key="majorKey">IBProjectSource</string>    
      <string key="minorKey">Classes/CustomTabBarViewController.h</string>    
     </object>    
    </object>    
   </object>    
   <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">    
    <bool key="EncodedWithXMLCoder">YES</bool>    
    <object class="IBPartialClassDescription">    
     <string key="className">NSObject</string>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier">    
      <string key="majorKey">IBFrameworkSource</string>    
      <string key="minorKey">Foundation.framework/Headers/NSError.h</string>    
     </object>    
    </object>    
    <object class="IBPartialClassDescription">    
     <string key="className">NSObject</string>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier">    
      <string key="majorKey">IBFrameworkSource</string>    
      <string key="minorKey">Foundation.framework/Headers/NSFileManager.h</string>    
     </object>    
    </object>    
    <object class="IBPartialClassDescription">    
     <string key="className">NSObject</string>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier">    
      <string key="majorKey">IBFrameworkSource</string>    
      <string key="minorKey">Foundation.framework/Headers/NSKeyValueCoding.h</string>    
     </object>    
    </object>    
    <object class="IBPartialClassDescription">    
     <string key="className">NSObject</string>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier">    
      <string key="majorKey">IBFrameworkSource</string>    
      <string key="minorKey">Foundation.framework/Headers/NSKeyValueObserving.h</string>    
     </object>    
    </object>    
    <object class="IBPartialClassDescription">    
     <string key="className">NSObject</string>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier">    
      <string key="majorKey">IBFrameworkSource</string>    
      <string key="minorKey">Foundation.framework/Headers/NSKeyedArchiver.h</string>    
     </object>    
    </object>    
    <object class="IBPartialClassDescription">    
     <string key="className">NSObject</string>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier">    
      <string key="majorKey">IBFrameworkSource</string>    
      <string key="minorKey">Foundation.framework/Headers/NSObject.h</string>    
     </object>    
    </object>    
    <object class="IBPartialClassDescription">    
     <string key="className">NSObject</string>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier">    
      <string key="majorKey">IBFrameworkSource</string>    
      <string key="minorKey">Foundation.framework/Headers/NSRunLoop.h</string>    
     </object>    
    </object>    
    <object class="IBPartialClassDescription">    
     <string key="className">NSObject</string>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier">    
      <string key="majorKey">IBFrameworkSource</string>    
      <string key="minorKey">Foundation.framework/Headers/NSThread.h</string>    
     </object>    
    </object>    
    <object class="IBPartialClassDescription">    
     <string key="className">NSObject</string>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier">    
      <string key="majorKey">IBFrameworkSource</string>    
      <string key="minorKey">Foundation.framework/Headers/NSURL.h</string>    
     </object>    
    </object>    
    <object class="IBPartialClassDescription">    
     <string key="className">NSObject</string>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier">    
      <string key="majorKey">IBFrameworkSource</string>    
      <string key="minorKey">Foundation.framework/Headers/NSURLConnection.h</string>    
     </object>    
    </object>    
    <object class="IBPartialClassDescription">    
     <string key="className">NSObject</string>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier">    
      <string key="majorKey">IBFrameworkSource</string>    
      <string key="minorKey">UIKit.framework/Headers/UIAccessibility.h</string>    
     </object>    
    </object>    
    <object class="IBPartialClassDescription">    
     <string key="className">NSObject</string>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier">    
      <string key="majorKey">IBFrameworkSource</string>    
      <string key="minorKey">UIKit.framework/Headers/UINibLoading.h</string>    
     </object>    
    </object>    
    <object class="IBPartialClassDescription">    
     <string key="className">NSObject</string>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier" id="356479594">    
      <string key="majorKey">IBFrameworkSource</string>    
      <string key="minorKey">UIKit.framework/Headers/UIResponder.h</string>    
     </object>    
    </object>    
    <object class="IBPartialClassDescription">    
     <string key="className">UIApplication</string>    
     <string key="superclassName">UIResponder</string>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier">    
      <string key="majorKey">IBFrameworkSource</string>    
      <string key="minorKey">UIKit.framework/Headers/UIApplication.h</string>    
     </object>    
    </object>    
    <object class="IBPartialClassDescription">    
     <string key="className">UIResponder</string>    
     <string key="superclassName">NSObject</string>    
     <reference key="sourceIdentifier" ref="356479594"/>    
    </object>    
    <object class="IBPartialClassDescription">    
     <string key="className">UISearchBar</string>    
     <string key="superclassName">UIView</string>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier">    
      <string key="majorKey">IBFrameworkSource</string>    
      <string key="minorKey">UIKit.framework/Headers/UISearchBar.h</string>    
     </object>    
    </object>    
    <object class="IBPartialClassDescription">    
     <string key="className">UISearchDisplayController</string>    
     <string key="superclassName">NSObject</string>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier">    
      <string key="majorKey">IBFrameworkSource</string>    
      <string key="minorKey">UIKit.framework/Headers/UISearchDisplayController.h</string>    
     </object>    
    </object>    
    <object class="IBPartialClassDescription">    
     <string key="className">UIView</string>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier">    
      <string key="majorKey">IBFrameworkSource</string>    
      <string key="minorKey">UIKit.framework/Headers/UITextField.h</string>    
     </object>    
    </object>    
    <object class="IBPartialClassDescription">    
     <string key="className">UIView</string>    
     <string key="superclassName">UIResponder</string>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier">    
      <string key="majorKey">IBFrameworkSource</string>    
      <string key="minorKey">UIKit.framework/Headers/UIView.h</string>    
     </object>    
    </object>    
    <object class="IBPartialClassDescription">    
     <string key="className">UIViewController</string>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier">    
      <string key="majorKey">IBFrameworkSource</string>    
      <string key="minorKey">UIKit.framework/Headers/UINavigationController.h</string>    
     </object>    
    </object>    
    <object class="IBPartialClassDescription">    
     <string key="className">UIViewController</string>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier">    
      <string key="majorKey">IBFrameworkSource</string>    
      <string key="minorKey">UIKit.framework/Headers/UIPopoverController.h</string>    
     </object>    
    </object>    
    <object class="IBPartialClassDescription">    
     <string key="className">UIViewController</string>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier">    
      <string key="majorKey">IBFrameworkSource</string>    
      <string key="minorKey">UIKit.framework/Headers/UISplitViewController.h</string>    
     </object>    
    </object>    
    <object class="IBPartialClassDescription">    
     <string key="className">UIViewController</string>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier">    
      <string key="majorKey">IBFrameworkSource</string>    
      <string key="minorKey">UIKit.framework/Headers/UITabBarController.h</string>    
     </object>    
    </object>    
    <object class="IBPartialClassDescription">    
     <string key="className">UIViewController</string>    
     <string key="superclassName">UIResponder</string>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier">    
      <string key="majorKey">IBFrameworkSource</string>    
      <string key="minorKey">UIKit.framework/Headers/UIViewController.h</string>    
     </object>    
    </object>    
    <object class="IBPartialClassDescription">    
     <string key="className">UIWindow</string>    
     <string key="superclassName">UIView</string>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier">    
      <string key="majorKey">IBFrameworkSource</string>    
      <string key="minorKey">UIKit.framework/Headers/UIWindow.h</string>    
     </object>    
    </object>    
   </object>    
  </object>    
  <int key="IBDocument.localizationMode">0</int>    
  <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaTouchFramework</string>    
  <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">    
   <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>    
   <integer value="1024" key="NS.object.0"/>    
  </object>    
  <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">    
   <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>    
   <integer value="3100" key="NS.object.0"/>    
  </object>    
  <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>    
  <string key="IBDocument.LastKnownRelativeProjectPath">CustomTabBar.xcodeproj</string>    
  <int key="IBDocument.defaultPropertyAccessControl">3</int>    
  <string key="IBCocoaTouchPluginVersion">112</string>    
 </data>    
</archive>       

    CustomTabBarViewController.xib: 
  
   

      
  
   

    <?xml version="1.0" encoding="UTF-8"?> 
   
<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="7.10">    
 <data>    
  <int key="IBDocument.SystemTarget">800</int>    
  <string key="IBDocument.SystemVersion">10C540</string>    
  <string key="IBDocument.InterfaceBuilderVersion">759</string>    
  <string key="IBDocument.AppKitVersion">1038.25</string>    
  <string key="IBDocument.HIToolboxVersion">458.00</string>    
  <object class="NSMutableDictionary" key="IBDocument.PluginVersions">    
   <string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>    
   <string key="NS.object.0">77</string>    
  </object>    
  <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">    
   <bool key="EncodedWithXMLCoder">YES</bool>    
   <integer value="6"/>    
  </object>    
  <object class="NSArray" key="IBDocument.PluginDependencies">    
   <bool key="EncodedWithXMLCoder">YES</bool>    
   <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>    
  </object>    
  <object class="NSMutableDictionary" key="IBDocument.Metadata">    
   <bool key="EncodedWithXMLCoder">YES</bool>    
   <object class="NSArray" key="dict.sortedKeys" id="0">    
    <bool key="EncodedWithXMLCoder">YES</bool>    
   </object>    
   <object class="NSMutableArray" key="dict.values">    
    <bool key="EncodedWithXMLCoder">YES</bool>    
   </object>    
  </object>    
  <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">    
   <bool key="EncodedWithXMLCoder">YES</bool>    
   <object class="IBProxyObject" id="372490531">    
    <string key="IBProxiedObjectIdentifier">IBFilesOwner</string>    
    <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>    
   </object>    
   <object class="IBProxyObject" id="843779117">    
    <string key="IBProxiedObjectIdentifier">IBFirstResponder</string>    
    <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>    
   </object>    
   <object class="IBUIView" id="774585933">    
    <reference key="NSNextResponder"/>    
    <int key="NSvFlags">274</int>    
    <string key="NSFrameSize">{320, 460}</string>    
    <reference key="NSSuperview"/>    
    <object class="NSColor" key="IBUIBackgroundColor">    
     <int key="NSColorSpace">3</int>    
     <bytes key="NSWhite">MC43NQA</bytes>    
     <object class="NSColorSpace" key="NSCustomColorSpace">    
      <int key="NSID">2</int>    
     </object>    
    </object>    
    <bool key="IBUIClearsContextBeforeDrawing">NO</bool>    
    <object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/>    
    <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>    
   </object>    
  </object>    
  <object class="IBObjectContainer" key="IBDocument.Objects">    
   <object class="NSMutableArray" key="connectionRecords">    
    <bool key="EncodedWithXMLCoder">YES</bool>    
    <object class="IBConnectionRecord">    
     <object class="IBCocoaTouchOutletConnection" key="connection">    
      <string key="label">view</string>    
      <reference key="source" ref="372490531"/>    
      <reference key="destination" ref="774585933"/>    
     </object>    
     <int key="connectionID">7</int>    
    </object>    
   </object>    
   <object class="IBMutableOrderedSet" key="objectRecords">    
    <object class="NSArray" key="orderedObjects">    
     <bool key="EncodedWithXMLCoder">YES</bool>    
     <object class="IBObjectRecord">    
      <int key="objectID">0</int>    
      <reference key="object" ref="0"/>    
      <reference key="children" ref="1000"/>    
      <nil key="parent"/>    
     </object>    
     <object class="IBObjectRecord">    
      <int key="objectID">-1</int>    
      <reference key="object" ref="372490531"/>    
      <reference key="parent" ref="0"/>    
      <string key="objectName">File's Owner</string>    
     </object>    
     <object class="IBObjectRecord">    
      <int key="objectID">-2</int>    
      <reference key="object" ref="843779117"/>    
      <reference key="parent" ref="0"/>    
     </object>    
     <object class="IBObjectRecord">    
      <int key="objectID">6</int>    
      <reference key="object" ref="774585933"/>    
      <reference key="parent" ref="0"/>    
     </object>    
    </object>    
   </object>    
   <object class="NSMutableDictionary" key="flattenedProperties">    
    <bool key="EncodedWithXMLCoder">YES</bool>    
    <object class="NSArray" key="dict.sortedKeys">    
     <bool key="EncodedWithXMLCoder">YES</bool>    
     <string>-1.CustomClassName</string>    
     <string>-2.CustomClassName</string>    
     <string>6.IBEditorWindowLastContentRect</string>    
     <string>6.IBPluginDependency</string>    
    </object>    
    <object class="NSMutableArray" key="dict.values">    
     <bool key="EncodedWithXMLCoder">YES</bool>    
     <string>CustomTabBarViewController</string>    
     <string>UIResponder</string>    
     <string>{{239, 654}, {320, 480}}</string>    
     <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>    
    </object>    
   </object>    
   <object class="NSMutableDictionary" key="unlocalizedProperties">    
    <bool key="EncodedWithXMLCoder">YES</bool>    
    <reference key="dict.sortedKeys" ref="0"/>    
    <object class="NSMutableArray" key="dict.values">    
     <bool key="EncodedWithXMLCoder">YES</bool>    
    </object>    
   </object>    
   <nil key="activeLocalization"/>    
   <object class="NSMutableDictionary" key="localizations">    
    <bool key="EncodedWithXMLCoder">YES</bool>    
    <reference key="dict.sortedKeys" ref="0"/>    
    <object class="NSMutableArray" key="dict.values">    
     <bool key="EncodedWithXMLCoder">YES</bool>    
    </object>    
   </object>    
   <nil key="sourceID"/>    
   <int key="maxID">7</int>    
  </object>    
  <object class="IBClassDescriber" key="IBDocument.Classes">    
   <object class="NSMutableArray" key="referencedPartialClassDescriptions">    
    <bool key="EncodedWithXMLCoder">YES</bool>    
    <object class="IBPartialClassDescription">    
     <string key="className">CustomTabBarViewController</string>    
     <string key="superclassName">UIViewController</string>    
     <object class="IBClassDescriptionSource" key="sourceIdentifier">    
      <string key="majorKey">IBProjectSource</string>    
      <string key="minorKey">Classes/CustomTabBarViewController.h</string>    
     </object>    
    </object>    
   </object>    
  </object>    
  <int key="IBDocument.localizationMode">0</int>    
  <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaTouchFramework</string>    
  <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">    
   <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>    
   <integer value="3100" key="NS.object.0"/>    
  </object>    
  <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>    
  <string key="IBDocument.LastKnownRelativeProjectPath">CustomTabBar.xcodeproj</string>    
  <int key="IBDocument.defaultPropertyAccessControl">3</int>    
  <string key="IBCocoaTouchPluginVersion">77</string>    
  <nil key="IBCocoaTouchSimulationTargetRuntimeIdentifier"/>    
 </data>