两种方式自定义标签工具栏

在AppDelegate.m中设置根视图控制器

MainTabbarController.h

@interface MainTabbarController : UITabBarController
{
    UIImageView *_selectedImg;
    UIView *_tabbarView;
}

- (void)showtabbar:(BOOL)show;

MainTabbarController.m

#import "MainTabbarController.h"
#import "BaseNavgationController.h"
#import "HomeViewController.h"
#import "SquleViewController.h"
#import "SearchViewController.h"
#import "CommentViewController.h"
#import "MessageViewController.h"

@interface MainTabbarController ()

@end

@implementation MainTabbarController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    //创建三级控制器
    [self _initViewCtrl];

    //自定义标签工具栏
//    [self _initTabbarView];
    [self _newInitTabarView];
}

//创建三级控制器
- (void)_initViewCtrl {

    //创建一级视图控制器
    HomeViewController *homeCtrl = [[HomeViewController alloc] init];
    SquleViewController *squleCtrl =[[SquleViewController alloc] init];
    SearchViewController *searchCtrl =[[SearchViewController alloc] init];
    CommentViewController *commentCtrl = [[CommentViewController alloc] init];
    MessageViewController *messageCtrl = [[MessageViewController alloc] init];

    NSArray *viewCtrls = @[homeCtrl,squleCtrl,searchCtrl,commentCtrl,messageCtrl];

    //创建二级导航控制器
    /*
    BaseNavgationController *navCtrl1 = [[BaseNavgationController alloc] initWithRootViewController:homeCtrl];
    BaseNavgationController *navCtrl2 = [[BaseNavgationController alloc] initWithRootViewController:squleCtrl];
    BaseNavgationController *navCtrl3 = [[BaseNavgationController alloc] initWithRootViewController:searchCtrl];
    BaseNavgationController *navCtrl4 = [[BaseNavgationController alloc] initWithRootViewController:commentCtrl];
    BaseNavgationController *navCtrl5 = [[BaseNavgationController alloc] initWithRootViewController:messageCtrl];
     */
    //使用循环创建

    NSMutableArray *navCtrls = [[NSMutableArray alloc] initWithCapacity:5];

    for (int i=0; i<5; i++) {
        UIViewController *viewCtrl = viewCtrls[i];
        BaseNavgationController *navCtrl = [[BaseNavgationController alloc] initWithRootViewController:viewCtrl];
        //将控制器添加到数组中
        [navCtrls addObject:navCtrl];
    }

    //将导航控制器存放到数组中
//    NSArray *navCtrls = @[navCtrl1,navCtrl2,navCtrl3,navCtrl4,navCtrl5];

    //创建三级标签控制器
    self.viewControllers = navCtrls;

}

//自定义工具栏
- (void)_initTabbarView {

    //1.隐藏默认生成的工具栏
    self.tabBar.hidden = YES;

    //2.创建工具栏的视图
    _tabbarView = [[UIView alloc] initWithFrame:CGRectMake(0, 480-49, 320, 49)];
    _tabbarView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"navbg"]];
    [self.view addSubview:_tabbarView];

    //3.添加子视图按钮
    for (int i=0; i<5; i++) {
        //设置按钮的图片的名字
        NSString *name = [NSString stringWithFormat:@"%d",i+1];
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        [button setImage:[UIImage imageNamed:name] forState:UIControlStateNormal];
        button.tag = i;
        button.frame = CGRectMake((64-42)/2+64*i, (49-44)/2, 42, 44);
        [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
        [_tabbarView addSubview:button];
    }

    //4.创建选中图片
    _selectedImg = [[UIImageView alloc] initWithFrame:CGRectMake((64-53)/2, (49-45)/2, 53, 45)];
    _selectedImg.image = [UIImage imageNamed:@"选中"];
    [_tabbarView addSubview:_selectedImg];

}

//2.方式二:保留tabbar的自定义工具栏
- (void)_newInitTabarView {

<strong><span style="color:#cc0000;">    //1.移除工具栏上所有的按钮</span></strong>
    //取得所欲的子视图
    NSArray *subViews = [self.tabBar subviews];
//    NSLog(@"-----subViews:%@",subViews);
    //移除UITabBarButton的对象
    for (UIView *view in subViews) {
        //将UITabBarButton类型的对象移除

        //将UITabBarButton转换成类名
        Class class = NSClassFromString(@"UITabBarButton");

        //移除视图
        if ([view isKindOfClass:class]) {
            [view removeFromSuperview];
        }
    }

    //2.设置tabbarView的背景颜色
    [self.tabBar setBackgroundImage:[UIImage imageNamed:@"navbg"]];

    //3.添加子视图按钮
    for (int i=0; i<5; i++) {
        //设置按钮的图片的名字
        NSString *name = [NSString stringWithFormat:@"%d",i+1];
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        [button setImage:[UIImage imageNamed:name] forState:UIControlStateNormal];
        button.tag = i;
        button.frame = CGRectMake((64-42)/2+64*i, (49-44)/2, 42, 44);
        [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
        [self.tabBar addSubview:button];
    }

    //4.创建选中图片
    _selectedImg = [[UIImageView alloc] initWithFrame:CGRectMake((64-53)/2, (49-45)/2, 53, 45)];
    _selectedImg.image = [UIImage imageNamed:@"选中"];
    [self.tabBar addSubview:_selectedImg];
}

- (void)buttonAction:(UIButton *)button {

    //切换试图
    self.selectedIndex = button.tag;

    [UIView beginAnimations:NULL context:nil];
    [UIView setAnimationDuration:.3];

    _selectedImg.center = button.center;

    //关闭动画
    [UIView commitAnimations];

}

//是否显示标签工具栏
- (void)showtabbar:(BOOL)show {

//    _tabbarView.frame.origin.x = -320;    错误
    CGRect frame = _tabbarView.frame;

    if (show) {
        //显示
        frame.origin.x = 0;
    }else {
        frame.origin.x = -320;
    }

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:.35];

    _tabbarView.frame = frame;

    [UIView commitAnimations];

}

@end

创建导航控制器父类,方便统一设置导航栏

BaseNavgationController.m

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.navigationBar setBackgroundImage:[UIImage imageNamed:@"navbar_bg_normal1"] forBarMetrics:UIBarMetricsDefault];

}

HomeViewController.m

#import "HomeViewController.h"
#import "DetailViewController.h"
#import "MainTabbarController.h"

@interface HomeViewController ()

@end

@implementation HomeViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        self.title = @"个人中心";
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    //创建按钮
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.backgroundColor = [UIColor greenColor];
    button.frame = CGRectMake(90, 90, 90, 50);
    [button addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];

}

- (void)buttonAction
{

    DetailViewController *detailCtrl = [[DetailViewController alloc] init];

    [self.navigationController pushViewController:detailCtrl animated:YES];

    //隐藏工具栏
     MainTabbarController *mainCtrl = (MainTabbarController *)self.tabBarController;
    [mainCtrl showtabbar:NO];
}

@end

DetailViewController.m

#import "DetailViewController.h"
#import "MainTabbarController.h"

@interface DetailViewController ()

@end

@implementation DetailViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // 视图在push过来的时候将标签栏移除
        self.hidesBottomBarWhenPushed = YES;
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.title = @"详情";

    self.view.backgroundColor = [UIColor redColor];

}

- (void)viewWillDisappear:(BOOL)animated {

    [super viewWillDisappear:animated];

    //注意:视图控制器可以越级取得标签工具栏
    MainTabbarController *mainCtrl = (MainTabbarController *)self.tabBarController;

    //显示工具栏
    [mainCtrl showtabbar:YES];

}

SquleViewController.m

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.title = @"广场";
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor greenColor];

}

SearchViewController.m

CommentViewController.m

MessageViewController.m

这三个文件与SquleViewController.m一致,只设置了title和backgroundColor

时间: 2024-10-05 15:32:43

两种方式自定义标签工具栏的相关文章

iOS 自定义layer的两种方式

在iOS中,你能看得见摸得着的东西基本都是UIView,比如一个按钮,一个标签,一个文本输入框,这些都是UIView: 其实UIView之所以能显示在屏幕上,完全是因为它内部的一个图层 在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性可以访问这个图层 @property(nonatomic,readonly,retain) CALayer *layer; 每一个UIView内部都默认关联一个CALayer,我们可称这个Laye

EntityFramework Core 2.0自定义标量函数两种方式

前言 上一节我们讲完原始查询如何防止SQL注入问题同时并提供了几种方式.本节我们继续来讲讲EF Core 2.0中的新特性自定义标量函数. 自定义标量函数两种方式 在EF Core 2.0中我们可以将方法映射到数据库中的标量函数,我们可在LINQ中调用此方法并会被正确翻译成SQL语句,这为编写数据访问层的开发人员提供了一个很棒的功能来创建一个方法并在其上应用DbFunction特性即可.该属性会将静态CLR方法映射到数据库函数,以便可以在LINQ查询中使用此方法.默认情况下,数据库函数中的CLR

Code First02---CodeFirst配置实体与数据库映射的两种方式

Code First有两种配置数据库映射的方式,一种是使用数据属性DataAnnotation,另一种是Fluent API. 这两种方式分别是什么呢?下面进行一一解释: DataAnnotation的配置方式需要你给定义实体和值对象的类和类中的属性加上与数据库映射相关的配置标签. 比如说:我有一个实体类:Customers 按照Code First的规则,数据库的表名应该是跟这个一致Customers,但是如果我想表名为Customer,那怎么才能让实体识别到这个表名呢. [Table(“Cu

JAVA中Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序

一.描述 自定义的类要按照一定的方式进行排序,比如一个Person类要按照年龄进行从小到大排序,比如一个Student类要按照成绩进行由高到低排序. 这里我们采用两种方式,一种是使用Comparable接口:让待排序对象所在的类实现Comparable接口,并重写Comparable接口中的compareTo()方法,缺点是只能按照一种规则排序. 另一种方式是使用Comparator接口:编写多个排序方式类实现Comparator接口,并重写新Comparator接口中的compare()方法,

创建TabHost的两种方式的简单分析

最近做了一个TabHost的界面,在做的过程中发现了一些问题,故和大家分享一下. 首先我的界面如下: 目前就我所知,创建TabHost有两种方式,第一种是继承TabActivity类,然后用getTabHost方法来得到一个TabHost的实例,然后就可以给这个TabHost添加Tab了.示例代码如下: [java] view plaincopy public class PlotHost extends TabActivity  { @Override protected void onCre

jQuery开发插件的两种方式

最近挺多人写jQuery的,都是关于jQuery扩展方面的,使用方面的讲的比较多,但是关于详细的一个基础的过程讲的比较少一点,做web开发的基本上都会用到jQuery,本人就根据jQuery的使用经验讲讲插件开发.jQuery插件开发两种方式:一种是类扩展的方式开发插件,jQuery添加新的全局函数(jQuery的全局函数是属于jQuery命名空间的函数),如果将jQuery看成一个类,那么就相当于给jQuery类本身添加方法.第二种是对象扩展的方式开发插件,即jQuery对象添加方法. 类扩展

从源代码剖析Struts2中用户自定义配置转换器的两种方式——基于字段的配置转换器和基于类型的配置转换器(解决了实际系统中,因没有区分这两种工作方式的生命周期而引起的异常错误问题)

自定义类型转换器必须实现ongl.TypeConverter接口或对这个接口的某种具体实现做扩展 <<interface>>com.opensymphony.xwork2.conversion.TypeConverter à com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter à org.apache.struts2.util.StrutsTypeConverter 接口及类进行解析 TypeConverter(

生成二维码的两种方式

利用qrcode生成二维码,(qrcode矩形二维码符号) 基于jquery的二维码生成插件qrcode,在页面中调用该插件就能生成对应的二维码.qrcode其实是通过使用jQuery实现图形渲染,画图,支持canvas(HTML5)和table两种方式: 使用插件时 1.首先在页面中加入jquery库文件和qrcode插件. <script type="text/javascript" src="jquery.js"></script> &

《连载 | 物联网框架ServerSuperIO教程》- 10持续传输大块数据流的两种方式(如:文件)

1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架ServerSuperIO教程>2.服务实例的配置参数说明 <连载 | 物联网框架ServerSuperIO教程>- 3.设备驱动介绍 <连载 | 物联网框架ServerSuperIO教程>-4.如开发一套设备驱动,同时支持串口和网络通讯. <连载 | 物联网框架ServerSupe