自定义tabBar详解第二种方案

自定义tabBar能够解决自定义图片无法显示(只显示一块颜色)这个弊端,自定义tabBar要继承UITabBarController

原图片:

(1),  (2), (3),  (4), (5)

下面是自定义了一个TabBar ,每个按钮可以显示图片(自定义避免了图片无法显示只显示一块颜色)

效果图:

代码实现:

一, 首先创建一个继承UIButton的类CustomTabBar,

在.h文件中:

//指定协议是为了实现点击button显示相应地页面,像系统的tabBar一样

@protocol CustomTabBarDelegate <NSObject>

-(void)didSelectBarItemAtIndex:(NSInteger)index;

@end

@interface CustomTabBar : UIButton
@property(nonatomic,assign) NSInteger index;
@property (nonatomic,retain) id<CustomTabBarDelegate> delegate;
- (id)initWithFrame:(CGRect)frame WithImage:(UIImage *)image AndSelectedImage:(UIImage *)image;
@end

在.m文件中

#import "CustomTabBar.h"

@interface CustomTabBar ()

@end
@implementation CustomTabBar

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code

}
    return self;
}

- (id)initWithFrame:(CGRect)frame WithImage:(UIImage *)image AndSelectedImage:(UIImage *)selectedImage{
    self = [super initWithFrame:frame];
    if (self) {
        self.frame = frame;
        [self setAdjustsImageWhenHighlighted:NO];
        [self setImage:image forState:UIControlStateNormal];
        [self setImage:selectedImage forState:UIControlStateSelected];
        [self addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];
    }
    return self;
}

-(void)click:(UIButton *)btn{
    if ([self.delegate respondsToSelector:@selector(didSelectBarItemAtIndex:)]) {
        [self.delegate didSelectBarItemAtIndex:self.index];
    }
    switch ((int)(btn.selected)) {
        case 0:
            btn.selected = YES;
            break;
        case 1:
            btn.selected = NO;
            break;
        default:
            break;
    }
}

@end

二, 创建一个类CustomizedTabBarController继承UITabBarController

在.m文件中

- (void)loadViewController
{
    CoverCollectionViewController *coverVC = [[CoverCollectionViewController alloc] init];
    //coverVC.title = @"每日封面";
    CustomizedNavigationController *coverNaVC = [[CustomizedNavigationController alloc] initWithRootViewController:coverVC];
    coverNaVC.navigationItem.title = @"iDailyWATCh";
    
    NewsTableViewController *newsVC = [[NewsTableViewController alloc] init];
    //newsVC.title = @"腕表杂志";
    CustomizedNavigationController *newsNaVC = [[CustomizedNavigationController alloc] initWithRootViewController:newsVC];
    
    BrandsTableViewController *brandsVC = [[BrandsTableViewController alloc] init];
    //brandsVC.title = @"品牌维基";
    CustomizedNavigationController *brandsNaVC = [[CustomizedNavigationController alloc] initWithRootViewController:brandsVC];
    
    VideosCollectionViewController *videosVC = [[VideosCollectionViewController alloc] init];
    //videosVC.title = @"视频";
    CustomizedNavigationController *videosNaVC = [[CustomizedNavigationController alloc] initWithRootViewController:videosVC];
    
    MoreViewController *moreVC = [[MoreViewController alloc] init];
    //moreVC.title = @"更多";
    CustomizedNavigationController *moreNaVC = [[CustomizedNavigationController alloc] initWithRootViewController:moreVC];
    
    self.viewControllers = @[coverNaVC, newsNaVC, brandsNaVC, videosNaVC, moreNaVC];
    self.selectedIndex = 0;
    RELEASE_SAFE(coverNaVC);
    RELEASE_SAFE(coverVC);
    RELEASE_SAFE(brandsNaVC);
    RELEASE_SAFE(brandsVC);
    RELEASE_SAFE(videosNaVC);
    RELEASE_SAFE(videosVC);
    RELEASE_SAFE(moreNaVC);
    RELEASE_SAFE(moreVC);
}

- (void)setupTabBar
{
    for (int i = 0 ; i < 5; i++) {
        if (i < 3) {
           
CustomTabBar *bar = [[CustomTabBar alloc]initWithFrame:CGRectMake(0 +
80 * i, 0, 80, 49) WithImage: [UIImage imageNamed:[NSString
stringWithFormat:@"%d", i + 100]]AndSelectedImage:[UIImage
imageNamed:[NSString stringWithFormat:@"%d", i + 130]]];
            bar.index = i;
            bar.delegate = self;
            bar.backgroundColor = RGB(245, 245, 245);
            [self.tabBar addSubview:bar];
            [bar release];
            if (i == 0) {
                bar.selected = YES;
            }
        } else {
           
CustomTabBar *bar = [[CustomTabBar alloc]initWithFrame:CGRectMake(0 +
40 * (i + 3), 0, 40, 49) WithImage: [UIImage imageNamed:[NSString
stringWithFormat:@"%d", i + 100]]AndSelectedImage:[UIImage
imageNamed:[NSString stringWithFormat:@"%d", i + 130]]];
            bar.index = i;
            bar.delegate = self;
            bar.backgroundColor = RGB(245, 245, 245);
            [self.tabBar addSubview:bar];
            [bar release];
        }
    }
}

-(void)didSelectBarItemAtIndex:(NSInteger)index{
    [self resignBatState];
    self.selectedViewController = self.viewControllers[index];
}
-(void)resignBatState{
    NSArray *arr = [self.tabBar subviews];
    for (CustomTabBar *bar in arr) {
        if ([bar isKindOfClass:[CustomTabBar class]]) {
            bar.selected = NO;
        }
    }
}

- (void)changeViewController:(UIButton *)button
{
    self.selectedIndex = button.tag;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

时间: 2024-10-09 08:55:15

自定义tabBar详解第二种方案的相关文章

(转)Excel自定义格式详解

”G/通用格式”:以常规的数字显示,相当于”分类”列表中的”常规”选项.例:代码:”G/通用格式”.10显示为10:10.1显示为10.1. 2. “#”:数字占位符.只显有意义的零而不显示无意义的零.小数点后数字如大于”#”的数量,则按”#”的位数四舍五入.例:代码:”###.##”,12.1显示为12.10;12.1263显示为:12.13 3.”0”:数字占位符.如果单元格的内容大于占位符,则显示实际数字,如果小于点位符的数量,则用0补足.例:代码:”00000”.1234567显示为12

JAVA: httpclient 详解——第二章;

相对于httpurlconnection ,httpclient更加丰富,也更加强大,其中apache有两个项目都是httpclient,一个是commonts包下的,这个是通用的,更专业的是org.apache.http.包下的,所以我一般用后者: httpclient可以处理长连接,保存会话,重连接,以及请求过滤器,连接重用等等... 下面是测试代码(全部总结来自官方文档,以及翻译) 须要下载核心包:httpclient-4.3.4.jar ,也可在官网下载:http://hc.apache

自定义View详解

自定义View详解 虽然之前也分析过View回执过程,但是如果让我自己集成ViewGroup然后自己重新onMeasure,onLayout,onDraw方法自定义View我还是会头疼.今天索性来系统的学习下. onMeasure /** * <p> * Measure the view and its content to determine the measured width and the * measured height. This method is invoked by {@l

前端技术之_CSS详解第二天

前端技术之_CSS详解第二天 1.css基础选择器 html负责结构,css负责样式,js负责行为. css写在head标签里面,容器style标签. 先写选择器,然后写大括号,大括号里面是样式. <style type="text/css"> body{ background-color: pink; } </style> 常见属性: h1{ color:blue; font-size: 60px; font-weight: normal; text-deco

16位汇编第六讲汇编指令详解第二讲

16位汇编第六讲汇编指令详解第二讲 1.比较指令 CMP指令 1.CMP指令是将目的操作数减去源操作数,按照定义相应的设置状态标志 2.CMP指令执行的功能与SUB指令(相减指令)一样,但是不同的是CMP指令之根据结果设置标志位 而不修改值 可以操作的指令格式 CMP reg,imm/reg/mem CMP mem,imm/reg 上面是CMP指令的语法,具体的也可以查询帮助文档,inter手册 inter手册查的办法 第一个框代表了CMP指令的所有语法 比如 reg,reg 表示可以比较寄存器

Struts1.X与Spring集成——第二种方案

上篇博客介绍了Struts1.X与Spring集成的一种方案.Struts1.X与Spring集成--第一种方案 此篇博客还以上篇博客的登录例子为例,介绍Struts1.X与Spring集成的另一种方案. 1,第一种方案 原理 回忆第一种方案集成原理:在Action中取得BeanFactory,通过BeanFactory取得业务逻辑对象 此种方案的缺点:从严格意义的分层上来看,Action上看到了Spring的相关东西,依赖Spring API去查找东西,发生了依赖查找,因为要查找依赖对象,所以

转:Windows下的PHP开发环境搭建——PHP线程安全与非线程安全、Apache版本选择,及详解五种运行模式。

原文来自于:http://www.ituring.com.cn/article/128439 Windows下的PHP开发环境搭建——PHP线程安全与非线程安全.Apache版本选择,及详解五种运行模式. 今天为在Windows下建立PHP开发环境,在考虑下载何种PHP版本时,遭遇一些让我困惑的情况,为了解决这些困惑,不出意料地牵扯出更多让我困惑的问题. 为了将这些困惑一网打尽,我花了一下午加一晚上的时间查阅了大量资料,并做了一番实验后,终于把这些困惑全都搞得清清楚楚了. 说实话,之所以花了这么

Spring+Struts集成(第二种方案)

在上一篇文章中我们了解到了第一种Spring跟Struts集成的方案,但此集成方案的不足是WEB层中知道Spring的相关内容,因为需要去主动的查找对象:BeanFactory.方案二便是通过依赖注入的方式来进行.通过Spring提供ActionProxy进行代理.去获取BeanFactory,找到Path的名称,然后找到path路径下的Action,然后完成注入. 方案二的核心:Struts的核心交给Spring来创建.Spring跟其他框架集合主要也是通过此种方式. 方案二集成框架图: sp

sas数据读取详解 四种读取数据方式以及数据指针的位置 、读取mess data的两个小工具、特殊的读取技巧、infile语句及其选项(dsd dlm missover truncover obs firstobs)、proc import、自定义缺失值

(The record length is the number of characters, including spaces, in a data line.) If your data lines are long, and it looks like SAS is not reading all your data, then use the LRECL= option in the INFILE statement to specify a record length at least