自定义UITabBar

iOS开发项目篇—27自定义UITabBar

一、自定义

思路:

(1)新建一个继承自UITabBar的类,自定义一个UITabBar

(2)用自定义的UITabBar换掉系统的UItabBar(使用了KVC)

(3)监听控制器的切换,只要控制器一切换,就调用代理方法强制重新布局子控件(内部会调用layoutSubviews)。

YYTabBar.m文件代码:

复制代码

  1 //  2 //  YYTabBar.m  3 //  4   5 #import "YYTabBar.h"  6   7 @interface YYTabBar()  8 @property (nonatomic, weak) UIButton *plusButton;  9 @end 10  11 @implementation YYTabBar 12  13 - (id)initWithFrame:(CGRect)frame 14 { 15     self = [super initWithFrame:frame]; 16     if (self) { 17         // 添加加号按钮 18         [self setupPlusButton]; 19     } 20     return self; 21 } 22  23 /** 24  *  添加加号按钮 25  */ 26 - (void)setupPlusButton 27 { 28     UIButton *plusButton = [[UIButton alloc] init]; 29     // 设置背景 30     [plusButton setBackgroundImage:[UIImage imageWithName:@"tabbar_compose_button"] forState:UIControlStateNormal]; 31     [plusButton setBackgroundImage:[UIImage imageWithName:@"tabbar_compose_button_highlighted"] forState:UIControlStateHighlighted]; 32     // 设置图标 33     [plusButton setImage:[UIImage imageWithName:@"tabbar_compose_icon_add"] forState:UIControlStateNormal]; 34     [plusButton setImage:[UIImage imageWithName:@"tabbar_compose_icon_add_highlighted"] forState:UIControlStateHighlighted]; 35     [plusButton addTarget:self action:@selector(plusClick) forControlEvents:UIControlEventTouchUpInside]; 36     // 添加 37     [self addSubview:plusButton]; 38     self.plusButton = plusButton; 39 } 40  41 - (void)plusClick 42 { 43     YYLog(@"plusClick----"); 44 } 45  46 /** 47  *  布局子控件 48  */ 49 - (void)layoutSubviews 50 { 51     [super layoutSubviews]; 52      53     // 设置plusButton的frame 54     [self setupPlusButtonFrame]; 55      56     // 设置所有tabbarButton的frame 57     [self setupAllTabBarButtonsFrame]; 58 } 59  60 /** 61  *  设置所有plusButton的frame 62  */ 63 - (void)setupPlusButtonFrame 64 { 65     self.plusButton.size = self.plusButton.currentBackgroundImage.size; 66     self.plusButton.center = CGPointMake(self.width * 0.5, self.height * 0.5); 67 } 68  69 /** 70  *  设置所有tabbarButton的frame 71  */ 72 - (void)setupAllTabBarButtonsFrame 73 { 74     int index = 0; 75      76     // 遍历所有的button 77     for (UIView *tabBarButton in self.subviews) { 78         // 如果不是UITabBarButton, 直接跳过 79         if (![tabBarButton isKindOfClass:NSClassFromString(@"UITabBarButton")]) continue; 80          81         // 根据索引调整位置 82         [self setupTabBarButtonFrame:tabBarButton atIndex:index]; 83          84         // 遍历UITabBarButton中的所有子控件 85         [self setupTabBarButtonTextColor:tabBarButton atIndex:index]; 86          87         // 索引增加 88         index++; 89     } 90 } 91  92 /** 93  *  设置某个按钮的文字颜色 94  * 95  *  @param tabBarButton 需要设置的按钮 96  *  @param index        按钮所在的索引 97  */ 98 - (void)setupTabBarButtonTextColor:(UIView *)tabBarButton atIndex:(int)index 99 {100     // 选中按钮的索引101     int selectedIndex = [self.items indexOfObject:self.selectedItem];102     103     for (UILabel *label in tabBarButton.subviews) {104         // 说明不是个Label105         if (![label isKindOfClass:[UILabel class]]) continue;106 107         // 设置字体108         label.font = [UIFont systemFontOfSize:10];109         if (selectedIndex == index) { // 说明这个Button选中, 设置label颜色为橙色110             label.textColor = [UIColor orangeColor];111         } else { // 说明这个Button没有选中, 设置label颜色为黑色112             label.textColor = [UIColor blackColor];113         }114     }115 }116 117 /**118  *  设置某个按钮的frame119  *120  *  @param tabBarButton 需要设置的按钮121  *  @param index        按钮所在的索引122  */123 - (void)setupTabBarButtonFrame:(UIView *)tabBarButton atIndex:(int)index124 {125     // 计算button的尺寸126     CGFloat buttonW = self.width / (self.items.count + 1);127     CGFloat buttonH = self.height;128     129     tabBarButton.width = buttonW;130     tabBarButton.height = buttonH;131     if (index >= 2) {132         tabBarButton.x = buttonW * (index + 1);133     } else {134         tabBarButton.x = buttonW * index;135     }136     tabBarButton.y = 0;137 }138 @end

复制代码

在YYTabBarViewController.m文件中使用自定义的UITabBar

复制代码

 1 // 2 //  YYTabBarViewController.m 3 // 4  5 #import "YYTabBarViewController.h" 6 #import "YYHomeTableViewController.h" 7 #import "YYDiscoverViewController.h" 8 #import "YYMessageViewController.h" 9 #import "YYProfileViewController.h"10 #import "UIImage+Extension.h"11 #import "YYNavigationViewController.h"12 #import "YYTabBar.h"13 14 @interface YYTabBarViewController ()<UITabBarControllerDelegate>15 16 @end17 18 @implementation YYTabBarViewController19 20 21 - (void)viewDidLoad22 {23     [super viewDidLoad];24     //添加四个子控制器25     YYHomeTableViewController *home=[[YYHomeTableViewController alloc]init];26     [self addOneChildVc:home title:@"首页" imageName:@"tabbar_home" selectedImageName:@"tabbar_home_selected"];27     28     29     YYMessageViewController *message=[[YYMessageViewController alloc]init];30     [self addOneChildVc:message title:@"消息" imageName:@"tabbar_message_center" selectedImageName:@"tabbar_message_center_selected"];31     32     YYDiscoverViewController *discover=[[YYDiscoverViewController alloc]init];33     [self addOneChildVc:discover title:@"发现" imageName:@"tabbar_discover" selectedImageName:@"tabbar_discover_selected"];34     35     YYProfileViewController *profile=[[YYProfileViewController alloc]init];36     [self addOneChildVc:profile title:@"我" imageName:@"tabbar_profile" selectedImageName:@"tabbar_profile_selected"];37     38 39     // 调整tabbar40     YYTabBar *customTabBar = [[YYTabBar alloc] init];41     customTabBar.backgroundImage = [UIImage imageWithName:@"tabbar_background"];42     customTabBar.selectionIndicatorImage = [UIImage imageWithName:@"navigationbar_button_background"];43     // 更换系统自带的tabbar44     [self setValue:customTabBar forKeyPath:@"tabBar"];45     46     // 设置代理(监听控制器的切换, 控制器一旦切换了子控制器,就会调用代理的tabBarController:didSelectViewController:)47     self.delegate = self;48  49 }50 51 - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController52 {53     // 强制重新布局子控件(内部会调用layouSubviews)54     [self.tabBar setNeedsLayout];55 }56 57 /**58  *  添加一个子控制器59  *60  *  @param childVC           子控制对象61  *  @param title             标题62  *  @param imageName         图标63  *  @param selectedImageName 选中时的图标64  */65 -(void)addOneChildVc:(UIViewController *)childVc title:(NSString *)title imageName:(NSString *)imageName selectedImageName:(NSString *)selectedImageName66 {67     //随机设置子控制器的背景颜色68 //    childVc.view.backgroundColor=YYRandomColor;69     70     //设置标题71     childVc.title=title;  //相当于设置了后两者的标题72 //    childVc.navigationItem.title=title;//设置导航栏的标题73 //    childVc.tabBarItem.title=title;//设置tabbar上面的标题74     75     //设置图标76     childVc.tabBarItem.image=[UIImage imageWithName:imageName];77     //设置选中时的图标78     UIImage *selectedImage=[UIImage imageWithName:selectedImageName];79     80     81     if (iOS7) {82         // 声明这张图片用原图(别渲染)83         selectedImage = [selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];84     }85     childVc.tabBarItem.selectedImage = selectedImage;86     87      // 添加为tabbar控制器的子控制器88     YYNavigationViewController *nav=[[YYNavigationViewController alloc]initWithRootViewController:childVc];89     90     [self addChildViewController:nav];91 92 }93 94 95 // 在iOS7中, 会对selectedImage的图片进行再次渲染为蓝色96 // 要想显示原图, 就必须得告诉它: 不要渲染97 98 // Xcode的插件安装路径: /Users/用户名/Library/Application Support/Developer/Shared/Xcode/Plug-ins99 @end

复制代码

实现效果(iOS7中)

自定义UITabBar

关键代码:更换系统自带的tabbar      [self setValue:customTabBar forKeyPath:@"tabBar"];

说明:不能直接使用self.tabBar的方式调用set方法进行更换,因为这个属性是只读的,这里的实现是直接使用KVC把它内部的下划线常量给修改了。

 

二、完善

问题说明:

(1)上面的代码下方的UITabBar是透明的。因为ios6中的背景图片是白色的,而ios7中的背景图片是透明的。有两种解决方式,一种是在mainbundle中直接把ios7对应的那张图片素材删除即可,但是这种方法会导致ios7中的穿透效果没有。第二种解决方式,判断当前系统版本,如果当前是ios7则不需要设置。

(2)子控件的frame没必要每次都设置,只需要设置一次就可以了。切换控制器的目的只有一个,就是改变默认和选中状态下文字的颜色。

完善后的代码:

  YYTabBar.m文件

复制代码

  1 //  2 //  YYTabBar.m  3 //  4   5 #import "YYTabBar.h"  6   7 @interface YYTabBar()  8 @property (nonatomic, weak) UIButton *plusButton;  9 @end 10  11 @implementation YYTabBar 12  13 - (id)initWithFrame:(CGRect)frame 14 { 15     self = [super initWithFrame:frame]; 16     if (self) { 17         if (!iOS7) { 18             self.backgroundImage = [UIImage imageWithName:@"tabbar_background"]; 19         } 20         self.selectionIndicatorImage = [UIImage imageWithName:@"navigationbar_button_background"]; 21         // 添加加号按钮 22         [self setupPlusButton]; 23     } 24     return self; 25 } 26  27 /** 28  *  添加加号按钮 29  */ 30 - (void)setupPlusButton 31 { 32     UIButton *plusButton = [[UIButton alloc] init]; 33     // 设置背景 34     [plusButton setBackgroundImage:[UIImage imageWithName:@"tabbar_compose_button"] forState:UIControlStateNormal]; 35     [plusButton setBackgroundImage:[UIImage imageWithName:@"tabbar_compose_button_highlighted"] forState:UIControlStateHighlighted]; 36     // 设置图标 37     [plusButton setImage:[UIImage imageWithName:@"tabbar_compose_icon_add"] forState:UIControlStateNormal]; 38     [plusButton setImage:[UIImage imageWithName:@"tabbar_compose_icon_add_highlighted"] forState:UIControlStateHighlighted]; 39     [plusButton addTarget:self action:@selector(plusClick) forControlEvents:UIControlEventTouchUpInside]; 40     // 添加 41     [self addSubview:plusButton]; 42     self.plusButton = plusButton; 43 } 44  45 - (void)plusClick 46 { 47     YYLog(@"plusClick----"); 48 } 49  50 /** 51  *  布局子控件 52  */ 53 - (void)layoutSubviews 54 { 55     [super layoutSubviews]; 56      57     // 设置plusButton的frame 58     [self setupPlusButtonFrame]; 59      60     // 设置所有tabbarButton的frame 61     [self setupAllTabBarButtonsFrame]; 62 } 63  64 /** 65  *  设置所有plusButton的frame 66  */ 67 - (void)setupPlusButtonFrame 68 { 69     self.plusButton.size = self.plusButton.currentBackgroundImage.size; 70     self.plusButton.center = CGPointMake(self.width * 0.5, self.height * 0.5); 71 } 72  73 /** 74  *  设置所有tabbarButton的frame 75  */ 76 - (void)setupAllTabBarButtonsFrame 77 { 78     int index = 0; 79      80     // 遍历所有的button 81     for (UIView *tabBarButton in self.subviews) { 82         // 如果不是UITabBarButton, 直接跳过 83         if (![tabBarButton isKindOfClass:NSClassFromString(@"UITabBarButton")]) continue; 84          85         // 根据索引调整位置 86         [self setupTabBarButtonFrame:tabBarButton atIndex:index]; 87 //         88 //        // 遍历UITabBarButton中的所有子控件 89 //        [self setupTabBarButtonTextColor:tabBarButton atIndex:index]; 90          91         // 索引增加 92         index++; 93     } 94 } 95  96 ///** 97 // *  设置某个按钮的文字颜色 98 // * 99 // *  @param tabBarButton 需要设置的按钮100 // *  @param index        按钮所在的索引101 // */102 //- (void)setupTabBarButtonTextColor:(UIView *)tabBarButton atIndex:(int)index103 //{104 //    // 选中按钮的索引105 //    int selectedIndex = [self.items indexOfObject:self.selectedItem];106 //    107 //    for (UILabel *label in tabBarButton.subviews) {108 //        // 说明不是个Label109 //        if (![label isKindOfClass:[UILabel class]]) continue;110 //111 //        // 设置字体112 //        label.font = [UIFont systemFontOfSize:10];113 //        if (selectedIndex == index) { // 说明这个Button选中, 设置label颜色为橙色114 //            label.textColor = [UIColor orangeColor];115 //        } else { // 说明这个Button没有选中, 设置label颜色为黑色116 //            label.textColor = [UIColor blackColor];117 //        }118 //    }119 //}120 121 /**122  *  设置某个按钮的frame123  *124  *  @param tabBarButton 需要设置的按钮125  *  @param index        按钮所在的索引126  */127 - (void)setupTabBarButtonFrame:(UIView *)tabBarButton atIndex:(int)index128 {129     // 计算button的尺寸130     CGFloat buttonW = self.width / (self.items.count + 1);131     CGFloat buttonH = self.height;132     133     tabBarButton.width = buttonW;134     tabBarButton.height = buttonH;135     if (index >= 2) {136         tabBarButton.x = buttonW * (index + 1);137     } else {138         tabBarButton.x = buttonW * index;139     }140     tabBarButton.y = 0;141 }142 @end

复制代码

  YYTabBarViewController.m文件

复制代码

  1 //  2 //  YYTabBarViewController.m  3 //  4   5 #import "YYTabBarViewController.h"  6 #import "YYHomeTableViewController.h"  7 #import "YYDiscoverViewController.h"  8 #import "YYMessageViewController.h"  9 #import "YYProfileViewController.h" 10 #import "UIImage+Extension.h" 11 #import "YYNavigationViewController.h" 12 #import "YYTabBar.h" 13  14 @interface YYTabBarViewController ()<UITabBarControllerDelegate> 15  16 @end 17  18 @implementation YYTabBarViewController 19  20  21 - (void)viewDidLoad 22 { 23     [super viewDidLoad]; 24     //添加四个子控制器 25     YYHomeTableViewController *home=[[YYHomeTableViewController alloc]init]; 26     [self addOneChildVc:home title:@"首页" imageName:@"tabbar_home" selectedImageName:@"tabbar_home_selected"]; 27      28      29     YYMessageViewController *message=[[YYMessageViewController alloc]init]; 30     [self addOneChildVc:message title:@"消息" imageName:@"tabbar_message_center" selectedImageName:@"tabbar_message_center_selected"]; 31      32     YYDiscoverViewController *discover=[[YYDiscoverViewController alloc]init]; 33     [self addOneChildVc:discover title:@"发现" imageName:@"tabbar_discover" selectedImageName:@"tabbar_discover_selected"]; 34      35     YYProfileViewController *profile=[[YYProfileViewController alloc]init]; 36     [self addOneChildVc:profile title:@"我" imageName:@"tabbar_profile" selectedImageName:@"tabbar_profile_selected"]; 37      38  39     // 调整tabbar 40     YYTabBar *customTabBar = [[YYTabBar alloc] init]; 41     // 更换系统自带的tabbar 42     [self setValue:customTabBar forKeyPath:@"tabBar"]; 43      44 //    // 设置代理(监听控制器的切换, 控制器一旦切换了子控制器,就会调用代理的tabBarController:didSelectViewController:) 45 //    self.delegate = self; 46   47 } 48  49 //- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 50 //{ 51 //    // 强制重新布局子控件(内部会调用layouSubviews) 52 //    [self.tabBar setNeedsLayout]; 53 //} 54  55  56 /** 57  *  添加一个子控制器 58  * 59  *  @param childVC           子控制对象 60  *  @param title             标题 61  *  @param imageName         图标 62  *  @param selectedImageName 选中时的图标 63  */ 64 -(void)addOneChildVc:(UIViewController *)childVc title:(NSString *)title imageName:(NSString *)imageName selectedImageName:(NSString *)selectedImageName 65 { 66     //随机设置子控制器的背景颜色 67 //    childVc.view.backgroundColor=YYRandomColor; 68      69     //设置标题 70     childVc.title=title;  //相当于设置了后两者的标题 71 //    childVc.navigationItem.title=title;//设置导航栏的标题 72 //    childVc.tabBarItem.title=title;//设置tabbar上面的标题 73      74     //设置图标 75     childVc.tabBarItem.image=[UIImage imageWithName:imageName]; 76     //设置选中时的图标 77     UIImage *selectedImage=[UIImage imageWithName:selectedImageName]; 78      79     //设置tabBarItem普通状态下文字的颜色 80     NSMutableDictionary *textAttrs=[NSMutableDictionary dictionary]; 81     textAttrs[UITextAttributeTextColor]=[UIColor blackColor]; 82     textAttrs[UITextAttributeFont]=[UIFont systemFontOfSize:10]; 83     [childVc.tabBarItem setTitleTextAttributes:textAttrs forState:UIControlStateNormal]; 84      85     //设置tabBarItem普通状态下文字的颜色 86     NSMutableDictionary *selectedtextAttrs=[NSMutableDictionary dictionary]; 87     selectedtextAttrs[UITextAttributeTextColor]=[UIColor orangeColor]; 88     [childVc.tabBarItem setTitleTextAttributes:selectedtextAttrs forState:UIControlStateSelected]; 89      90     if (iOS7) { 91         // 声明这张图片用原图(别渲染) 92         selectedImage = [selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 93     } 94     childVc.tabBarItem.selectedImage = selectedImage; 95      96      // 添加为tabbar控制器的子控制器 97     YYNavigationViewController *nav=[[YYNavigationViewController alloc]initWithRootViewController:childVc]; 98      99     [self addChildViewController:nav];100 101 }102 103 104 // 在iOS7中, 会对selectedImage的图片进行再次渲染为蓝色105 // 要想显示原图, 就必须得告诉它: 不要渲染106 107 // Xcode的插件安装路径: /Users/用户名/Library/Application Support/Developer/Shared/Xcode/Plug-ins108 @end

复制代码

三、加号按钮的点击事件

使用代理方法,当点击加号按钮的时候,通知UITabBarController以模态的方式弹出控制器。

实现代码:

1.设置代理

YYTabBar.h文件

复制代码

 1 // 2 //  YYTabBar.h 3 // 4  5 #import <UIKit/UIKit.h> 6  7 @class YYTabBar; 8 @protocol YYTabBarDelegate <NSObject> 9 -(void)tabBarDidClickedPlusButton:(YYTabBar *)tabBar;10 @end11 12 @interface YYTabBar : UITabBar13 @property(nonatomic,weak)id<YYTabBarDelegate> delegate;14 @end

复制代码

YYTabBar.m文件

复制代码

  1 //  2 //  YYTabBar.m  3 //  4   5 #import "YYTabBar.h"  6   7 @interface YYTabBar()  8 @property (nonatomic, weak) UIButton *plusButton;  9 @end 10  11 @implementation YYTabBar 12  13 - (id)initWithFrame:(CGRect)frame 14 { 15     self = [super initWithFrame:frame]; 16     if (self) { 17         if (!iOS7) { 18             self.backgroundImage = [UIImage imageWithName:@"tabbar_background"]; 19         } 20         self.selectionIndicatorImage = [UIImage imageWithName:@"navigationbar_button_background"]; 21         // 添加加号按钮 22         [self setupPlusButton]; 23     } 24     return self; 25 } 26  27  28 /** 29  *  添加加号按钮 30  */ 31 - (void)setupPlusButton 32 { 33     UIButton *plusButton = [[UIButton alloc] init]; 34     // 设置背景 35     [plusButton setBackgroundImage:[UIImage imageWithName:@"tabbar_compose_button"] forState:UIControlStateNormal]; 36     [plusButton setBackgroundImage:[UIImage imageWithName:@"tabbar_compose_button_highlighted"] forState:UIControlStateHighlighted]; 37     // 设置图标 38     [plusButton setImage:[UIImage imageWithName:@"tabbar_compose_icon_add"] forState:UIControlStateNormal]; 39     [plusButton setImage:[UIImage imageWithName:@"tabbar_compose_icon_add_highlighted"] forState:UIControlStateHighlighted]; 40     [plusButton addTarget:self action:@selector(plusClick) forControlEvents:UIControlEventTouchUpInside]; 41     // 添加 42     [self addSubview:plusButton]; 43     self.plusButton = plusButton; 44 } 45  46 - (void)plusClick 47 { 48     //设置代理 49     if ([self.delegate respondsToSelector:@selector(tabBarDidClickedPlusButton:)]) { 50         [self.delegate tabBarDidClickedPlusButton:self]; 51     } 52 } 53  54 /** 55  *  布局子控件 56  */ 57 - (void)layoutSubviews 58 { 59     [super layoutSubviews]; 60      61     // 设置plusButton的frame 62     [self setupPlusButtonFrame]; 63      64     // 设置所有tabbarButton的frame 65     [self setupAllTabBarButtonsFrame]; 66 } 67  68 /** 69  *  设置所有plusButton的frame 70  */ 71 - (void)setupPlusButtonFrame 72 { 73     self.plusButton.size = self.plusButton.currentBackgroundImage.size; 74     self.plusButton.center = CGPointMake(self.width * 0.5, self.height * 0.5); 75 } 76  77 /** 78  *  设置所有tabbarButton的frame 79  */ 80 - (void)setupAllTabBarButtonsFrame 81 { 82     int index = 0; 83      84     // 遍历所有的button 85     for (UIView *tabBarButton in self.subviews) { 86         // 如果不是UITabBarButton, 直接跳过 87         if (![tabBarButton isKindOfClass:NSClassFromString(@"UITabBarButton")]) continue; 88          89         // 根据索引调整位置 90         [self setupTabBarButtonFrame:tabBarButton atIndex:index]; 91          92         // 索引增加 93         index++; 94     } 95 } 96  97  98 /** 99  *  设置某个按钮的frame100  *101  *  @param tabBarButton 需要设置的按钮102  *  @param index        按钮所在的索引103  */104 - (void)setupTabBarButtonFrame:(UIView *)tabBarButton atIndex:(int)index105 {106     // 计算button的尺寸107     CGFloat buttonW = self.width / (self.items.count + 1);108     CGFloat buttonH = self.height;109     110     tabBarButton.width = buttonW;111     tabBarButton.height = buttonH;112     if (index >= 2) {113         tabBarButton.x = buttonW * (index + 1);114     } else {115         tabBarButton.x = buttonW * index;116     }117     tabBarButton.y = 0;118 }119 @end

复制代码

2.新建一个发送消息的控制器,其继承自UIViewController

YYComposeViewController.m文件

复制代码

 1 // 2 //  YYComposeViewController.m 3 // 4  5 #import "YYComposeViewController.h" 6  7 @interface YYComposeViewController () 8  9 @end10 11 @implementation YYComposeViewController12 13 14 - (void)viewDidLoad15 {16     [super viewDidLoad];17     self.title=@"发消息";18     self.view.backgroundColor=[UIColor yellowColor];19     self.navigationItem.leftBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"取消" style:UIBarButtonItemStyleBordered target:self action:@selector(cancel)];20     self.navigationItem.rightBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"发送" style:UIBarButtonItemStyleBordered target:self action:@selector(send)];21     self.navigationItem.rightBarButtonItem.enabled=NO;22 }23 24 -(void)send25 {26     YYLog(@"发送----");27 }28 29 -(void)cancel30 {31     [self dismissViewControllerAnimated:YES completion:nil];32 }33 @end

复制代码

3.实现代理方法,监听加号按钮的点击事件

YYTabBarViewController.m文件

复制代码

  1 //  2 //  YYTabBarViewController.m  3 //  4   5 #import "YYTabBarViewController.h"  6 #import "YYHomeTableViewController.h"  7 #import "YYDiscoverViewController.h"  8 #import "YYMessageViewController.h"  9 #import "YYProfileViewController.h" 10 #import "UIImage+Extension.h" 11 #import "YYNavigationViewController.h" 12 #import "YYTabBar.h" 13 #import "YYComposeViewController.h" 14  15 @interface YYTabBarViewController ()<UITabBarControllerDelegate,YYTabBarDelegate> 16  17 @end 18  19 @implementation YYTabBarViewController 20  21  22 - (void)viewDidLoad 23 { 24     [super viewDidLoad]; 25     //添加四个子控制器 26     [self addAllChildVcs]; 27  28     // 调整tabbar 29     [self addCustomTabBar]; 30 } 31  32 -(void)addAllChildVcs 33 { 34     YYHomeTableViewController *home=[[YYHomeTableViewController alloc]init]; 35     [self addOneChildVc:home title:@"首页" imageName:@"tabbar_home" selectedImageName:@"tabbar_home_selected"]; 36      37      38     YYMessageViewController *message=[[YYMessageViewController alloc]init]; 39     [self addOneChildVc:message title:@"消息" imageName:@"tabbar_message_center" selectedImageName:@"tabbar_message_center_selected"]; 40      41     YYDiscoverViewController *discover=[[YYDiscoverViewController alloc]init]; 42     [self addOneChildVc:discover title:@"发现" imageName:@"tabbar_discover" selectedImageName:@"tabbar_discover_selected"]; 43      44     YYProfileViewController *profile=[[YYProfileViewController alloc]init]; 45     [self addOneChildVc:profile title:@"我" imageName:@"tabbar_profile" selectedImageName:@"tabbar_profile_selected"]; 46 } 47  48 -(void)addCustomTabBar 49 { 50     YYTabBar *customTabBar = [[YYTabBar alloc] init]; 51     //设置代理 52     customTabBar.delegate=self; 53     // 更换系统自带的tabbar 54     [self setValue:customTabBar forKeyPath:@"tabBar"]; 55 } 56  57  58 #pragma mark-YYTabBarDelegate 59 -(void)tabBarDidClickedPlusButton:(YYTabBar *)tabBar 60 { 61     //弹出发微博的控制器 62     YYComposeViewController *compose=[[YYComposeViewController alloc]init]; 63     YYNavigationViewController *nav=[[YYNavigationViewController alloc]initWithRootViewController:compose]; 64     [self presentViewController:nav animated:YES completion:nil]; 65 } 66  67  68 /** 69  *  添加一个子控制器 70  * 71  *  @param childVC           子控制对象 72  *  @param title             标题 73  *  @param imageName         图标 74  *  @param selectedImageName 选中时的图标 75  */ 76 -(void)addOneChildVc:(UIViewController *)childVc title:(NSString *)title imageName:(NSString *)imageName selectedImageName:(NSString *)selectedImageName 77 { 78     //随机设置子控制器的背景颜色 79 //    childVc.view.backgroundColor=YYRandomColor; 80      81     //设置标题 82     childVc.title=title;  //相当于设置了后两者的标题 83  84      85     //设置图标 86     childVc.tabBarItem.image=[UIImage imageWithName:imageName]; 87     //设置选中时的图标 88     UIImage *selectedImage=[UIImage imageWithName:selectedImageName]; 89      90     //设置tabBarItem普通状态下文字的颜色 91     NSMutableDictionary *textAttrs=[NSMutableDictionary dictionary]; 92     textAttrs[UITextAttributeTextColor]=[UIColor blackColor]; 93     textAttrs[UITextAttributeFont]=[UIFont systemFontOfSize:10]; 94     [childVc.tabBarItem setTitleTextAttributes:textAttrs forState:UIControlStateNormal]; 95      96     //设置tabBarItem普通状态下文字的颜色 97     NSMutableDictionary *selectedtextAttrs=[NSMutableDictionary dictionary]; 98     selectedtextAttrs[UITextAttributeTextColor]=[UIColor orangeColor]; 99     [childVc.tabBarItem setTitleTextAttributes:selectedtextAttrs forState:UIControlStateSelected];100     101     if (iOS7) {102         // 声明这张图片用原图(别渲染)103         selectedImage = [selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];104     }105     childVc.tabBarItem.selectedImage = selectedImage;106     107      // 添加为tabbar控制器的子控制器108     YYNavigationViewController *nav=[[YYNavigationViewController alloc]initWithRootViewController:childVc];109     110     [self addChildViewController:nav];111 112 }113 114 @end

复制代码

4.实现效果

自定义UITabBar     自定义UITabBar


你可能感兴趣的:(自定义UITabBar)