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 // 說明不是個Label 105 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 * 設置某個按鈕的frame 119 * 120 * @param tabBarButton 需要設置的按鈕 121 * @param index 按鈕所在的索引 122 */ 123 - (void)setupTabBarButtonFrame:(UIView *)tabBarButton atIndex:(int)index 124 { 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 @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 customTabBar.backgroundImage = [UIImage imageWithName:@"tabbar_background"]; 42 customTabBar.selectionIndicatorImage = [UIImage imageWithName:@"navigationbar_button_background"]; 43 // 更換系統自帶的tabbar 44 [self setValue:customTabBar forKeyPath:@"tabBar"]; 45 46 // 設置代理(監聽控制器的切換, 控制器一旦切換了子控制器,就會調用代理的tabBarController:didSelectViewController:) 47 self.delegate = self; 48 49 } 50 51 - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 52 { 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 *)selectedImageName 66 { 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-ins 99 @end 復制代碼 實現效果(iOS7中) 關鍵代碼:更換系統自帶的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)index 103 //{ 104 // // 選中按鈕的索引 105 // int selectedIndex = [self.items indexOfObject:self.selectedItem]; 106 // 107 // for (UILabel *label in tabBarButton.subviews) { 108 // // 說明不是個Label 109 // 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 * 設置某個按鈕的frame 123 * 124 * @param tabBarButton 需要設置的按鈕 125 * @param index 按鈕所在的索引 126 */ 127 - (void)setupTabBarButtonFrame:(UIView *)tabBarButton atIndex:(int)index 128 { 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-ins 108 @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 @end 11 12 @interface YYTabBar : UITabBar 13 @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 * 設置某個按鈕的frame 100 * 101 * @param tabBarButton 需要設置的按鈕 102 * @param index 按鈕所在的索引 103 */ 104 - (void)setupTabBarButtonFrame:(UIView *)tabBarButton atIndex:(int)index 105 { 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 @end 10 11 @implementation YYComposeViewController 12 13 14 - (void)viewDidLoad 15 { 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)send 25 { 26 YYLog(@"發送----"); 27 } 28 29 -(void)cancel 30 { 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