自定义tabbar标签栏

学iOS以来,感觉自定义的东西,比系统自带的要容易操作一点,可修改和执行的空间要多一点。

下面说一下用到很多的tabbar。

首先,创建一个FButton类,继承UIButton,用来规范tabbar上的按钮。

然后,创建一个RootViewController,继承UITabbarController作为根视图控制器。

废话不多说,直接上代码:

在FButton的.m文件中:

#import "FButton.h"

@implementation FButton

-(id)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        
    }
    return self;
}

#pragma mark set image in btn
-(CGRect)imageRectForContentRect:(CGRect)contentRect
{
    CGFloat imageW = contentRect.size.width;
    CGFloat imageH = contentRect.size.height * 0.65;
    
    return CGRectMake(0, 3, imageW, imageH);
}
#pragma mark set title in btn
-(CGRect)titleRectForContentRect:(CGRect)contentRect
{
    CGFloat titleY = contentRect.size.height * 0.65;
    CGFloat titleW = contentRect.size.width;
    CGFloat titleH = contentRect.size.height - titleY;
    
    return CGRectMake(0, titleY, titleW, titleH);
}

@end

在RootViewController的.h文件中:

#import <UIKit/UIKit.h>

@interface RootViewController : UITabBarController

//是否隐藏tabbar
-(void)isHiddenCustomTabbar:(BOOL)isHidden;

@end

.m文件中:

@interface RootViewController ()
{
    UIImageView * _tabbarView;    //自定义tabbar 覆盖系统自带的
    FButton * _previousBtn;       //记录上一个按钮
}

@end

@implementation RootViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //隐藏系统自带的tabbar
    self.tabBar.hidden = YES;
    
    [self creatCustomTabbarView];
}
#pragma mark - 创建自定义的tabbar
-(void)creatCustomTabbarView
{
    //tabBar标签栏的高度为49
    _tabbarView = [[UIImageView alloc]initWithFrame:CGRectMake(0, HEIGHT-49, WIDTH, 49)];
    _tabbarView.image = [UIImage imageNamed:@"tabbar"];
    _tabbarView.userInteractionEnabled = YES;
    [self.view addSubview:_tabbarView];
    
    HomeViewController * first = [[HomeViewController alloc]init];
    UINavigationController * navi1 = [[UINavigationController alloc]initWithRootViewController:first];
    ExpertViewController * second = [[ExpertViewController alloc]init];
    UINavigationController * navi2 = [[UINavigationController alloc]initWithRootViewController:second];
    HospitalViewController * third = [[HospitalViewController alloc]init];
    UINavigationController * navi3 = [[UINavigationController alloc]initWithRootViewController:third];
    CommunityViewController * fourth = [[CommunityViewController alloc]init];
    UINavigationController * navi4 = [[UINavigationController alloc]initWithRootViewController:fourth];
    MineViewController * fifth = [[MineViewController alloc]init];
    UINavigationController * navi5 = [[UINavigationController alloc]initWithRootViewController:fifth];
    
    self.viewControllers = @[navi1,navi2,navi3,navi4,navi5];

 //下边的内容,根据自己的要求,自定义实现
    NSArray * title_arr = @[@"首页",@"专家",@"医院",@"社区",@"我的"];
    NSArray * arr = @[@"home",@"doctor",@"hospital",@"community",@"mine"];
    
    for (int i=0; i<arr.count; i++) {
        [self creatButtonWithNormalName:arr[i] andSelectName:[NSString stringWithFormat:@"selected-%@",arr[i]] andTitle:title_arr[i] andIndex:i];
    }
    //设置默认选中按钮
    FButton * button = _tabbarView.subviews[0];
    [self changeViewController:button];
}
#pragma mark 创建标签栏上的按钮以及文字
- (void)creatButtonWithNormalName:(NSString *)normal andSelectName:(NSString *)selected andTitle:(NSString *)title andIndex:(int)index{
    
    FButton * customButton = [FButton buttonWithType:UIButtonTypeCustom];
    customButton.tag = index;
    
    CGFloat buttonW = _tabbarView.frame.size.width / 5;
    CGFloat buttonH = _tabbarView.frame.size.height;
    
    customButton.frame = CGRectMake(buttonW * index, 0, buttonW, buttonH);
    [customButton setImage:[UIImage imageNamed:normal] forState:UIControlStateNormal];
    [customButton setImage:[UIImage imageNamed:selected] forState:UIControlStateDisabled];
    [customButton setTitle:title forState:UIControlStateNormal];
    //按钮的点击事件
    [customButton addTarget:self action:@selector(changeViewController:) forControlEvents:UIControlEventTouchDown];
    //设置image和label的位置以及字体大小和颜色
    customButton.imageView.contentMode = UIViewContentModeCenter;
    customButton.titleLabel.textAlignment = NSTextAlignmentCenter;
    UIColor * color = UTILS_COLORRGB(0, 154, 154);
    [customButton setTitleColor: color forState:UIControlStateNormal];
    customButton.titleLabel.font = [UIFont systemFontOfSize:11];
    
    [_tabbarView addSubview:customButton];
    
}

#pragma mark 按钮被点击时调用
- (void)changeViewController:(FButton *)sender
{
    self.selectedIndex = sender.tag; //切换不同控制器的界面
    sender.enabled = NO;
    if (_previousBtn != sender) {
        _previousBtn.enabled = YES;
    }
    _previousBtn = sender;
    self.selectedViewController = self.viewControllers[sender.tag];
}
#pragma mark - 是否隐藏tabbar
-(void)isHiddenCustomTabbar:(BOOL)isHidden
{
    _tabbarView.hidden = isHidden;
}

以上都完成后,最后在appdelegate中将RootViewController 设置为根视图控制器:

  //设置tabbar的根视图控制器
    _delegate = [[RootViewController alloc]init];
    self.window.rootViewController = _delegate;

然后就可以实现了。

效果如下图所示:

希望这篇文章会对你有所帮助。

时间: 2024-11-10 01:05:58

自定义tabbar标签栏的相关文章

IOS开发-关于自定义TabBar条

今天在做项目的时候,突然有一个模块需要自定义TabBar条. 在平常很多做项目的时候,都没有去自定义过,大部分都是使用系统自带的.今天整理一个自定义TabBar条的步骤. 首先看下我们最终实现的效果: 首先需要继承UItabBar自定义一个自己的tabBar .h #import <UIKit/UIKit.h> @class THTabBar; @protocol THTabBarDelegate <UITabBarDelegate> @optional - (void)tabBa

自定义TabBar

UITabBarController是在IOS应用开发中很常用的一个类,继承于UIViewController,来实现多个视图间的切换,但很多时候系统自带的TabBar不能满足我们的需求,系统自带的一些属性我们往往无法修改,像切换项的图片的大小,这时候就需要我们自定义TabBar.例如,我们想实现下方的TabBar的这个效果,使用系统的就无法完成. 演示所需图片下载地址http://download.csdn.net/detail/zsmile123/8136531 --------------

iOS开发之功能模块--关于自定义TabBar条

只上项目中用到的代码: 1.实现重写TabBar的TabBarItem,然后在中间额外加一个按钮. 1 #import <UIKit/UIKit.h> 2 3 @interface BikeTabBar : UITabBar 4 5 @end 1 #import "BikeTabBar.h" 2 3 @interface BikeTabBar () 4 5 //@property (nonatomic,weak)UIButton *centerButton; 6 7 @en

自定义tabbar(storyBoard)

开发中系统提供的tabbar很难满足我们的项目需求,因此我们需要自定义.下面提供了一种简单自定义tabbar. 1.storyBoard中拖拽几个页面 file:///Users/dingyunfei/Desktop/屏幕快照%202015-11-30%20下午10.45.08.png 2.创建CustomViewController类代码如下 // //  CustomViewController.h //  SB框架搭建 // //  Created by 丁云飞 on 15/11/26.

仿制新浪微博iOS客户端之三-自定义TabBar

继续上一篇文章的进度,我们实际完成了微博基本框架的搭建,具体实现的效果如下左图,但我们实际需要实现的效果为右图,除去主要的页面内容不谈,仅仅下面的TabBar距离我们的需求就有相当的差距.因此本文着重于实现需要的效果.                           再简要汇总一下我们的需求: 1.我们要在TabBar原有四个按钮的基础上,再增加一个按钮,作为撰写微博的入口: 2.新加入的按钮必须和原有按钮一起,均匀分布在TabBar上: 3.新加入的按钮只有图片,没有文字. 需求汇总如上,

1行代码为每个Controller自定义“TabBar”-b

这篇文章大致会带你实现以下的功能,废话少说,先看东西: JPNavigationController.gif Q&A:Demo里都有那些东西? 01.关于自定义导航栏 01.第一个控制器的导航条是透明的,第二个控制器的导航条是白色的,第三个控制器的导航条是橙色的.所以,为每个控制器定制自己的导航条. 02.支持全屏右滑,这简直是必须的.关于全屏右滑,最详细,也最早探究这个问题的,我了解到的是 J_雨,他应该是全屏右滑的鼻祖. 03.最重要的一点,要求全屏右滑返回的时候,导航条跟随自己的控制器流畅

自定义tabBar中的注意事项

1.在自定义tabBar中,往tabBar中添加按钮的时候,默认情况下会在按钮的前面和后面添加UITabBarBackgroundView和UIImageView,导致子控件会增加两个,在自动布局中就会出现排版错误. 解决办法:让自定义的tabBar继承UIView. 2.对于tabBarItem,要想改变对象的某个属性,最好使用KVO来监听属性改变,使用的方法如下: ? 1 2 3 4 5 6 7 8 9 /**  *  监听到某个对象的属行改变了就去调用  *  *  @param keyP

iOS自定义tabbar后popToRootViewContriller和poptoviewcontroller时出现两个tabbar 的解决办法

iOS自定义tabbar后popToRootViewContriller和poptoviewcontroller时出现两个tabbar  的解决办法 问题:iOS自定义tabbar后popToRootViewContriller和poptoviewcontroller时出现两个tabbar 1.自定义代码: - (void)viewWillAppear:(BOOL)animated { [super  viewWillAppear:animated]; // 删除系统自动生成的UITabBarB

自定义tabBar在push到下一个界面的时候实现隐藏

今天工作中用到了自定义tabBar,在其中隐藏掉了系统的tabBar,用view自定义一个tabBar,效果还挺好.接下来问题来了,在我push到子页面的时候就出现了tabBar无法隐藏的问题,搞了半天终于弄好了,拿出来与大家一块分享,废话不多说,直入正题. 在自定义的TabBarController.m里写方法-(void)setHidesBottomBarWhenPushed:(BOOL)hidesBottomBarWhenPushed{    self.你自己定义的View.hidden