自定义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
时间: 2024-11-11 22:53:55

自定义tarBar的相关文章

ios NavBar+TarBar技巧

NavBar+TarBar iphone开发 NavBar+TarBar 1  改变NavBar颜色:选中Navigation Bar 的Tint属性.选中颜色. 2  隐藏“back”按钮: self.navigationItem.hidesBackButton = YES; 3 隐藏"NavBar" : self.navigationController.navigationBarHidden = YES; 4 可以不用MainWindow.xib创建的Navigation.在每个

ios开发之NavBar和TarBar使用技巧

1  改变NavBar颜色:选中Navigation Bar 的Tint属性.选中颜色. 2  隐藏“back”按钮: self.navigationItem.hidesBackButton = YES; 3 隐藏"NavBar" : self.navigationController.navigationBarHidden = YES; 4 可以不用MainWindow.xib创建的Navigation.在每个view上自定义. 需要把每个控制页都加上以下代码来隐藏nav: -(vo

iOS快速自定义UITabBarController内的tabbar控件

思路:1.定义一个BaseTabBarViewController类继承自UITabBarController 2.将原先的tabbar隐藏,自定义一个控件覆盖在上面 3.在控件内增加可以点击的按钮,调整控件和按钮的具体细节 具体代码如下:.h里#import <UIKit/UIKit.h>#import "FirstViewController.h"#import "SecondViewController.h"#import "ThirdV

微信小程序如何实现自定义tabBar

小程序开发现在非常火,但是对于后台来说如何做到自定义tabBar呢?下面就来讲解下,如何实现微信小程序登录后根据用户身份权限不同跳转到不同的页面问题.首先需要解决的是:你要把底部导航做成一个公共模板template.wxml中代码:<template name="tabBar"> <view class="tab-bar" style="color: {{tabBar.color}}; background: {{tarBar.backg

小程序自定义底部导航

这个方法比较简单,虽然有一些延迟,但也算是解决了一半自定义的问题. 首先在pages同级目录下创建tabbar.wxml文件, <template name="tabBar"> <view class="tab-bar" style="color: {{tabBar.color}}; background: {{tarBar.backgroundColor}}; {{tabBar.position=='top'? 'top: 0' : '

微信小程序自定义tabBar和遇到的一些问题

第一步 在app.json文件找到“tarBar”对象,然后添加一个属性,代码如下: "tabBar": { "custom": true, //添加这个属性 "color": "#707070", "selectedColor": "#00c4cc", "list": [ { "pagePath": "pages/home/index&

Linux centos下让alias自定义永久生效(+常用的别名)

alias可以简化一些复杂的命令串,使一个单词或简化后的命令即可实现复杂(通常是带很多参数的长串)命令. 基本用法: alias 简化命令='实际的长串命令'    //实际长串命令通常为'原命令 -/选项参数' eg. alias ll='ls -a' 获取别名: alias        //即可查看当前设定的所有alias别名 取消别名: unalias 简化命令 eg. unalias ll            //取消ll的别名 永久生效: 直接使用alias命令定义的别名,重启后就

MVC4 自定义错误页面(三)

一.概述 MVC4框架自带了定义错误页,该页面位于Shared/Error,该页面能够显示系统未能捕获的异常,如何才能使用该页面: 二.使用步骤: 1.配置WebConfig文件,在System.Web节点下加上 <customErrors mode="On"  defaultRedirect="~/Shared/Error" /> 翻阅一些大神写的博客,在他们的博客中指出defaultRedirect是指向错误页面的URL,可是经过本人测试的时候,发现

自定义及发布一个webservice服务

自定义及发布一个webservice服务    - 声明 某个业务服务为webservice服务       通过@webservice 注解来声明    - 发布webservice服务       Endpoint.publish()发布 (默认对public修饰的方法进行发布)    - 通过wsimport生成本地代理来访问自己发布的webservice       wsimport 1.发布自定义webservice phone.java package ws.myWebService