利用UITabBarController搭建项目的主界面

一:UITabBarController的简单介绍:

1.使用步骤:

(1)初始化UITabBarController

(2)设置UIWindow的rootViewController为UITabBarController

(3)创建相应的子控制器(viewcontroller)(让子控制器作为导航控制器的根视图控制器,最外层包装一层导航条)

(4)把子控制器添加到UITabBarController

2:加入方式:(1)[tb addChildViewController:c1];

(2)[email protected][c1,c2,c3,c4];

注意:展示的顺序和添加的顺序一致,和导航控制器中不同,展现在眼前的是第一个添加的控制器对应的View。导航控制器是压栈的过程

3.UITabBar

下方的工具条称为UITabBar ,如果UITabBarController有N个子控制器,那么UITabBar内部就会有N 个UITabBarButton作为子控件与之对应。

注意:UITabBarButton在UITabBar中得位置是均分的,UITabBar的高度为49。

在上面的程序中,UITabBarController有4个子控制器,所以UITabBar中有4个UITabBarButton,UITabBar的结构?大致如下图所示:

2.UITabBarButton

UITabBarButton?面显?什么内容,由对应子控制器的tabBarItem属性来决定

 c1.tabBarItem.title=@"消息";
 c1.tabBarItem.image=[UIImage imageNamed:@"tab_recent_nor"];

3:详细参考博文:http://www.cnblogs.com/wendingding/p/3775488.html

二:UITabBarController在项目中的应用

1:设置窗口的根视图控制器为CZTabBarController

2:

#import <UIKit/UIKit.h>

@interface CZTabBarController : UITabBarController

@end
#import "CZTabBarController.h"
#import "UIImage+Image.h"
#import "CZTabBar.h"
#import "CZHomeViewController.h"
#import "CZMessageViewController.h"
#import "CZDiscoverViewController.h"
#import "CZProfileViewController.h"
#import "CZNavigationController.h"
#import "CZUserTool.h"
#import "CZUserResult.h"
#import "CZComposeViewController.h"

@interface CZTabBarController ()<CZTabBarDelegate>

@property (nonatomic, strong) NSMutableArray *items;

@property (nonatomic, weak) CZHomeViewController *home;

@property (nonatomic, weak) CZMessageViewController *message;

@property (nonatomic, weak) CZProfileViewController *profile;

@end

@implementation CZTabBarController

#pragma mark - 懒加载存放tabBarItem的数组
- (NSMutableArray *)items
{
    if (_items == nil) {

        _items = [NSMutableArray array];

    }
    return _items;
}

- (void)viewDidLoad {
    [super viewDidLoad];

    // 1:添加所有子控制器
    [self setUpAllChildViewController];

    // 2:自定义tabBar
    [self setUpTabBar];

    //3: 每隔一段时间请求未读数
    [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(requestUnread) userInfo:nil repeats:YES];
}

// 请求未读数
- (void)requestUnread
{
    // 请求微博的未读数
    [CZUserTool unreadWithSuccess:^(CZUserResult *result) {

        // 设置首页未读数
        _home.tabBarItem.badgeValue = [NSString stringWithFormat:@"%d",result.status];

        // 设置消息未读数
        _message.tabBarItem.badgeValue = [NSString stringWithFormat:@"%d",result.messageCount];

        // 设置我的未读数
        _profile.tabBarItem.badgeValue = [NSString stringWithFormat:@"%d",result.follower];

        // 设置应用程序所有的未读数
        [UIApplication sharedApplication].applicationIconBadgeNumber = result.totoalCount;

    } failure:^(NSError *error) {

    }];
}
#pragma mark - 设置自定义的tabBar
- (void)setUpTabBar
{
    /*
     1:self.tabBar所在控制器的tabBar,要想添加自定义的tabBar,需要移除系统自带的tabBar

     **/

    // 自定义tabBar
    CZTabBar *tabBar = [[CZTabBar alloc] initWithFrame:self.tabBar.frame];
    tabBar.backgroundColor = [UIColor whiteColor];

    // 设置代理
    tabBar.delegate = self;

    // 给tabBar传递tabBarItem模型
    tabBar.items = self.items;

    // 添加自定义tabBar
    [self.view addSubview:tabBar];

    // 移除系统的tabBar
    [self.tabBar removeFromSuperview];
}

#pragma mark - 当点击tabBar上的按钮调用,并切换视图
- (void)tabBar:(CZTabBar *)tabBar didClickButton:(NSInteger)index
{
    /*
     1:self.selectedIndex = index;此行代码很重要,执行此代码才会切换视图

     */

    if (index == 0 && self.selectedIndex == index) { // 点击首页,刷新
        [_home refresh];
    }

    self.selectedIndex = index;
}

#pragma mark - 点击加号按钮的时候调用
- (void)tabBarDidClickPlusButton:(CZTabBar *)tabBar
{
    /*
     1:presentViewController的时候,想要视图有导航条,就让它作为导航控制器的一个根视图控制器

     */
    // 创建发送微博控制器
    CZComposeViewController *composeVc = [[CZComposeViewController alloc] init];
    CZNavigationController *nav = [[CZNavigationController alloc] initWithRootViewController:composeVc];

    [self presentViewController:nav animated:YES completion:nil];
}

#pragma mark - 添加所有的子控制器
- (void)setUpAllChildViewController
{
    /*
     步骤:

     1:创建所有子控制器的对象,并给每个自控制器外层包装一个导航控制器 2:设置每个子控制器的tabBarItem上得选中未选中图片,还有每个子控制器的标题
     2:因为过程都是重复相同的代码,所以抽代码封装成一个方法供外界访问,提供的参数包括:image,selectedImage,title
     */

    // 首页
    CZHomeViewController *home = [[CZHomeViewController alloc] init];

    [self setUpOneChildViewController:home image:[UIImage imageNamed:@"tabbar_home"] selectedImage:[UIImage imageWithOriginalName:@"tabbar_home_selected"] title:@"首页"];
    _home = home;

    // 消息
    CZMessageViewController *message = [[CZMessageViewController alloc] init];
    [self setUpOneChildViewController:message image:[UIImage imageNamed:@"tabbar_message_center"] selectedImage:[UIImage imageWithOriginalName:@"tabbar_message_center_selected"] title:@"消息"];
    _message = message;

    // 发现
    CZDiscoverViewController *discover = [[CZDiscoverViewController alloc] init];
    [self setUpOneChildViewController:discover image:[UIImage imageNamed:@"tabbar_discover"] selectedImage:[UIImage imageWithOriginalName:@"tabbar_discover_selected"] title:@"发现"];

    // 我
    CZProfileViewController *profile = [[CZProfileViewController alloc] init];
    [self setUpOneChildViewController:profile image:[UIImage imageNamed:@"tabbar_profile"] selectedImage:[UIImage imageWithOriginalName:@"tabbar_profile_selected"] title:@"我"];
    _profile = profile;
}
#pragma mark - 添加每一个子控制器
- (void)setUpOneChildViewController:(UIViewController *)vc image:(UIImage *)image selectedImage:(UIImage *)selectedImage title:(NSString *)title
{
    //1:设置每个子控制器的标题(子控制器的标题与tabbar标题只需设置一次 navigationItem决定导航条上的内容 导航条上的内容由栈顶控制器的navigationItem决定
     vc.title = title;
    //2:设置每个字控制器tabBarItem
    vc.tabBarItem.image = image;
    vc.tabBarItem.selectedImage = selectedImage;
    // 3:保存tabBarItem模型到数组
    [self.items addObject:vc.tabBarItem];
    // 4:将子控制器作为导航控制器的根视图控制器
    CZNavigationController *nav = [[CZNavigationController alloc] initWithRootViewController:vc];
    //5:添加子控制器
    [self addChildViewController:nav];
}

@end
时间: 2024-10-08 14:00:52

利用UITabBarController搭建项目的主界面的相关文章

利用UITabBarController搭建项目的主界面---各种封装

一:什么时候需要进行封装 1:写代码处处要有封装思想:封装好的代码要基本符合以下三个条件:1:封装的部分向外界提供的接口调用最简洁方便  2:封装的时候要考虑项目的拓展性 3:封装以后要想代码量更加简洁 2:什么时候需要封装:具有相同业务逻辑的部分.或是调用频率很高的大量重复代码.或是将UI部分某些通用的模块等都应该采取封装.封装的MVC模型:mvc三个各司其职,各自负责自身内部的业务逻辑,把自身内部的业务逻辑搜封装在相应模块的内部 3:如何封装:把业务逻辑部分与外界无关的都封装在公共代码的内部

利用vue-cli搭建项目后的目录结构

npm install -g vue-cli vue init webpack my-project(项目名称)  后的目录结构: -----build         webpack配置相关 -----config webpack配置相关 -----node-modules   npm install 安装的依赖代码库 -----src             存放项目源码 -----static

主流界面搭建原理(类似百思不得姐主界面)

一.界面搭建 1.项目需求 主界面能左右滚动,还能上下滚动,点击按钮跳转界面 2.分析界面 点击按钮跳转界面可以自定义UITabBarCotroller来实现 左右滚动,可以利用scrollView来实现  或 UICollectionView 上下滚动,用tableView可以实现 3.选择实现方案 方案一:   UITabBarCotroller + scrollView + tableView + titleView(TabBar条) UIScrollView弊端:没有做离屏渲染优化 使用

ASP.NET MVC搭建项目后台UI框架—1、后台主框架

目录 ASP.NET MVC搭建项目后台UI框架-1.后台主框架 ASP.NET MVC搭建项目后台UI框架-2.菜单特效 ASP.NET MVC搭建项目后台UI框架-3.面板折叠和展开 ASP.NET MVC搭建项目后台UI框架-4.tab多页签支持 ASP.NET MVC搭建项目后台UI框架-5.Demo演示Controller和View的交互 ASP.NET MVC搭建项目后台UI框架-6.客户管理(添加.修改.查询.分页) ASP.NET MVC搭建项目后台UI框架-7.统计报表 ASP

抛开vue-cli 利用requireJS搭建一个vue项目

---恢复内容开始--- 现在学习vue都是利用脚手架vue-cli快速搭建一个项目,这是非常高效的方法,我是十分推荐的,但是有时候在没有互联网的情况,我们没办法在node环境下,敲一个nmp install XXX帮我们搭建系统.这边也遇到了这样的情况,记录一下过程,备忘. 采用的方式是利用requireJS搭建一个遵循AMD规则的vue项目.关于这一块,大家可以百度一下,查询相关资料熟悉requireJS的使用. 第一步,都是建立一个如下常规的简单的工程结构: ----lib 存放js库文件

[应用妹 --第二篇 主界面Tab搭建] android应用市场之快速开发

主界面布局如下 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:la

【边做项目边学Android】手机安全卫士05_1:程序主界面

主界面布局(知识点:GridView) mainscreen.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height=

利用tomcat搭建jsp开源内容管理系统

一.简介 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选.对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应对HTML(标准通用标记语言下的一个应用.)页面的访问请求.实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的. 诀窍是,当配

日积(Running)月累(ZSSURE):WCF学习之“通过事件绑定控制WinForm宿主程序主界面控件”

背景: WCF服务需要寄宿到相应的可运行进程中执行,常见的有四种寄宿,分别是控制台程序.WinForm程序.IIS和Windows服务.之前学习老A博客和<WCF全面解析>时最常用到的是控制台寄宿,近期由于项目需求,需要在WinForm程序中调用WCF服务,本博文通过一个简单的实例来演示WCF在WinForm中的寄宿.并着重介绍如何利用事件绑定控制宿主主UI界面控件. 题记: 之前一直坚守在C++阵地,对于新语言.新技术(诸如Python.J2EE.Bigdata.AI)不甚感冒.自以为&qu