ios自定义标签栏

来源:互联网 发布:软件测试工程师自学 编辑:程序博客网 时间:2024/05/21 06:17
 

ios自定义标签栏

分类: Objective-C/IOS
iosbuttonuiviewimageactioninterface

CustomTabBarViewController.h

[cpp] view plaincopy
  1. #import "CustomTabBar.h"  
  2.   
  3. @interface CustomTabBarViewController : UIViewController <CustomTabBarDelegate> {  
  4.     CustomTabBar *tabBar;  
  5. }  
  6.   
  7. @property (nonatomic, retain) CustomTabBar *tabBar;  
  8.   
  9. @end  

CustomTabBarViewController.m

[cpp] view plaincopy
  1. #import "CustomTabBarViewController.h"  
  2.   
  3. #define SELECTED_VIEW_CONTROLLER_TAG 98456345  
  4.   
  5. static NSArray *tabBarItems = nil;  
  6.   
  7. @implementation CustomTabBarViewController  
  8. @synthesize tabBar;  
  9.   
  10. - (void) awakeFromNib {  
  11.     UIViewController *detailController1 = [[[UIViewController alloc] init] autorelease];  
  12.     detailController1.view.backgroundColor = [UIColor redColor];  
  13.       
  14.     UIViewController *detailController2 = [[[UIViewController alloc] init] autorelease];  
  15.     detailController2.view.backgroundColor = [UIColor whiteColor];  
  16.       
  17.     UIViewController *detailController3 = [[[UIViewController alloc] init] autorelease];  
  18.     detailController3.view.backgroundColor = [UIColor blueColor];  
  19.       
  20.     UIViewController *detailController4 = [[[UIViewController alloc] init] autorelease];  
  21.     detailController4.view.backgroundColor = [UIColor cyanColor];  
  22.       
  23.     UIViewController *detailController5 = [[[UIViewController alloc] init] autorelease];  
  24.     detailController5.view.backgroundColor = [UIColor purpleColor];  
  25.       
  26.     tabBarItems = [[NSArray arrayWithObjects:  
  27.                     [NSDictionary dictionaryWithObjectsAndKeys:@"chat.png", @"image", detailController1, @"viewController", nil],  
  28.                     [NSDictionary dictionaryWithObjectsAndKeys:@"compose-at.png", @"image", detailController2, @"viewController", nil],  
  29.                     [NSDictionary dictionaryWithObjectsAndKeys:@"messages.png", @"image", detailController3, @"viewController", nil],  
  30.                     [NSDictionary dictionaryWithObjectsAndKeys:@"magnifying-glass.png", @"image", detailController4, @"viewController", nil],  
  31.                     [NSDictionary dictionaryWithObjectsAndKeys:@"more.png", @"image", detailController5, @"viewController", nil], nil] retain];  
  32. }  
  33.   
  34. - (void)viewDidLoad {  
  35.     [super viewDidLoad];  
  36.     UIImage *tabBarGradient = [UIImage imageNamed:@"TabBarGradient.png"];  
  37.     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];  
  38.     tabBar.frame = CGRectMake(0, self.view.frame.size.height - (tabBarGradient.size.height * 2), self.view.frame.size.width, tabBarGradient.size.height * 2);  
  39.     [self.view addSubview:tabBar];  
  40.     [tabBar selectItemAtIndex:0];  
  41.     [self touchDownAtItemAtIndex:0];  
  42. }  
  43.   
  44. #pragma mark -  
  45. #pragma mark CustomTabBarDelegate  
  46.   
  47. - (UIImage *) imageFor:(CustomTabBar *)tabBar atIndex:(NSUInteger)itemIndex {  
  48.     NSDictionary *data = [tabBarItems objectAtIndex:itemIndex];  
  49.     return [UIImage imageNamed:[data objectForKey:@"image"]];  
  50. }  
  51.   
  52. - (UIImage *) backgroundImage {  
  53.     CGFloat width = self.view.frame.size.width;  
  54.     UIImage *topImage = [UIImage imageNamed:@"TabBarGradient.png"];  
  55.     UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, topImage.size.height * 2), NO, 0.0);  
  56.     UIImage *stretchedTopImage = [topImage stretchableImageWithLeftCapWidth:0 topCapHeight:0];  
  57.     [stretchedTopImage drawInRect:CGRectMake(0, 0, width, topImage.size.height)];  
  58.     [[UIColor blackColor] set];  
  59.     CGContextFillRect(UIGraphicsGetCurrentContext(), CGRectMake(0, topImage.size.height, width, topImage.size.height));  
  60.     UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();  
  61.     UIGraphicsEndImageContext();  
  62.       
  63.     return resultImage;  
  64. }  
  65.   
  66. - (UIImage *) selectedItemBackgroundImage {  
  67.     return [UIImage imageNamed:@"TabBarItemSelectedBackground.png"];  
  68. }  
  69.   
  70. - (UIImage *) glowImage {  
  71.     UIImage *tabBarGlow = [UIImage imageNamed:@"TabBarGlow.png"];  
  72.     UIGraphicsBeginImageContextWithOptions(CGSizeMake(tabBarGlow.size.width, tabBarGlow.size.height - 4.0), NO, 0.0);  
  73.     [tabBarGlow drawAtPoint:CGPointZero];  
  74.     UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();  
  75.     UIGraphicsEndImageContext();  
  76.       
  77.     return resultImage;  
  78. }  
  79.   
  80. - (UIImage *) selectedItemImage {  
  81.     UIImage *tabBarGradient = [UIImage imageNamed:@"TabBarGradient.png"];  
  82.     CGSize tabBarItemSize = CGSizeMake(self.view.frame.size.width / tabBarItems.count, tabBarGradient.size.height * 2);  
  83.     UIGraphicsBeginImageContextWithOptions(tabBarItemSize, NO, 0.0);  
  84.     [[[UIImage imageNamed:@"TabBarSelection.png"] stretchableImageWithLeftCapWidth:4.0 topCapHeight:0] drawInRect:CGRectMake(0, 4.0, tabBarItemSize.width, tabBarItemSize.height - 4.0)];    
  85.     UIImage *selectedItemImage = UIGraphicsGetImageFromCurrentImageContext();  
  86.     UIGraphicsEndImageContext();  
  87.       
  88.     return selectedItemImage;  
  89. }  
  90.   
  91. - (UIImage *) tabBarArrowImage {  
  92.     return [UIImage imageNamed:@"TabBarNipple.png"];  
  93. }  
  94.   
  95. - (void) touchDownAtItemAtIndex:(NSUInteger)itemIndex {  
  96.     UIView *currentView = [self.view viewWithTag:SELECTED_VIEW_CONTROLLER_TAG];  
  97.     [currentView removeFromSuperview];  
  98.       
  99.     NSDictionary *data = [tabBarItems objectAtIndex:itemIndex];  
  100.     UIViewController *viewController = [data objectForKey:@"viewController"];  
  101.       
  102.     UIImage *tabBarGradient = [UIImage imageNamed:@"TabBarGradient.png"];  
  103.       
  104.     viewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - (tabBarGradient.size.height * 2));  
  105.       
  106.     viewController.view.tag = SELECTED_VIEW_CONTROLLER_TAG;  
  107.       
  108.     [self.view insertSubview:viewController.view belowSubview:tabBar];  
  109.       
  110.     [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(addGlowTimerFireMethod:) userInfo:[NSNumber numberWithInteger:itemIndex] repeats:NO];  
  111. }  
  112.   
  113. - (void)addGlowTimerFireMethod:(NSTimer *)theTimer {  
  114.     for (NSUInteger i = 0 ; i < tabBarItems.count ; i++) {  
  115.         [tabBar removeGlowAtIndex:i];  
  116.     }  
  117.     [tabBar glowItemAtIndex:[[theTimer userInfo] integerValue]];  
  118. }  
  119.   
  120. - (void)dealloc {  
  121.     [tabBar release];  
  122.     [super dealloc];  
  123. }  
  124.   
  125. @end  

CustomTabBar.h

[cpp] view plaincopy
  1. @class CustomTabBar;  
  2.   
  3. @protocol CustomTabBarDelegate  
  4.   
  5. - (UIImage *) imageFor:(CustomTabBar *)tabBar atIndex:(NSUInteger)itemIndex;  
  6. - (UIImage *) backgroundImage;  
  7. - (UIImage *) selectedItemBackgroundImage;  
  8. - (UIImage *) glowImage;  
  9. - (UIImage *) selectedItemImage;  
  10. - (UIImage *) tabBarArrowImage;  
  11.   
  12. @optional  
  13. - (void) touchUpInsideItemAtIndex:(NSUInteger)itemIndex;  
  14. - (void) touchDownAtItemAtIndex:(NSUInteger)itemIndex;  
  15. @end  
  16.   
  17. @interface CustomTabBar : UIView {  
  18.     NSObject <CustomTabBarDelegate> *delegate;  
  19.     NSMutableArray *buttons;  
  20. }  
  21.   
  22. @property (nonatomic, retain) NSMutableArray *buttons;  
  23.   
  24. - (id) initWithItemCount:(NSUInteger)itemCount itemSize:(CGSize)itemSize tag:(NSInteger)objectTag delegate:(NSObject <CustomTabBarDelegate> *)customTabBarDelegate;  
  25.   
  26. - (void) selectItemAtIndex:(NSInteger)index;  
  27. - (void) glowItemAtIndex:(NSInteger)index;  
  28. - (void) removeGlowAtIndex:(NSInteger)index;  
  29.   
  30. @end  

CustomTabBar.m

[cpp] view plaincopy
  1. #import "CustomTabBar.h"  
  2.   
  3. #define GLOW_IMAGE_TAG 2394858  
  4. #define TAB_ARROW_IMAGE_TAG 2394859  
  5.   
  6. @interface CustomTabBar (PrivateMethods)  
  7. - (CGFloat) horizontalLocationFor:(NSUInteger)tabIndex;  
  8. - (void) addTabBarArrowAtIndex:(NSUInteger)itemIndex;  
  9. - (UIButton *) buttonAtIndex:(NSUInteger)itemIndex width:(CGFloat)width;  
  10. - (UIImage *) tabBarImage:(UIImage *)startImage size:(CGSize)targetSize backgroundImage:(UIImage *)backgroundImage;  
  11. - (UIImage *) blackFilledImageWithWhiteBackgroundUsing:(UIImage *)startImage;  
  12. - (UIImage *) tabBarBackgroundImageWithSize:(CGSize)targetSize backgroundImage:(UIImage *)backgroundImage;  
  13. @end  
  14.   
  15. @implementation CustomTabBar  
  16. @synthesize buttons;  
  17.   
  18. - (id) initWithItemCount:(NSUInteger)itemCount itemSize:(CGSize)itemSize tag:(NSInteger)objectTag delegate:(NSObject <CustomTabBarDelegate> *)customTabBarDelegate {  
  19.     if (self = [super init]) {  
  20.         self.tag = objectTag;  
  21.           
  22.         delegate = customTabBarDelegate;  
  23.           
  24.         UIImage *backgroundImage = [delegate backgroundImage];  
  25.         UIImageView *backgroundImageView = [[[UIImageView alloc] initWithImage:backgroundImage] autorelease];  
  26.         backgroundImageView.frame = CGRectMake(0, 0, backgroundImage.size.width, backgroundImage.size.height);  
  27.         [self addSubview:backgroundImageView];  
  28.           
  29.         self.frame = CGRectMake(0, 0, itemSize.width * itemCount, itemSize.height);  
  30.           
  31.         self.buttons = [[NSMutableArray alloc] initWithCapacity:itemCount];  
  32.           
  33.         CGFloat horizontalOffset = 0;  
  34.           
  35.         for (NSUInteger i = 0 ; i < itemCount ; i++) {  
  36.             UIButton *button = [self buttonAtIndex:i width:self.frame.size.width / itemCount];  
  37.               
  38.             [button addTarget:self action:@selector(touchDownAction:) forControlEvents:UIControlEventTouchDown];  
  39.             [button addTarget:self action:@selector(touchUpInsideAction:) forControlEvents:UIControlEventTouchUpInside];  
  40.             [button addTarget:self action:@selector(otherTouchesAction:) forControlEvents:UIControlEventTouchUpOutside];  
  41.             [button addTarget:self action:@selector(otherTouchesAction:) forControlEvents:UIControlEventTouchDragOutside];  
  42.             [button addTarget:self action:@selector(otherTouchesAction:) forControlEvents:UIControlEventTouchDragInside];  
  43.               
  44.             [buttons addObject:button];  
  45.               
  46.             button.frame = CGRectMake(horizontalOffset, 0.0, button.frame.size.width, button.frame.size.height);  
  47.               
  48.             [self addSubview:button];  
  49.               
  50.             horizontalOffset = horizontalOffset + itemSize.width;  
  51.         }  
  52.     }  
  53.       
  54.     return self;  
  55. }  
  56.   
  57. - (void) dimAllButtonsExcept:(UIButton *)selectedButton {  
  58.     for (UIButton *button in buttons) {  
  59.         if (button == selectedButton) {  
  60.             button.selected = YES;  
  61.             button.highlighted = button.selected ? NO : YES;  
  62.               
  63.             UIImageView *tabBarArrow = (UIImageView *)[self viewWithTag:TAB_ARROW_IMAGE_TAG];  
  64.             NSUInteger selectedIndex = [buttons indexOfObjectIdenticalTo:button];  
  65.             if (tabBarArrow) {  
  66.                 [UIView beginAnimations:nil context:nil];  
  67.                 [UIView setAnimationDuration:0.2];  
  68.                 CGRect frame = tabBarArrow.frame;  
  69.                 frame.origin.x = [self horizontalLocationFor:selectedIndex];  
  70.                 tabBarArrow.frame = frame;  
  71.                 [UIView commitAnimations];  
  72.             } else {  
  73.                 [self addTabBarArrowAtIndex:selectedIndex];  
  74.             }  
  75.         } else {  
  76.             button.selected = NO;  
  77.             button.highlighted = NO;  
  78.         }  
  79.     }  
  80. }  
  81.   
  82. - (void)touchDownAction:(UIButton *)button {  
  83.     [self dimAllButtonsExcept:button];  
  84.       
  85.     if ([delegate respondsToSelector:@selector(touchDownAtItemAtIndex:)])  
  86.         [delegate touchDownAtItemAtIndex:[buttons indexOfObject:button]];  
  87. }  
  88.   
  89. - (void)touchUpInsideAction:(UIButton *)button {  
  90.     [self dimAllButtonsExcept:button];  
  91.       
  92.     if ([delegate respondsToSelector:@selector(touchUpInsideItemAtIndex:)])  
  93.         [delegate touchUpInsideItemAtIndex:[buttons indexOfObject:button]];  
  94. }  
  95.   
  96. - (void)otherTouchesAction:(UIButton *)button {  
  97.     [self dimAllButtonsExcept:button];  
  98. }  
  99.   
  100. - (void) selectItemAtIndex:(NSInteger)index {  
  101.     UIButton *button = [buttons objectAtIndex:index];  
  102.       
  103.     [self dimAllButtonsExcept:button];  
  104. }  
  105.   
  106. - (void) glowItemAtIndex:(NSInteger)index {  
  107.     UIButton *button = [buttons objectAtIndex:index];  
  108.       
  109.     UIImage *glowImage = [delegate glowImage];  
  110.       
  111.     UIImageView *glowImageView = [[[UIImageView alloc] initWithImage:glowImage] autorelease];  
  112.       
  113.     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);  
  114.       
  115.     glowImageView.tag = GLOW_IMAGE_TAG;  
  116.       
  117.     [button addSubview:glowImageView];  
  118. }  
  119.   
  120. - (void) removeGlowAtIndex:(NSInteger)index {  
  121.     UIButton *button = [buttons objectAtIndex:index];  
  122.     UIImageView *glowImageView = (UIImageView *)[button viewWithTag:GLOW_IMAGE_TAG];  
  123.     [glowImageView removeFromSuperview];  
  124. }  
  125.   
  126. - (CGFloat) horizontalLocationFor:(NSUInteger)tabIndex {  
  127.     UIImageView *tabBarArrow = (UIImageView *)[self viewWithTag:TAB_ARROW_IMAGE_TAG];    
  128.     CGFloat tabItemWidth = self.frame.size.width / buttons.count;  
  129.     CGFloat halfTabItemWidth = (tabItemWidth / 2.0) - (tabBarArrow.frame.size.width / 2.0);  
  130.     return (tabIndex * tabItemWidth) + halfTabItemWidth;  
  131. }  
  132.   
  133. - (void) addTabBarArrowAtIndex:(NSUInteger)itemIndex {  
  134.     UIImage *tabBarArrowImage = [delegate tabBarArrowImage];  
  135.     UIImageView *tabBarArrow = [[[UIImageView alloc] initWithImage:tabBarArrowImage] autorelease];  
  136.     tabBarArrow.tag = TAB_ARROW_IMAGE_TAG;  
  137.     CGFloat verticalLocation = -tabBarArrowImage.size.height + 2;  
  138.     tabBarArrow.frame = CGRectMake([self horizontalLocationFor:itemIndex], verticalLocation, tabBarArrowImage.size.width, tabBarArrowImage.size.height);  
  139.       
  140.     [self addSubview:tabBarArrow];  
  141. }  
  142.   
  143. - (UIButton *) buttonAtIndex:(NSUInteger)itemIndex width:(CGFloat)width {  
  144.     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];  
  145.     button.frame = CGRectMake(0.0, 0.0, width, self.frame.size.height);  
  146.       
  147.     UIImage *rawButtonImage = [delegate imageFor:self atIndex:itemIndex];  
  148.     UIImage *buttonImage = [self tabBarImage:rawButtonImage size:button.frame.size backgroundImage:nil];  
  149.     UIImage *buttonPressedImage = [self tabBarImage:rawButtonImage size:button.frame.size backgroundImage:[delegate selectedItemBackgroundImage]];  
  150.       
  151.     [button setImage:buttonImage forState:UIControlStateNormal];  
  152.     [button setImage:buttonPressedImage forState:UIControlStateHighlighted];  
  153.     [button setImage:buttonPressedImage forState:UIControlStateSelected];  
  154.       
  155.     [button setBackgroundImage:[delegate selectedItemImage] forState:UIControlStateHighlighted];  
  156.     [button setBackgroundImage:[delegate selectedItemImage] forState:UIControlStateSelected];  
  157.       
  158.     button.adjustsImageWhenHighlighted = NO;  
  159.       
  160.     return button;  
  161. }  
  162.   
  163. - (UIImage *) tabBarImage:(UIImage *)startImage size:(CGSize)targetSize backgroundImage:(UIImage *)backgroundImageSource {  
  164.     UIImage *backgroundImage = [self tabBarBackgroundImageWithSize:startImage.size backgroundImage:backgroundImageSource];  
  165.       
  166.     UIImage *bwImage = [self blackFilledImageWithWhiteBackgroundUsing:startImage];  
  167.       
  168.     CGImageRef imageMask = CGImageMaskCreate(CGImageGetWidth(bwImage.CGImage),  
  169.                                              CGImageGetHeight(bwImage.CGImage),  
  170.                                              CGImageGetBitsPerComponent(bwImage.CGImage),  
  171.                                              CGImageGetBitsPerPixel(bwImage.CGImage),  
  172.                                              CGImageGetBytesPerRow(bwImage.CGImage),  
  173.                                              CGImageGetDataProvider(bwImage.CGImage), NULL, YES);  
  174.       
  175.     CGImageRef tabBarImageRef = CGImageCreateWithMask(backgroundImage.CGImage, imageMask);  
  176.       
  177.     UIImage *tabBarImage = [UIImage imageWithCGImage:tabBarImageRef scale:startImage.scale orientation:startImage.imageOrientation];  
  178.       
  179.     CGImageRelease(imageMask);  
  180.     CGImageRelease(tabBarImageRef);  
  181.       
  182.     UIGraphicsBeginImageContextWithOptions(targetSize, NO, 0.0);  
  183.       
  184.     [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)];  
  185.       
  186.     UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();  
  187.     UIGraphicsEndImageContext();  
  188.       
  189.     return resultImage;  
  190. }  
  191.   
  192. - (UIImage *) blackFilledImageWithWhiteBackgroundUsing:(UIImage *)startImage {  
  193.     CGRect imageRect = CGRectMake(0, 0, CGImageGetWidth(startImage.CGImage), CGImageGetHeight(startImage.CGImage));  
  194.       
  195.     CGContextRef context = CGBitmapContextCreate(NULL, imageRect.size.width, imageRect.size.height, 8, 0, CGImageGetColorSpace(startImage.CGImage), kCGImageAlphaPremultipliedLast);  
  196.       
  197.     CGContextSetRGBFillColor(context, 1, 1, 1, 1);  
  198.     CGContextFillRect(context, imageRect);  
  199.       
  200.     CGContextClipToMask(context, imageRect, startImage.CGImage);  
  201.     CGContextSetRGBFillColor(context, 0, 0, 0, 1);  
  202.     CGContextFillRect(context, imageRect);  
  203.       
  204.     CGImageRef newCGImage = CGBitmapContextCreateImage(context);  
  205.     UIImage* newImage = [UIImage imageWithCGImage:newCGImage scale:startImage.scale orientation:startImage.imageOrientation];  
  206.       
  207.     CGContextRelease(context);  
  208.     CGImageRelease(newCGImage);  
  209.       
  210.     return newImage;  
  211. }  
  212.   
  213. - (UIImage *) tabBarBackgroundImageWithSize:(CGSize)targetSize backgroundImage:(UIImage *)backgroundImage {  
  214.     UIGraphicsBeginImageContextWithOptions(targetSize, NO, 0.0);  
  215.     if (backgroundImage) {  
  216.         [backgroundImage drawInRect:CGRectMake((targetSize.width - CGImageGetWidth(backgroundImage.CGImage)) / 2, (targetSize.height - CGImageGetHeight(backgroundImage.CGImage)) / 2, CGImageGetWidth(backgroundImage.CGImage), CGImageGetHeight(backgroundImage.CGImage))];  
  217.     } else {  
  218.         [[UIColor lightGrayColor] set];  
  219.         UIRectFill(CGRectMake(0, 0, targetSize.width, targetSize.height));  
  220.     }  
  221.       
  222.     UIImage *finalBackgroundImage = UIGraphicsGetImageFromCurrentImageContext();  
  223.     UIGraphicsEndImageContext();  
  224.       
  225.     return finalBackgroundImage;  
  226. }  
  227.   
  228. - (void)dealloc {  
  229.     [buttons release];  
  230.     [super dealloc];  
  231. }  
  232.   
  233. @end  
0 0
原创粉丝点击