使用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];

    }

头文件:

 //
// XBTabBar.h
// XibaTest
//
// Created by bos on 15-6-20.
// Copyright (c) 2015年 axiba. All rights reserved.
// #import <UIKit/UIKit.h> @class XBTabBar; //1、因为XBtabBar继承自UITarBar,所以如果想建立自己的代理,也需要实现UITaBar的代理协议UITabBarDelegate
@protocol XBTabBarDelegate <UITabBarDelegate> //2、设置可选的代理方法
@optional
-(void)tabBarDidClickButton:(XBTabBar *)tarBar; @end @interface XBTabBar : UITabBar //3、将协议作为一个属性放出来(代理弱指针)
@property (nonatomic,weak) id<XBTabBarDelegate> delegate; @end

代码文件:

 //
// XBTabBar.m
// XibaTest
//
// Created by bos on 15-6-20.
// Copyright (c) 2015年 axiba. All rights reserved.
// #import "XBTabBar.h" @interface XBTabBar()
@property (nonatomic,weak) UIButton *composeBtn;
@end @implementation XBTabBar -(instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) { //添加一个按钮到tabBar中
UIButton *composeBtn = [[UIButton alloc]init];
[composeBtn setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button"] forState:UIControlStateNormal];
[composeBtn setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button_highlighted"] forState:UIControlStateHighlighted]; [composeBtn setImage:[UIImage imageNamed:@"tabbar_compose_icon_add"] forState:UIControlStateNormal];
[composeBtn setImage:[UIImage imageNamed:@"tabbar_compose_icon_add_highlighted"] forState:UIControlStateHighlighted];
composeBtn.size = composeBtn.currentBackgroundImage.size;
[composeBtn addTarget:self action:@selector(plusClick) forControlEvents:UIControlEventTouchUpInside];
[self addSubview: composeBtn]; self.composeBtn = composeBtn;
}
return self;
} -(void)plusClick
{
//在这里点击如果想弹出一个控制器,通过present是不行的,因为只能通过一个控制器去modal一个新的控制器
//所以只能采用代理的方式,在调用这个XBTabBar 的时候告诉他有一个点击事件,让他代替我们去点击弹出
XBLog(@""); //先判断是否存在对应的代理方法,然后执行代理的方法
if ([self.delegate respondsToSelector:@selector(tabBarDidClickButton:)])
{
[self.delegate tabBarDidClickButton:self];
}
} -(void)layoutSubviews
{
[super layoutSubviews]; //1、新增加的中间的按钮
self.composeBtn.centerX = self.width *0.5;
self.composeBtn.centerY = self.height *0.5; //2、设置其他tabbarButton的尺寸和位置 CGFloat tabBarButtonW = self.width / ;
CGFloat tabBarButtonIndex = ;
for (UIView *childV in self.subviews)
{
//先判断是不是UITabBarButton的子控件(打印tarBar的子控件会发现还有其他两个子控件)
Class class = NSClassFromString(@"UITabBarButton");
if ([childV isKindOfClass:class]) { //重新设置TabBarButton子控件的宽度和X值(X值根据索引来定位值)
childV.width = tabBarButtonW;
childV.x = tabBarButtonIndex * tabBarButtonW; //增加索引,如果是第三个位置则跳过空一个位置给上面的Button
tabBarButtonIndex++;
if (tabBarButtonIndex == ) {
tabBarButtonIndex++;
}
}
}
} @end

自定义tarBar的更多相关文章

  1. uniapp 小程序实现自定义底部导航栏(tarbar)

    在小程序开发中,默认底部导航栏很难满足实际需求,好在官方给出了自定义形式,效果如下: 话不多说,直接上代码 1.组件 custom-tarbar.vue文件 <template> < ...

  2. 自定义tabBar

    ★★★★自定义tabBar★★★★★★★ Demo下载地址:https://github.com/marlonxlj/tabBarCustom.git 前言: 有的时候需求要对tabBar进行自定义的 ...

  3. ios开发之NavBar和TarBar使用技巧

    1  改变NavBar颜色:选中Navigation Bar 的Tint属性.选中颜色. 2  隐藏“back”按钮: self.navigationItem.hidesBackButton = YE ...

  4. ios NavBar+TarBar技巧

    NavBar+TarBar iphone开发 NavBar+TarBar 1  改变NavBar颜色:选中Navigation Bar 的Tint属性.选中颜色. 2  隐藏“back”按钮: sel ...

  5. QT下自定义QQ聊天窗口tab控件

    1.用继承pushbutton派生类来实现tab按钮,里面加一个QPushbutton关闭按钮:(自定义类:CCustomTabButton) 2.多个tab按钮用QHboxLayout做容器: 3. ...

  6. 小程序学习(冒泡,快速创建文件,以及tarbar)

    1.关于小程序的事件冒泡机制 例如: <view catchtap="opp"> <text>当前内容</text> </view> ...

  7. 【小程序】小程序开发自定义组件的步骤>>>>>>>>>小程序开发过程中报错:jsEnginScriptError

    报错:jsEnginScriptError VM6342: jsEnginScriptError Component is not found in path "component/spac ...

  8. 小程序自定义tabBar,动态控制tabBar

    最近做项目的时候,突然来了个小特殊的需求,根据客户的类型来动态显示底部的tabBar菜单.当时我就有点小懵逼了,这个不是小程序自带的组件么?还要做成动态?这就有点尴尬了..... 不过也只是一时尴尬而 ...

  9. 07vue 自定义全局组件 通用流程

    1.全局组件的目录 2.loading/index.js import LoadingComp from './Loaiding' const compName=LoadingComp.name // ...

随机推荐

  1. Bootstrap——网站添加字体图标

    @font-face { font-family: 'itcast'; src: url('../font/MiFie-Web-Font.eot') format('embedded-opentype ...

  2. logback -- 配置详解 -- 二 -- <appender>

    附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...

  3. jackson 转换 enum 类型

    REST API 接口要求 requster json 的 lifeCycle 域只能填 YOUNG, OLD,对于其他的 lifeCycle,都要给 requester 返回 bad request ...

  4. NetBpm XML解读(5)

    原文: nPdl的翻译 在看NetBPM的nPdl文档时做了个翻译,一来是让自己能更好的理解nPdl,二来是希望能得到关心NetBPM的同志的指导.    由于对工作流不熟悉,所以有不少术语翻译没有把 ...

  5. C#(少用的)

    挖一挖C#中那些我们不常用的东西之系列(1)——ToDictionary,ToLookup 挖一挖C#中那些我们不常用的东西之系列(2)——IsXXX 系列方法 挖一挖C#中那些我们不常用的东西之系列 ...

  6. ssh事务回滚,纪念这几个月困扰已久的心酸

    以前的事务采用的是JTA,xml注入的方式.本人就着开发要优雅合理利用轮子的态度,一直不满意JTA式的申明和切入方式. spring的注解方式多优雅,可是万恶的直到项目快要上线时终于找到了注解式不能回 ...

  7. IDEA maven项目下测试mybatis例子,使用mappper class或package引入mapper映射文件,总是报错Invalid bound statement(所有配置完全正确)

    困扰几个小时,终于查到解决办法及原因(可以直接到最后看解决方案) 环境就是用IDEA搭建的maven项目,主要jar包引入配置如下 <dependencies> <dependenc ...

  8. LR 测试http协议xml格式数据接口

    Action() { lr_start_transaction("T1"); web_custom_request("xxxxHTTPRequest", &qu ...

  9. 重命名和重定向RF执行生成的output文件

    命令: pybot -d output文件保存路径 -o output文件重命名 -d --outputdir dir Where to create output files. The defaul ...

  10. Nginx(九)-- Nginx实际使用配置

    1.由于在nginx中需要配置很多东西,就会使得nginx.conf配置文件过于臃肿,所以我们会将配置文件合理的切分.大体的配置依然在nginx.conf中,其他的配置会放在etc下面的目录中. 2. ...