UITabBarController

UITabBarController(记为O)常用于管理多个导航控制器,例如有ABC三个导航控制器,可以:addChildViewController(记为A), addChildViewController(B), addChildViewController(C)将其添加,或者设置数组viewControllers=[A,B,C]。ABC称作子控制器,O称作父控制器(只是称谓)。它管理的控制器一旦加载内存不会释放,即不会从新加载。比如程序刚启动时只显示A(懒加载,只有需要时才加载),然后有A跳转B,程序会调用B的viewDidLoad,第二次切换到B时不会调用B的viewDidLoad,因为就没有从内存释放。

UITabBarButton(高49个点)里面显示的内容,由对应子控制器的tabBarItem属性决定.如果是导航控制器,如果设置了导航控制器的topViewController.title(应该是栈底控制器才合理,不过在向TabBar添加时导航控制器只有这一个控制器既是栈底也是栈顶),会改变两个地方,一个是TabBarController图 2,所示,另一个是UINavigationController的图 1。基于此,就可以实现TabBar和导航栏显示的title不一样:先设置topViewController.title,然后再设置tabBarItem覆盖。

图 1导航栏标题

图 2 TabBar

遵守了UITabBarControllerDelegate后可以做一些其它自定义处理,比如当从A跳转到B时想实现一些功能可在didSelectViewController函数中执行。另外可以自定义UITabBar。

  另外,在设置图片时需要设置渲染方式,否则系统默认为蓝色渲染(很难看),方式如下:

viewcontroller.tabBarItem.image = [[UIImage imageNamed:@"tabbarNormal"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
// 选中时图片
viewcontroller.tabBarItem.selectedImage = [[UIImage imageNamed:@"tabbarHighlight"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

  一般需求中,文字的渲染颜色也是要设置的,否则也为系统默认,方式如下:

// 全局设置文字大小 颜色
UITabBarItem *item = [UITabBarItem appearance];
// UIControlStateNormal状态下的文字属性
NSDictionary *normal = @{
NSFontAttributeName:[UIFont systemFontOfSize:],
NSForegroundColorAttributeName:[UIColor colorWithRed:170.0/ green:170.0/ blue:170.0/ alpha:]
};
NSDictionary *selected = @{
NSForegroundColorAttributeName:[UIColor colorWithRed:1.0 green:0.54 blue:0.15 alpha:],
NSFontAttributeName:[UIFont systemFontOfSize:]
};
// UI_APPEARANCE_SELECTOR属性
[item setTitleTextAttributes:normal forState:UIControlStateNormal];
[item setTitleTextAttributes:selected forState:UIControlStateSelected]; // 最后再设置标题
viewcontroller.title = @"资讯";

Modal方式弹出一个控制器

  1. 一般将要弹出的控制器(vc)包装到导航控制器(包装后也可以使用push pop)。vc为nav根控制器(栈底)。Modal方式可以转场任意控制器。而且可以自定义(代码见代码部分)。
  2. 从当前控制器跳转到vc:[self presentViewController:nav animated:YES completion:nil];注意是跳转到nav。
  3. 从vc跳回:[self dismissViewControllerAnimated:YES completion:nil];这里的self指的时vc自己。注意是从vc跳转,也可以从nav跳转。
  4. 这两个函数是成对出现,例如:1 modal 2然后2以任意方式跳到3再到4再到5等等,只要2345任何一个调用dismiss都会跳回1;所以上面从vc可以跳转到self(隔一个导航控制器跳转)。
  • 自定义转场准备工作

如果使用storyboard则一定会执行prepareForSegue方法,里面指定transitioningDelegate转场代理,指定modalPresentationStyle为custom,如果是手写代码则还要presentViewController执行跳转。

  • 具体实现

遵守转场代理UIViewControllerTransitioningDelegate指定转场时长,转场动画的对象,dismiss的对象,遵守UIViewControllerAnimatedTransitioning实现转场动画,transitionContext上下文。

OC中UITabBarController控制器的更多相关文章

  1. OC中加载html5调用html方法和修改HTML5内容

    1.利用webView控件加载本地html5或者网络上html5 2.设置控制器为webView的代理,遵守协议 3.实现代理方法webViewDidFinishLoad: 4.在代理方法中进行操作H ...

  2. Swift: 比较Swift中闭包传值、OC中的Block传值

    一.介绍 开发者对匿名函数应该很清楚,其实它就是一个没有名字的函数或者方法,给人直观的感觉就是只能看到参数和返回值.在iOS开发中中,它又有自己的称呼,在OC中叫Block代码块,在Swift中叫闭包 ...

  3. 设计模式之观察者模式(关于OC中的KVO\KVC\NSNotification)

    学习了这么久的设计模式方面的知识,最大的感触就是,设计模式不能脱离语言特性.近段时间所看的两本书籍,<大话设计模式>里面的代码是C#写的,有一些设计模式实现起来也是采用了C#的语言特性(C ...

  4. OC中NSClassFromString()与NSStringFromClass()的用法及应用场景

    1.NSClassFromString()利用一个字符串创建一个类,我是在标签控制器中 UITabBarController中创建它的子控制器中使用的 - (void)viewDidLoad { [s ...

  5. OC中的结构体

    一.结构体 结构体只能在定义的时候进行初始化 给结构体属性赋值    + 强制转换: 系统并不清楚是数组还是结构体,需要在值前面加上(结构体名称)    +定义一个新的结构体,进行直接赋值    + ...

  6. java中的继承与oc中的继承的区别

    为什么要使用继承? 继承的好处: (1)抽取出了重复的代码,使代码更加灵活 (2)建立了类和类之间的联系 继承的缺点: 耦合性太强 OC中的继承 1.OC中不允许子类和父类拥有相同名称的成员变量名:( ...

  7. OC中类别、扩展、协议与委托

    一.类别(category) 类别(category)——通过使用类别,我们可以动态地为现有的类添加新方法,而且可以将类定义模块化地分不到多个相关文件中.通常只在类别中定义方法.(类别,接口部分的定义 ...

  8. OC中的私有变量和description

    .OC中的私有变量 在类的实现即.m @implementation中也可以声明成员变量,但是因为在其他文件中通常都只 是包含头文件而不会包含实现文件,所以在.m文件中声明的成员变量是@private ...

  9. Oc中的数组

    ========================== 数组 ========================== 一.认识数组 oc中可以把NSObject对象的子类放到数组这个集合中,但是int.f ...

随机推荐

  1. C#实现WinForm DataGridView控件支持叠加数据绑定

    我们都知道WinForm DataGridView控件支持数据绑定,使用方法很简单,只需将DataSource属性指定到相应的数据源即可,但需注意数据源必须支持IListSource类型,这里说的是支 ...

  2. Ajax学习记录

    Ajax 1:ajax是一种页面局部刷新的技术,不是整个页面刷新.这里就像论坛评论里面的刷新,只是局部的,不是页面全部提交到服务器. 2:页面不刷新,创建个WebClient,它和服务器进行交互.&l ...

  3. 类库,委托,as.is,var,泛型集合

    类库: 就是让别人调用你写的方法,并且不让别人看到你是怎么实现的.(比如说一些核心文件) 如果有功能你不会做,需要别人帮忙,那么你的同事可以帮你写好一个类,然后你来调用这个类中的方法,完成你的项目. ...

  4. web前端学习笔记---scrollWidth,clientWidth,offsetWidth的区别

    通过一个demo测试这三个属性的差别. 说明: scrollWidth:对象的实际内容的宽度,不包边线宽度,会随对象中内容超过可视区后而变大. clientWidth:对象内容的可视区的宽度,不包滚动 ...

  5. iOS 阶段学习第25天笔记(iOS沙盒机制介绍)

    iOS学习(OC语言)知识点整理 一.iOS沙盒机制介绍 1)概念: 每个ios应用都有自己的应用沙盒,应用沙盒就是文件系统目录,与其他应用放入文件 系统隔离,ios系统不允许访问 其他应用的应用沙盒 ...

  6. 清除Windows的DNS缓存

    最近ESET杀毒软件老是提示受到DNS缓存攻击,然后就不能打开网页,或者打开得很慢.这是由于缓存的DNS被更改,访问的是错误的IP地址造成的. 解决的办法就是清除DNS缓存,打开DOS命令窗口,先后输 ...

  7. android版高仿淘宝客户端源码V2.3

    android版高仿淘宝客户端源码V2.3,这个版本我已经更新到2.3了,源码也上传到源码天堂那里了,大家可以看一下吧,该应用实现了我们常用的购物功能了,也就是在手机上进行网购的流程的,如查看产品(浏 ...

  8. jsp页面样例及解析

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  9. [javaSE] 反射-Class类的使用

    JAVA-Reflect 专题 ①Class类的使用 ②方法的反射 ③成员变量的反射 ④构造函数的反射 ⑤java类的加载机制 Ⅰ在面向对象的世界里,万事万物皆为对象 类是对象,类是java.lang ...

  10. C# RSA 分段加解密

    RSA加解密: 1024位的证书,加密时最大支持117个字节,解密时为128:2048位的证书,加密时最大支持245个字节,解密时为256. 加密时支持的最大字节数:证书位数/8 -11(比如:204 ...