文档章节

UITabBarController的使用

luoruowen
 luoruowen
发布于 2016/11/02 17:29
字数 1192
阅读 73
收藏 0

先看效果图

一般为了实现底部导航和跳转子控制器.一般都是UITabBarController和UINavigationController嵌套使用

一般将ViewController添加到UINavigationController管理, 然后将UINavigationController添加到UITabBarController,  再将UITabBarController添加到rootViewController .

ViewController -> UINavigationController -> UITabBarController -> rootViewController

其中UITabBarController添加多个UINavigationController或ViewController以实现评级视图的切换.

直接看代码吧,代码有注释

AppDelegate

//
//  AppDelegate.m
//  TabBarTest
//
//  Created by  罗若文 on 2016/11/1.
//  Copyright © 2016年 罗若文. All rights reserved.
//

#import "AppDelegate.h"
#import "ViewController.h"
#import "NIImage.h"
#import "NITabBarController.h"

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //1.创建Window
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];

    //a.初始化一个tabBar控制器
    UITabBarController *tb=[[NITabBarController alloc]init];

    //b.创建子控制器
    ViewController *c1=[[ViewController alloc]init];
    //将子控制器添加到UINavigationController中,方便控制器深度的跳转
    UINavigationController * navigationController=[[UINavigationController alloc]initWithRootViewController:c1];
    //设置底部的标题,如果没有设置默认会取控制器的title.  因为c1是在UINavigationController中所以用这样的方式c1.navigationController取到tabBarItem进行设置
    c1.navigationController.tabBarItem.title=@"消息";
    //底部的图片
    c1.navigationController.tabBarItem.image=[NIImage imageNamed:@"app0.png" targetSize:CGSizeMake(50, 50)];
    //设置提示badge
    c1.navigationController.tabBarItem.badgeValue=@"3";

    
    UIViewController *c2=[[UIViewController alloc]init];
    c2.view.backgroundColor=[UIColor brownColor];
    //这个控制器没有添加到UINavigationController中,就可以直接c2.tabBarItem.title设置底部标题
    c2.tabBarItem.title=@"联系人";
    c2.tabBarItem.image=[NIImage imageNamed:@"联系人0.png" targetSize:CGSizeMake(30, 30)];

    UIViewController *c3=[[UIViewController alloc]init];
    c3.tabBarItem.title=@"动态";
    c3.tabBarItem.image=[NIImage imageNamed:@"uncheck.png" targetSize:CGSizeMake(30, 30)];
    //设置底部选中时候的图片
    c3.tabBarItem.selectedImage=[NIImage imageNamed:@"check.png" targetSize:CGSizeMake(30, 30)];
    //修改图片的位置(上,左,下,右)  上和下的要对应偏移,不然会有意向不到的效果,自己试试,  左右也一样
    c3.tabBarItem.imageInsets=UIEdgeInsetsMake(10,-30,-10, 30);
    //修改文字的位置(水平,垂直)
    [c3.tabBarItem setTitlePositionAdjustment:UIOffsetMake(10, -30)];

    UIViewController *c4=[[UIViewController alloc]init];
    c4.tabBarItem.title=@"设置";
    c4.tabBarItem.image=[NIImage imageNamed:@"set0.png" targetSize:CGSizeMake(30, 30)];
    //设置底部选中时候的图片
    c4.tabBarItem.selectedImage=[NIImage imageNamed:@"set1.png" targetSize:CGSizeMake(30, 30)];
    //设置选中图片保持原来图片颜色,未选中也一样设置UIImageRenderingModeAlwaysOriginal
    c4.tabBarItem.selectedImage= [c4.tabBarItem.selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    // 获取当前类的tabBarItem
    UITabBarItem *BarItem = c4.tabBarItem;
    // 设置所有BarItem的选中时颜色
    // 设置选中文字颜色
    // 创建字典去描述文本
    NSMutableDictionary *attr = [NSMutableDictionary dictionary];
    // 文本颜色 -> 描述富文本属性的key -> NSAttributedString.h
    attr[NSForegroundColorAttributeName] = [UIColor blueColor];
    [BarItem setTitleTextAttributes:attr forState:UIControlStateSelected];
    
    // 通过normal状态设置字体大小
    // 字体大小 跟 normal
    NSMutableDictionary *attrnor = [NSMutableDictionary dictionary];
    // 设置字体
    attrnor[NSFontAttributeName] = [UIFont systemFontOfSize:16];
    [BarItem setTitleTextAttributes:attrnor forState:UIControlStateNormal];
    
    
    //c.添加子控制器到ITabBarController中
    //c.1第一种方式
    //[tb addChildViewController:c1];
    //[tb addChildViewController:c2];

    //c.2第二种方式
    tb.viewControllers=@[navigationController,c2,c3,c4];
    
    //设置标签栏文字和图片的颜色
    tb.tabBar.tintColor = [UIColor orangeColor];
    
    //设置标签栏的颜色
    tb.tabBar.barTintColor = [UIColor blackColor];
    
    //设置标签栏风格(默认高度49)
    tb.tabBar.barStyle = UIBarStyleBlack;
    
    //设置初始状态选中的下标
    tb.selectedIndex = 2;

    //设置选中的背景
    float w=[UIScreen mainScreen].bounds.size.width/4.0;
    tb.tabBar.selectionIndicatorImage=[NIImage imageByScalingToSize:[NIImage imageWithColor:[UIColor greenColor]] targetSize:CGSizeMake(w, 80)];
    
    
    //设置控制器为Window的根控制器
    self.window.rootViewController=tb;
    //2.设置Window为主窗口并显示出来
    [self.window makeKeyAndVisible];
    return YES;
}


- (void)applicationWillResignActive:(UIApplication *)application {
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
}


- (void)applicationDidEnterBackground:(UIApplication *)application {
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}


- (void)applicationWillEnterForeground:(UIApplication *)application {
    // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
}


- (void)applicationDidBecomeActive:(UIApplication *)application {
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}


- (void)applicationWillTerminate:(UIApplication *)application {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}


@end

如果需要设置tabBar的高度,那么就要重写一下UITabBarController中的viewWillLayoutSubviews方法

//
//  NITabBarController.m
//  TabBarTest
//
//  Created by  罗若文 on 2016/11/1.
//  Copyright © 2016年 罗若文. All rights reserved.
//

#import "NITabBarController.h"

@interface NITabBarController ()

@end

@implementation NITabBarController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //这边重构TabBarController视图
}

/**
 这边重新设置TabBar的高度
 */
- (void)viewWillLayoutSubviews{
    CGRect tabFrame = self.tabBar.frame; //self.TabBar is IBOutlet of your TabBar
    tabFrame.size.height = 80;
    tabFrame.origin.y = self.view.frame.size.height - 80;
    self.tabBar.frame = tabFrame;
}

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

@end

在你用[self.navigationController pushViewController:vc animated:YES];跳转到第二个视图的时候会发现底部的tabBar还在.那么如果不想要显示,就在跳转前设置一下hidesBottomBarWhenPushed属性就行了

ViewController2 * vc=[[ViewController2 alloc]init];
vc.hidesBottomBarWhenPushed=YES;
[self.navigationController pushViewController:vc animated:YES];

这边有引用的NIImage.h在新创意的开源框架常用类中可以找到.其他的代码主要都在这里了.都能满足需要了

http://git.oschina.net/newOriginality/NewIdeasAPI_Base/tree/master/NewIdeasAPI_Base/NewIdeasAPI_Base/NIBaseUtil

© 著作权归作者所有

luoruowen

luoruowen

粉丝 2
博文 9
码字总数 4663
作品 1
福州
程序员
私信 提问
高度自定义 TabBarController 组件--ESTabBarController

ESTabBarController 是一个高度自定义的 TabBarController 组件,继承自 UITabBarController,可轻松自定义 UI 样式,添加动画等。 功能 1、支持默认样式 如果直接使用ESTabBarController进行...

eggswift
2017/02/14
341
0
iOS开发简记(2):自定义tabbar

tabbar是放在APP底部的控件。常见的APP都使用tabbar来进行功能分类的管理,比如微信、QQ等等。 小程需要一个特殊一点的tabbar,要求突显中间的那个按钮,让中间按钮特别显眼,从而引导用户去...

jonlan
2018/11/17
0
0
UITabBarController详解

 广州APP开发,微信开发,广州英趣信息科技开发部博客:当我们想要做一个界面类似 联系人 那样的程序时,就一定会用到 UITabBar,它可以帮我们添加、管理许多的Tab项, 使我们的程序包含不同...

广州英趣科技
2013/09/08
16.7K
2
IOS 学习---视图,标签,导航控制器详解

当一个项目中UITabBarController,UIViewController三种控制器同时出现的时候,将标签控制器(UITabBarController)作为视图的根控制器,将创建的视图控制器作为标签控制器的子控制器。 //创建...

fengyun321
2015/09/12
54
0
UITabBarController简单介绍

一、简单介绍 UITabBarController和UINavigationController类似,UITabBarController也可以轻松地管理多个控制器,轻松完成控制器之间的切换,典型的例子就是QQ、微信等应⽤。 二、UITabBarCon...

Dolion-Hou
2016/03/23
14
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
15
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
15
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部