iOS开发项目篇—27自定义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         // 说明不是个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

4.实现效果

     

iOS开发项目篇—27自定义UITabBar,布布扣,bubuko.com

时间: 2024-12-27 08:58:46

iOS开发项目篇—27自定义UITabBar的相关文章

iOS开发项目篇—28自定义UITextView

iOS开发项目篇—28自定义UITextView 一.简单说明 1.要实现的效果 2.分析 (1)UITextField 1.最多只能输入一行文字 2.能设置提醒文字(placehoder) 3.不具备滚动功能 (2)UITextView 1.能输入N行文字(N>0) 2.不能设置提醒文字(没有placehoder属性) 3.具备滚动功能 需求:技能输入多行文字,又具备文字提醒功能. 这里选择自定义一个类,让其继承自UITextView类,为其添加一个设置文字提醒的功能. 二.实现 自定义UI控

iOS开发项目篇—29自定义工具条

iOS开发项目篇—29自定义工具条 一.简单说明 1.实现效果: 2.实现思路: (1)尝试: 1 //添加子控件 2 -(void)setupTextView 3 { 4 //1.创建输入控件 5 YYTextView *textView=[[YYTextView alloc]init]; 6 //设置frame 7 textView.frame=self.view.bounds; 8 [self.view addSubview:textView]; 9 self.textView=textV

iOS开发项目篇—26修改UITabBar的系统设置

IOS开发项目篇—26修改UITabBar的系统设置 一.简单说明 1.在ios6和ios7两种系统中的现实效果 2.要求实现的效果(在ios6和ios7中基本一致) 二.UITabBar的设置和结构 1.尝试调整UITabBar 通过下面的方式,查看UITabBar内部的子控件 查看子控件继承自: 说明:UItabBarButton:继承自UIControl UIButton:继承自UIControl 打印查看每个子控件的内部结构 2.修改系统属性 注意:在ios6系统下 1 // 2 //

iOS开发项目篇—54&quot;设置&quot;界面的搭建

iOS开发项目篇—54"设置"界面的搭建 一.实现 新建一个设置控制器,当点击“我”控制器导航栏“设置”按钮时,即跳转到该界面 1.在“我”控制器中对导航栏“设置按钮”的处理 1 // 2 // YYProfileViewController.m 3 // 4 5 #import "YYProfileViewController.h" 6 #import "YYCommonGroup.h" 7 #import "YYCommonItem

iOS开发项目篇—50设置cell的背景

iOS开发项目篇—50设置cell的背景 一.简单说明 当前样式: 1.去掉分隔线 2.设置背景图片(新浪提供了四种图片,底部的图片有阴影) cell的四种背景图 问题:cell怎么知道自己当前是处在第几组的第几行? 在自定义cell中提供一个方法,共外界传递当前的组和行 YYCommonCell.h文件 1 // 2 // YYCommonCell.h 3 // 4 5 #import <Foundation/Foundation.h> 6 @class YYCommonItem; 7 @i

iOS开发项目篇—49“发现”界面完善

iOS开发项目篇—49“发现”界面完善 一.简单说明 已经完成的效果:----->目标效果        需要完善的地方: (1)子标题和标题显示在同一行上. 修改样式:UITableViewCellStyleSubtitle--->UITableViewCellStyleValue1 1 //初始化类方法 2 +(instancetype)cellWithTablView:(UITableView *)tableView 3 { 4 static NSString *ID=@"ID

iOS开发项目篇—13标题栏设置

iOS开发项目篇—13标题栏设置 一.添加标题栏 代码: 1 #import "YYHomeTableViewController.h" 2 #import "YYOneViewController.h" 3 4 @interface YYHomeTableViewController () 5 6 @end 7 8 @implementation YYHomeTableViewController 9 10 - (id)initWithStyle:(UITable

iOS开发项目篇—15菜单栏扩展

iOS开发项目篇—16菜单栏扩展 一.简单说明 在15中菜单栏的内在实现效果:         15中是通过Button来监听外部的点击,并做出响应.如果只是单纯的监听点击事件,去掉button,直接用View,给View添加一个手势识别器以监听. 二.在按钮的背后添加一个蒙版 自定义类中增加一个BOOL型的属性 1 // 2 // YYPopMenu.h 3 4 #import <UIKit/UIKit.h> 5 @class YYPopMenu; 6 7 @protocol YYPopMe

iOS开发项目篇—14点击标题按钮弹出菜单

iOS开发项目篇—14点击标题按钮弹出菜单 一.简单说明 (1)简单实现 点击标题按钮弹框,在箭头向上的时候,显示标题菜单 把ImageView添加到谁的身上?三角形的箭头在导航栏上,因此不能添加到tableview上. 分析图示: 有两个两种方法可以考虑: (1)添加到导航控制器上,因为导航栏是在导航控制器上的. (2)不用考虑控制器,直接添加到窗口上. 拿到窗口 (1)self.view.window这个属性谨慎使用,当开始加载的时候,为空 (2)获取主窗口  [UIApplication