iOS - UITabBarController

前言

    NS_CLASS_AVAILABLE_IOS(2_0) @interface UITabBarController : UIViewController <UITabBarDelegate, NSCoding>
    @available(iOS 2.0, *)       public class UITabBarController : UIViewController, UITabBarDelegate, NSCoding 
  • UITabBarController: 分栏视图控制器,在创建时,需要一次性的将所有 viewController 或 navigationController 添加到 UITabBarController 的 viewControllers 属性中。
  • UITabBarController 一次性添加了很多个视图控制器,但是在程序的运行的时候,并不是一次性将所有视图控制器对象进行创建和显示,而是用户点击显示那个视图控制器对象,系统才会创建和显示该视图。如果默认首先显示的不是 viewController1,例如是显示 viewController3, 系统首先创建 viewController1 和 viewController3,viewController2 和 viewController4 用户点击显示的时候才会被显示出来,无论先显示那个 viewController,viewController1 总是会被创建。
  • TabBarController 最多只能显示 5 个视图,超过 5 个的都会以 more 的形式显示,点击 more,剩余的视图将会被显示。当点击 Edit 时可以改变分栏上放置的分栏项。
  • TabBarController 的高度固定为 49,图片的尺寸最好为 30 * 30。

1、tabBarController 的创建

  • Objective-C

    • 创建分栏视图控制器

          UITabBarController *tabBarController = [[UITabBarController alloc] init];
      
          // 将 tabBarController 添加到 viewController 上
          [self addChildViewController:tabBarController];
          [self.view addSubview:tabBarController.view];
      
          // 将 navigationController 做为 window 的根视图控制器
          self.window.rootViewController = tabBarController;
    • 设置分栏视图控制器包含的视图控制器
          // 实例化视图控制器对象(或者 导航视图控制器对象)
          ViewController11 *viewController1 = [[ViewController11 alloc] init];
          ViewController12 *viewController2 = [[ViewController12 alloc] init];
          ViewController13 *viewController3 = [[ViewController13 alloc] init];
          ViewController14 *viewController4 = [[ViewController14 alloc] init];
      
          NSArray *viewControllerArray = @[viewController1, viewController2,
                                           viewController3, viewController4];
      
          // 向分栏视图控制器中添加视图控制器
          tabBarController.viewControllers = viewControllerArray;
    • 设置分栏显示的标题和图片
          // 设置显示的 title
          NSArray *titleArray = @[@"微信", @"通讯录", @"发现", @"我"];
      
          // 设置选择时显示的图片
          NSArray *selectImageArray = @[@"tabbar_mainframeHL", @"tabbar_contactsHL",
                                        @"tabbar_discoverHL", @"tabbar_meHL"];
      
          // 设置未选择时显示的图片
          NSArray *unSelectImagArray = @[@"tabbar_mainframe", @"tabbar_contacts",
                                         @"tabbar_discover", @"tabbar_me"];
      
          for (int i = 0; i < 4; i++) {
      
              // 从 tabBarController 中取出 tabBarItem 成员
              UITabBarItem *tabBarItem = tabBarController.tabBar.items[i];
      
              tabBarItem = [tabBarItem initWithTitle: titleArray[i]
                                               image: [[UIImage imageNamed:unSelectImagArray[i]]
                                      imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]
                                       selectedImage: [[UIImage imageNamed:selectImageArray[i]]
                                      imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
          }
    • 设置分栏标题文字颜色
          // 选中时颜色,默认为蓝色
          tabBarController.tabBar.tintColor = [UIColor greenColor];
  • Swift
    • 创建分栏视图控制器

          let tabBarController = UITabBarController()
      
          // 将 tabBarController 添加到 viewController 上
          self.addChildViewController(tabBarController)
          self.view.addSubview(tabBarController.view)
      
          // 将 navigationController 做为 window 的根视图控制器
          self.window?.rootViewController = tabBarController
    • 设置分栏视图控制器包含的视图控制器
          // 实例化视图控制器对象(或者 导航视图控制器对象)
          let viewController1 = ViewController11()
          let viewController2 = ViewController12()
          let viewController3 = ViewController13()
          let viewController4 = ViewController14()
      
          let viewControllerArray:Array = [viewController1, viewController2,
                                       viewController3, viewController4]
      
          // 向分栏视图控制器中添加视图控制器
          tabBarController.viewControllers = viewControllerArray
    • 设置分栏显示的标题和图片
          // 设置显示的 title
          let titleArray = ["微信", "通讯录", "发现", "我"];
      
          // 设置选择时显示的图片
          let selectImageArray = ["tabbar_mainframeHL", "tabbar_contactsHL",
                                  "tabbar_discoverHL", "tabbar_meHL"]
      
          // 设置未选择时显示的图片
          let unSelectImagArray = ["tabbar_mainframe", "tabbar_contacts", "tabbar_discover", "tabbar_me"]
      
          for i in 0 ..< 4 {
      
              viewControllerArray[i].tabBarItem = UITabBarItem(title: titleArray[i],
                                                               image: UIImage(named: unSelectImagArray[i])!
                                                               .imageWithRenderingMode(.AlwaysOriginal),
                                                       selectedImage: UIImage(named: selectImageArray[i])!
                                                            .imageWithRenderingMode(.AlwaysOriginal))
          }
    • 设置分栏标题文字颜色
          // 选中时颜色,默认为蓝色
          tabBarController.tabBar.tintColor = UIColor.greenColor()

2、tabBarController 的设置

  • Objective-C

        // 设置首先显示的视图控制器
    
            // 视图的添加顺序已知
            /*
                用添加顺序的标号指定
            */
            tabBarController.selectedIndex = 1;
    
            // 视图的添加顺序未知
    
            // for-in 循环
            for (UIViewController *viewController in tabBarController.viewControllers) {
    
                if ([viewController isKindOfClass:[ViewController14 class]]) {
    
                    // 设置首先显示的 viewController
                    /*
                        直接指定视图控制器的名称
                    */
                    tabBarController.selectedViewController = viewController;
                }
            }
    
            // block 循环
            [viewControllerArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    
                if ([obj isKindOfClass:[ViewController14 class]]) {
    
                    tabBarController.selectedViewController = obj;
                }
            }];
    
        // 设置分栏标题文字颜色
        /*
            选中时颜色,默认为蓝色
        */
    
            // 选中时颜色
            tabBarController.tabBar.tintColor = [UIColor greenColor];
    
            // 选中时颜色
            [[UITabBarItem appearance] setTitleTextAttributes:
                                         @{NSForegroundColorAttributeName:[UIColor greenColor]}
                                                                 forState:UIControlStateSelected];
    
            // 未选中时颜色
            [[UITabBarItem appearance] setTitleTextAttributes:
                                         @{NSForegroundColorAttributeName:[UIColor grayColor]}
                                                                 forState:UIControlStateNormal];
    
        // 设置背景颜色
        /*
            一个 tabBarController 只有一个 tabBar
        */
        tabBarController.tabBar.barTintColor = [UIColor blueColor];
    
        // 设置背景图片
        tabBarController.tabBar.backgroundImage = [UIImage imageNamed:@"tabbarBkg.png"];
    
        // 消除图片阴影线
        tabBarController.tabBar.shadowImage = [[UIImage alloc] init];
    
        // 设置分栏图片大小
        /*
            图片尺寸为 49*49 时,此设置值能使图片高度与分栏高度重合
        */
        UITabBarItem *item0 = [tabBarController.tabBar.items objectAtIndex:0];
        item0.imageInsets = UIEdgeInsetsMake(5, 0, -6, 0);
    
        // 关闭分栏的半透明状态
        tabBarController.tabBar.translucent = NO;
    
        // 隐藏分栏视图控制器
        /*
            导航视图控制器推出新的视图时,隐藏新视图下的分栏视图控制器
        */
        tabBarController.hidesBottomBarWhenPushed = YES;
    
        // 设置代理,需遵守协议 <UITabBarControllerDelegate>
        tabBarController.delegate = self;
  • Swift
        // 设置首先显示的视图控制器
    
            // 视图的添加顺序已知
            /*
                用添加顺序的标号指定
            */
            tabBarController.selectedIndex = 1;
    
            // 视图的添加顺序未知
    
                // for-in 循环
                for vc in viewControllerArray {
    
                    if vc.isKindOfClass(ViewController14.self) {
    
                        // 设置首先显示的 viewController
                        /*
                            直接指定视图控制器的名称
                        */
                        tabBarController.selectedViewController = vc
                    }
                }
    
        // 设置分栏标题文字颜色
        /*
            选中时颜色,默认为蓝色
        */
    
            // 选中时颜色
            tabBarController.tabBar.tintColor = UIColor.greenColor()
    
            // 选中时颜色
            UITabBarItem.appearance()
                        .setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.greenColor()],
                                                                       forState: .Selected)
    
            // 未选中时的标题颜色
            UITabBarItem.appearance()
                        .setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.grayColor()],
                                                                       forState: .Normal)
    
        // 设置背景颜色
        /*
            一个 tabBarController 只有一个 tabBar
        */
        tabBarController.tabBar.barTintColor = UIColor.cyanColor()
    
        // 设置背景图片
        tabBarController.tabBar.backgroundImage = UIImage(named: "tabbarBkg.png")
    
        // 消除图片阴影线
        /*
            消除图片边框线
        */
        tabBarController.tabBar.shadowImage = UIImage()
    
        // 设置分栏图片大小
        /*
            图片尺寸为 49*49 时,此设置值能使图片高度与分栏高度重合
        */
        let item0 = tabBarController.tabBar.items?[0]
        item0!.imageInsets = UIEdgeInsetsMake(5, 0, -6, 0)
    
        // 关闭分栏的半透明状态
        tabBarController.tabBar.translucent = false
    
        // 隐藏分栏视图控制器
        /*
            导航视图控制器推出新的视图时,隐藏新视图下的分栏视图控制器
        */
        tabBarController.hidesBottomBarWhenPushed = true
    
        // 设置代理,需遵守协议 UITabBarControllerDelegate
        tabBarController.delegate = self;

3、UITabBarControllerDelegate 协议方法

  • 需遵守协议 UITabBarControllerDelegate,并设置代理
  • Objective-C
        // 将要选择的某个 viewController 是否允许被选择
        - (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {
    
            // 允许编辑
            return YES;
        }
    
        // 已经选择
        - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
    
            NSLog(@"%li", tabBarController.selectedIndex);
        }
    
        // 将要开始编辑(超过5个时进行 edit 时触发)
        - (void)tabBarController:(UITabBarController *)tabBarController willBeginCustomizingViewControllers:(NSArray *)viewControllers {
    
        }
    
        // 已经结束编辑
        - (void)tabBarController:(UITabBarController *)tabBarController willEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed {
    
        }
    
        // 已经结束编辑
        - (void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed {
    
        }
  • Swift
        // 将要选择的某个 viewController 是否允许被选择
        func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool {
    
            // 允许编辑
            return true
        }
    
        // 已经选择
        func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
    
        }
    
        // 将要开始编辑(超过5个时进行 edit 时触发)
        func tabBarController(tabBarController: UITabBarController, willBeginCustomizingViewControllers viewControllers: [UIViewController]) {
    
        }
    
        // 已经结束编辑
        func tabBarController(tabBarController: UITabBarController, willEndCustomizingViewControllers viewControllers: [UIViewController], changed: Bool) {
    
        }
    
        // 已经结束编辑
        func tabBarController(tabBarController: UITabBarController, didEndCustomizingViewControllers viewControllers: [UIViewController], changed: Bool) {
    
        }

4、Storyboard 中设置

  • 在 Storyboard 场景中设置

    • Tab Bar Item

      Badge 未读消息标记
      System Item tabBarItem 类型
      Selected Image 选中时的图片,设置时无效,需在代码中设置
      Title Position 标题的位置
    • Bar Item
      Title tabBarItem 标题
      Image 未选中时的图片
      Tag tag 值
      -- Enable tabBarItem 是否允许点击
  • 在 Storyboard 场景绑定的 Controller 中设置
    • 设置分栏选中时的文字颜色

          /*
              只需要设置一次,在所有的 item 中都会改变
              同时会改变未选中时的图片的颜色
          */
      
          self.tabBarController.tabBar.tintColor = [UIColor greenColor];
    • 设置分栏选中时的图片
          /*
              每个 item 中都需要单独设置
          */
      
          // 在每个场景绑定的 ViewController 中单独设置
      
          self.tabBarItem.selectedImage = [[UIImage imageNamed:@"tabbar_mainframeHL"]
                                               imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
      
          // 在一个场景绑定的 ViewController 中全部设置
      
          UITabBarItem *item0 = [self.tabBarController.tabBar.items objectAtIndex:0];
          item0.selectedImage = [[UIImage imageNamed:@"tabbar_mainframeHL"]
                                               imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
      
          UITabBarItem *item1 = [self.tabBarController.tabBar.items objectAtIndex:1];
          item1.selectedImage = [[UIImage imageNamed:@"tabbar_contactsHL"]
                                               imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
      
          UITabBarItem *item2 = [self.tabBarController.tabBar.items objectAtIndex:2];
          item2.selectedImage = [[UIImage imageNamed:@"tabbar_discoverHL"]
                                               imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
      
          UITabBarItem *item3 = [self.tabBarController.tabBar.items objectAtIndex:3];
          item3.selectedImage = [[UIImage imageNamed:@"tabbar_meHL"]
                                               imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
时间: 2024-10-24 19:21:25

iOS - UITabBarController的相关文章

iOS UITabBarController记录上一次选中的tabIndex并返回

UITabBarController可以实现多个UIViewController独立显示,但是各个UIViewController之间的关系的控制就不太好控制了,特别是没有记录最近一次选中的tab编号,有些需求的实现就比较困难了,比如在A tab下通过一个事件可以切换到上一次选中的B tab,或者A tab中的事件需要切换到B tab并且在B tab处理完成后可以返回到A tab.这时如果可以知道UITabBarController上一次选中的tab编号的话,就可以满足这类需求了. 参考代码  

【iOS】UIViewController、UINavigationController与UITabBarController的整合使用

原文  http://blog.csdn.net/rongxinhua/article/details/20214293 UINavigationController与UITabBarController是iOS开发中最常用的两种视图控制器,它们都属于UIViewController的子类,继承关系如下: @interface UITabBarController : UIViewController @interface UINavigationController : UIViewContr

详解iOS App中UiTabBarController组件的基本用法_IOS

UiTabBarController这个控制器绝对是项目架构时做常用的一个控件. 我们大致看下控件的效果,我们就知道为什么说他常见了. 这就是最简单的一个雏形,想必现在基本70%的应用界面结构都会是这样的. 在Android中我们以ActivityGroup或是现在的fragment来实现,一个容器中包含多个子控制器. 下面我们还是以建立xib文件的形式来实现一个这样的整体布局的例子. 当然在 xcode中我们会发现其实直接有这么一个模板了 但是直接使用模板后会发现是直接在代码里实现了子布局得添

iOS开发中标签控制器的使用——UITabBarController

iOS开发中标签控制器的使用--UITabBarController 一.引言         与导航控制器相类似,标签控制器也是用于管理视图控制器的一个UI控件,在其内部封装了一个标签栏,与导航不同的是,导航的管理方式是纵向的,采用push与pop切换控制器,标签的管理是横向的,通过标签的切换来改变控制器,一般我们习惯将tabBar作为应用程序的根视图控制器,在其中添加导航,导航中在对ViewController进行管理. 二.创建一个标签控制器         通过如下的步骤,我们可以很简便

iOS中 UITabBarController中自定义UITabBar

1.创建多个视图控制器,放如UITabBarController中 AViewController *aa = [[AViewController alloc] init]; UINavigationController* ayNav = [[UINavigationController alloc]initWithRootViewController:aa]; BViewController *bb = [[BViewController alloc] init]; UINavigationC

iOS应用开发中UITabBarController标签栏控制器使用进阶_IOS

做了这么长时间的ios开发了,最基本的UITabBarController和UINavigationController都用了好长时间了,总是改现成的代码,或者各种自定义控件的修改,用的都有些混乱了,呵呵.还是自己做个demo再复习一下吧,记录下来以备后续翻查.一.UITabBarController和UINavigationController的联合使用 这种方法最常见,好像一般有tabbar都会有naviBar.一般使用, 1. 在appDelegate里面创建UITabBarControl

《iOS创意程序设计家》——第6.3节标签页控制器UITabBarController

6.3 标签页控制器UITabBarControlleriOS创意程序设计家相对于导航栏控制器,标签页控制器(UITabBarController)是将几个具有独立功能的界面使用Tab分隔开来,并定义在界面的下方.这些界面会存放在一个数组里面,而里面每个元素则是UIView-Controller的类,当然也可以包括导航栏UINavigationController在内.可以通过viewControllers属性或是setViewControllers: animated:方法来设置标签页控制器所

iOS开发之UITabBarController

1.概述 跟UINavigationController类似,UITabBarController也可以轻松地管理多个控制器,轻松完成控制器之间的切换,典型例子就是QQ.微信等应用. 2.UITabBarController的简单使用 UITabBarController的使用步骤: (1)初始化UITabBarController (2)设置UIWindow的rootViewController为UITabBarController (3)根据具体情况,通过addChildViewContro

iOS开发UI篇—UITabBarController简单介绍

一.简单介绍 UITabBarController和UINavigationController类似,UITabBarController也可以轻松地管理多个控制器,轻松完成控制器之间的切换,典型的例子就是QQ.微信等应⽤. 二.UITabBarController的使用 1.使用步骤: (1)初始化UITabBarController (2)设置UIWindow的rootViewController为UITabBarController (3)创建相应的子控制器(viewcontroller)