OC中UITabBarController控制器

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:10],
                        NSForegroundColorAttributeName:[UIColor colorWithRed:170.0/255 green:170.0/255 blue:170.0/255 alpha:1]
                        };
NSDictionary *selected = @{
                           NSForegroundColorAttributeName:[UIColor colorWithRed:1.0 green:0.54 blue:0.15 alpha:1],
                           NSFontAttributeName:[UIFont systemFontOfSize:10]
                           };
// 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上下文。

原文地址:https://www.cnblogs.com/mddblog/p/4556943.html