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. DirectShow .Net 实现视频

    DirectShow .Net 实现视频 .获取视频采集设备IBaseFilter接口对象的方法 //获取所有视频设备名称 public ArrayList GetVideoInputDevice() ...

  2. 【UWP】在不同类库使用ResourceDictionaries

    通常我们在类库中定义资源的时候可以在Theme/Generic.xaml中定义,当类库加载的时候,会自动加载Generic.xaml文件中的资源,通常用在控件库中,但如果控件多了之后,所有的Style ...

  3. C#自定义特性实例

    元数据,就是C#中封装的一些类,无法修改.类成员的特性被称为元数据中的注释. 1.什么是特性   (1)属性与特性的区别  属性(Property):属性是面向对象思想里所说的封装在类里面的数据字段, ...

  4. LeetCode123:Best Time to Buy and Sell Stock III

    题目: Say you have an array for which the ith element is the price of a given stock on day i. Design a ...

  5. 【Java每日一题】20161107

    package Nov2016; import java.util.List; public class Ques1107 { public static void main(String[] arg ...

  6. 关于java jni编译javac javah的问题

    这篇文章是在安卓教程网http://android.662p.com那边分享过来的,文章说得还不错的,希望能够帮到大家的学习. javac  编译class文件命令,需要注意的是当类B中import类 ...

  7. springmvc restful配置有一个小小的坑坑

    首先web.xml配置 <!-- spring-mvc --> <servlet> <servlet-name>springServlet</servlet- ...

  8. PHP内核探索之变量(6)- 后续内核探索系列大纲备忘

    年前因为工作比较饱和,现在又忙着换工作的事情,基本停止了对博文的更新.后续的博文,还是慢慢补上吧. 为了不至于过于发散,先搞个未成形的大纲,如下: PHP内核探索之变量  不平凡的字符串 PHP内核探 ...

  9. Android Library Project 使用问题总结

    1. 当新建Android Library Project 工程或将已有工程转化为Android Library Project, 如果工程源代码中有如下语句: int id = view.getId ...

  10. 【FFmpeg】Windows下FFmpeg调试

    为了深入了解ffmpeg的工作原理,需要阅读源代码,调试源代码.在Windows下调试ffmpeg源码,一种方法是在MinGW+Msys环境下,利用GDB进行调试:另一种是借助Eclipse进调试,其 ...