知识点一览:
①TabBarController中通过设置selectedIndex来完成子控件的切换
②自定义UIButon,重写 setHighLighted可以在多次点击按钮时候不会重新设置高亮
③重写UITabBar的layOutSubViews可以设置控件的内部的元素的布局。
④UIControllEventTouchDown 按钮只要点击就触发事件。
重点:
⑤代理实现子Controller的切换
代码实现:
①MRBUtton:
- #import "MRButton.h"
- @implementation MRButton
- - (void)setHighlighted:(BOOL)highlighted
- {
- //[super setHighlighted:YES];
- }
- @end
----------------------------------------------MRTabBar.h--------------------------------------------
- #import <UIKit/UIKit.h>
- @class MRTabBar;
- //①设置协议的具体内容
- @protocol MRTabBarDelegate <NSObject>
- - (void)tabBar:(MRTabBar*)tabBar didSelectItemFrom:(int)from to:(int)to;
- @end
- @interface MRTabBar : UITabBar
- @property (nonatomic,weak) UIButton *button;
- //②甲方在协议上签名
- @property (nonatomic,weak) id<MRTabBarDelegate> delegate;
- @end
------------------------------------------------MRTabBar.m--------------------------------------------
- #import "MRTabBar.h"
- #import "MRButton.h"
- @implementation MRTabBar
- - (instancetype)initWithFrame:(CGRect)frame
- {
- // [super initWithFrame:frame];
- if (self = [super initWithFrame:frame]) {
- for (int i = 0; i < 5; i++) {
- //1.创建一个按钮
- MRButton *button = [MRButton buttonWithType:UIButtonTypeCustom];
- //2.设置按钮正常显示的图片
- NSString *strImage = [NSString stringWithFormat:@"TabBar%d",i+1];
- UIImage *image = [UIImage imageNamed:strImage];
- [button setImage:image forState:UIControlStateNormal];
- //3.设置按钮被选中的时候显示的图片
- NSString *strImageSel = [NSString stringWithFormat:@"TabBar%dSel",i+1];
- UIImage *imagehighLSel = [UIImage imageNamed:strImageSel];
- [button setImage:imagehighLSel forState:UIControlStateSelected];
- //4.设置按钮的frame
- CGFloat width = self.frame.size.width*0.2;
- CGFloat height = self.frame.size.height;
- CGFloat xPos = i*width;
- CGFloat yPos = 0;
- [button setFrame:CGRectMake(xPos, yPos, width, height)];
- //5.设置按钮的Target
- [button addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchDown];
- //6.设置按钮的tag
- [button setTag:i];
- //button.adjustsImageWhenDisabled = YES;
- //7.添加按钮到Tabbar
- [self addSubview:button];
- if (i == 0) {
- [self click:button];
- }
- }
- }
- return self;
- }
- -(void)click:(UIButton*)button
- {
- //③告诉乙方协议中要求做的事情
- if ([self.delegate respondsToSelector:@selector(tabBar:didSelectItemFrom:to:)]) {
- [self.delegate tabBar:self didSelectItemFrom:self.button.tag to:button.tag];
- }
- //1.设置当前按钮不被选中
- self.button.selected =NO;
- //2.新点击的按钮被选中
- button.selected = YES;
- //3.把新点击的按钮设置为当前按钮
- self.button = button;
- //4.切换子控制器
- //self.selectedIndex = button.tag;
- //self.button.tag = button.tag;
- }
- /*
- // Only override drawRect: if you perform custom drawing.
- // An empty implementation adversely affects performance during animation.
- - (void)drawRect:(CGRect)rect {
- // Drawing code
- }
- */
- @end
MRTabBarViewController.m
- #import "MRTabBarViewController.h"
- #import "MRButton.h"
- #import "MRTabBar.h"
- @interface MRTabBarViewController ()<MRTabBarDelegate>//④乙方拿到协议
- @property (nonatomic,weak) UIButton* button;
- @end
- @implementation MRTabBarViewController
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- //1.清除原有的TabBar
- [self.tabBar removeFromSuperview];
- //2.生成一个新的TabBar
- MRTabBar *mrTabBar = [[MRTabBar alloc]initWithFrame:self.tabBar.frame];
- [mrTabBar setBackgroundColor:[UIColor redColor]];
- //⑤表示接受甲方TabBar的协议,乙方签名
- mrTabBar.delegate = self;
- //3.将Tabbar添加到View中
- [self.view addSubview:mrTabBar];
- // self.selectedIndex =mrTabBar.button.tag;
- }
- //⑥实现TabBar的协议中的方法
- - (void)tabBar:(MRTabBar*)tabBar didSelectItemFrom:(int)from to:(int)to
- {
- self.selectedIndex = to;
- }
- @end