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