自定义tarBar

  使用tarBar大多数情况在我们都是默认的tarBarButton尺寸和位置但是如果我们想,希望像新浪微博那样的tarBar,就需要自定义了。

    

  1、本质上其实就是通过我们的主控制器中以KVC的方式重新构造我们新的tarBar,(http://www.cnblogs.com/daomul/p/4581717.html

    //更换系统的tabBar(KVC的形式,即使是只读的也可以修改)

      XBTabBar *tarBar = [[XBTabBar alloc]init];

      tarBar.delegate = self;//这个代理主要是针对点击事件的

      [self setValue:tarBar forKey:@"tabBar"];

  2、重新构造tarBar之后,在initWithFrame里面添加一个按钮到我们的tarBar中,由于重新添加子控件,所以会自动调用layoutSubviews方法。在layoutSubviews方法中我们重新排列对应的子控件的位置和尺寸(这里需要注意的是子控件需要判断是UITarBarButton,其中还有两个其他类型的子控件)

  3、对应的按钮的点击事件,在这里点击如果想弹出一个控制器,通过present是不行的,因为只能通过一个控制器去modal一个新的控制器,所以只能采用代理的方式,在调用这个XBTabBar 的时候告诉他有一个点击事件,让他代替我们去点击弹出。顺序是:plusClick ——>tabBarDidClickButton

    #pragma  mark -- XBTarBarDelegate代理方法(这里是对应的主控制器被调用的方法)

    -(void)tabBarDidClickButton:(XBTabBar *)tarBar

    {

        UIViewController *VC = [[UIViewController alloc]init];

        VC.view.backgroundColor = [UIColor redColor];

        [self presentViewController:VC animated:YES completion:nil];

    }

头文件:

 1 //

 2 //  XBTabBar.h

 3 //  XibaTest

 4 //

 5 //  Created by bos on 15-6-20.

 6 //  Copyright (c) 2015年 axiba. All rights reserved.

 7 //

 8 

 9 #import <UIKit/UIKit.h>

10 

11 @class XBTabBar;

12 

13 //1、因为XBtabBar继承自UITarBar,所以如果想建立自己的代理,也需要实现UITaBar的代理协议UITabBarDelegate

14 @protocol XBTabBarDelegate <UITabBarDelegate>

15 

16 //2、设置可选的代理方法

17 @optional

18 -(void)tabBarDidClickButton:(XBTabBar *)tarBar;

19 

20 @end

21 

22 @interface XBTabBar : UITabBar

23 

24 //3、将协议作为一个属性放出来(代理弱指针)

25 @property (nonatomic,weak) id<XBTabBarDelegate> delegate;

26 

27 @end

代码文件:

 1 //

 2 //  XBTabBar.m

 3 //  XibaTest

 4 //

 5 //  Created by bos on 15-6-20.

 6 //  Copyright (c) 2015年 axiba. All rights reserved.

 7 //

 8 

 9 

10 #import "XBTabBar.h"

11 

12 @interface XBTabBar()

13 @property (nonatomic,weak) UIButton *composeBtn;

14 @end

15 

16 @implementation XBTabBar

17 

18 -(instancetype)initWithFrame:(CGRect)frame

19 {

20     self = [super initWithFrame:frame];

21     if (self) {

22         

23         //添加一个按钮到tabBar中

24         UIButton *composeBtn = [[UIButton alloc]init];

25         [composeBtn setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button"] forState:UIControlStateNormal];

26         [composeBtn setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button_highlighted"] forState:UIControlStateHighlighted];

27         

28         [composeBtn setImage:[UIImage imageNamed:@"tabbar_compose_icon_add"] forState:UIControlStateNormal];

29         [composeBtn setImage:[UIImage imageNamed:@"tabbar_compose_icon_add_highlighted"] forState:UIControlStateHighlighted];

30         composeBtn.size = composeBtn.currentBackgroundImage.size;

31         [composeBtn addTarget:self action:@selector(plusClick) forControlEvents:UIControlEventTouchUpInside];

32         [self addSubview: composeBtn];

33         

34         self.composeBtn  = composeBtn;

35     }

36     return self;

37 }

38 

39 -(void)plusClick

40 {

41     //在这里点击如果想弹出一个控制器,通过present是不行的,因为只能通过一个控制器去modal一个新的控制器

42     //所以只能采用代理的方式,在调用这个XBTabBar 的时候告诉他有一个点击事件,让他代替我们去点击弹出

43     XBLog(@"11");

44     

45     //先判断是否存在对应的代理方法,然后执行代理的方法

46     if ([self.delegate respondsToSelector:@selector(tabBarDidClickButton:)])

47     {

48         [self.delegate tabBarDidClickButton:self];

49     }

50 }

51 

52 -(void)layoutSubviews

53 {

54     [super layoutSubviews];

55     

56     //1、新增加的中间的按钮

57     self.composeBtn.centerX = self.width *0.5;

58     self.composeBtn.centerY = self.height *0.5;

59     

60     //2、设置其他tabbarButton的尺寸和位置

61     

62     CGFloat tabBarButtonW = self.width / 5;

63     CGFloat tabBarButtonIndex = 0;

64     for (UIView *childV in self.subviews)

65     {

66         //先判断是不是UITabBarButton的子控件(打印tarBar的子控件会发现还有其他两个子控件)

67         Class class = NSClassFromString(@"UITabBarButton");

68         if ([childV isKindOfClass:class]) {

69             

70             //重新设置TabBarButton子控件的宽度和X值(X值根据索引来定位值)

71             childV.width = tabBarButtonW;

72             childV.x = tabBarButtonIndex * tabBarButtonW;

73             

74             //增加索引,如果是第三个位置则跳过空一个位置给上面的Button

75             tabBarButtonIndex++;

76             if (tabBarButtonIndex == 2) {

77                 tabBarButtonIndex++;

78             }

79         }

80     }

81 }

82 

83 @end

 

你可能感兴趣的:(tar)