UITabBarController详解

来源:互联网 发布:js除以一个数取整 编辑:程序博客网 时间:2024/05/21 10:24

一. UITabBarController简介

(一). 继承关系

UITabBarController和UINavigationController类似,也继承于UIViewController,也可以轻松地管理多个控制器,轻松完成控制器之间的切换,典型的例子就是QQ、微信等应⽤。

(二). 基本概念

父控制器:通过标签控制器管理多个子控制器,标签控制器就称为父控制器

子控制器:添加到标签控制器里的控制器都做为标签控制器的子控制器

标签栏:也叫选项卡栏,方便用户切换到对应的界面,当往标签控制器里添加子控制器,标签栏就会有序的自动生成对应的标签

标签栏按钮:也叫标签,UITabBarButton,这个类只有apple内部开发人员才能使用

二. UITabBarController常见属性和方法

// 以数组的方式设置子控制器@property(nonatomic,copy) NSArray *viewControllers;// 以数组的方式设置子控制器- (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated;// 通过设置选中的子控制器,设置默认显示的子控制器@property(nonatomic,assign) UIViewController *selectedViewController;// 通过设置选中的子控制的索引,设置默认显示的子控制器@property(nonatomic) NSUInteger selectedIndex;// moreNavigationController是默认创建的,只有子控制器的数量超过5个的时候才显示”More”按钮@property(nonatomic,readonly) UINavigationController *moreNavigationController;// 在”More”的控制器视图中,有一个“Edit”按钮,设置这个按钮里面显示的自定义控制器,默认是所有控制器// 注意:当UITabBarController的viewControllers属性发生变化的时候,customizableViewControllers就会自动设置成跟viewControllers一致@property(nonatomic,copy) NSArray *customizableViewControllers;// 只读,标签栏,默认生成@property(nonatomic,readonly) UITabBar *tabBar// 代理@property(nonatomic,assign) id<UITabBarControllerDelegate> delegate;

三. UITabBarController的代理方法

// 是否允许选中控制器viewController- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController;// 选中控制器时调用- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController;// 当点击”More”的控制器视图里的“Edit”按钮时调用- (void)tabBarController:(UITabBarController *)tabBarController willBeginCustomizingViewControllers:(NSArray *)viewControllers;// 点击”More”的控制器视图里的“Edit”按钮,在即将退出编辑时调用- (void)tabBarController:(UITabBarController *)tabBarController willEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed;// 点击”More”的控制器视图里的“Edit”按钮,在退出编辑后调用- (void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed;

四. UITabBarController的原理

  1. 当UITabBarController做为Window的根控制器时,程序一启动,UITabBarController就会一次性初始化所有子控制器,但是默认只加载第一个控制器视图,其他视图控制器只初始化,但默认不会加载,只有在需要显示的时候才调用loadView方法加载。特殊情况:在AppDelegate中设置其他的子控制器视图的背景颜色,就会提前加载该控制器视图,但不显示该视图。

  2. 每一个控制器视图只加载一次,就会一直存在内存中,当切换子控制器时直接显示,不显示在屏幕上的子控制器不会被销毁。当遇到内存警告时,会释放掉没有加载的子控制器。

  3. 每个视图控制器都有一个tabBarController属性,通过它可以访问所在的UITabBarController,而且对于UITabBarController的直接子视图,其tabBarController属性相当于它的父视图parentViewController。

  4. 每个视图控制器都有一个tabBarItem属性,通过它控制视图在UITabBarController的tabBar中的显示信息

  5. tabBarItem的image属性必须是png格式(建议大小32*32),并且打开alpha通道否则无法正常显示。

  6. 当往UITabBarController添加子控制器,标签栏就会有序的自动生成对应的UITabBarButton对象,有多少个子控制器,标签栏就有多少个UITabBarButton对象,但是子控制器的数量超过5个的时候,标签栏上的第五个UITabBarButton对象就会显示成”More”类型的按钮。

五. UITabBarController的知识点

(一). 关于UITabBarController

  1. UITabBarController没有根控制器的概念。在添加了相同的子控制器,不会增加tabitem的数量。子控器可以是UIViewController、UINavigationController、UITableViewController或者其他的视图控制器

  2. UITabBarButton在UITabBar中的位置是均分的,UITabBar的高度为49,UITabBarButton⾥面显⽰什么内容,由对应子控制器的tabBarItem属性来决定

  3. UITabBarController一般作为应用程序的rootViewController,但是它不能作为UINavigationController的根控制器

  4. UITabBarController默认只支持竖屏,当设备方向放生变化时候,它会查询viewControllers属性中包含的所有ViewController,仅当所有的viewController都支持该方向时,UITabBarController才会发生旋转,否则默认的竖向

(二). 关于UITabBar

1. 简介

UITabBar继承于UIView,方便用户切换到对应的界面,当往标签控制器里添加子控制器,标签栏就会有序的自动生成对应的标签;创建一个标签控制器,就默认创建一个标签栏,标签栏最多显示5个标签

2. 常用属性和方法

// 代理@property(nonatomic,assign) id<UITabBarDelegate> delegate;// 设置数据模型,不能给系统默认创建的UITabBar设置items@property(nonatomic,copy) NSArray *items;// 设置选中数据模型,不能给系统默认创建的UITabBar设置selectedItem@property(nonatomic,assign) UITabBarItem *selectedItem;// iOS7之前,tintColor可以修改背景色@property(nonatomic,retain) UIColor *tintColor;// iOS7之后,修改背景色只能用barTintColor@property(nonatomic,retain) UIColor *barTintColor;// 设置UITabBar的背景图片@property(nonatomic,retain) UIImage *backgroundImage// 设置选中的按钮的背景图片@property(nonatomic,retain) UIImage *selectionIndicatorImage// 设置阴影图片,但必须设置backgroundImage属性@property(nonatomic,retain) UIImage *shadowImage// 设置数据模型,不能给系统默认创建的UITabBar设置items- (void)setItems:(NSArray *)items animated:(BOOL)animated;

3. UITabBar的数据模型

UITabBar的每个按钮的内容由对应的子控制的tabBarItem属性决定

----------  UITabBarItem的常用接口@interface UITabBarItem : UIBarItem// 设置选中图片@property(nonatomic,retain) UIImage *selectedImage;// 设置角标,一般用于提示用户有新消息@property(nonatomic,copy) NSString *badgeValue;// 初始化UITabBarItem对象- (instancetype)initWithTitle:(NSString *)title image:(UIImage *)image tag:(NSInteger)tag;// 初始化UITabBarItem对象- (instancetype)initWithTitle:(NSString *)title image:(UIImage *)image selectedImage:(UIImage *)selectedImage;// 初始化UITabBarItem对象- (instancetype)initWithTabBarSystemItem:(UITabBarSystemItem)systemItem tag:(NSInteger)tag;@end----------  UIBarItem的常用接口@interface UIBarItem : NSObject// 是否有效@property(nonatomic,getter=isEnabled) BOOL enabled;// 设置标题@property(nonatomic,copy) NSString *title;// 设置图片@property(nonatomic,retain) UIImage *image;// 设置横向图片@property(nonatomic,retain) UIImage *landscapeImagePhone; // 设置图片边距@property(nonatomic) UIEdgeInsets imageInsets;// 设置横向图片边距@property(nonatomic) UIEdgeInsets landscapeImagePhoneInsets;// 设置对应的控制器的标签@property(nonatomic) NSInteger tag;@end----------  UITabBarSystemItem的枚举类型typedef NS_ENUM(NSInteger, UITabBarSystemItem) {    UITabBarSystemItemMore,    UITabBarSystemItemFavorites,    UITabBarSystemItemFeatured,    UITabBarSystemItemTopRated,    UITabBarSystemItemRecents,    UITabBarSystemItemContacts,    UITabBarSystemItemHistory,    UITabBarSystemItemBookmarks,    UITabBarSystemItemSearch,    UITabBarSystemItemDownloads,    UITabBarSystemItemMostRecent,    UITabBarSystemItemMostViewed,};

4. UITabBar的代理方法

UITabBar的代理方法与UITabBarController的代理方法有些类似

// 选中时调用- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item;// 即将编辑时调用- (void)tabBar:(UITabBar *)tabBar willBeginCustomizingItems:(NSArray *)items;  // 编辑时调用                  - (void)tabBar:(UITabBar *)tabBar didBeginCustomizingItems:(NSArray *)items; // 即将结束编辑时调用        - (void)tabBar:(UITabBar *)tabBar willEndCustomizingItems:(NSArray *)items changed:(BOOL)changed; // 结束编辑时调用- (void)tabBar:(UITabBar *)tabBar didEndCustomizingItems:(NSArray *)items changed:(BOOL)changed;

5. 覆盖UITabBarController自带的tabBar为自定义的tabBar操作原理

tabBar上的按钮是在viewDidAppear的时候拿到 self.tabBar 再调用addSubViews添加上去的,在viewDidAppear之前把控制器的tabBar换成我们自己的tabBar,就会把tabBar上的按钮添加到自己的tabBar上。但是tabBar控制器的tabBar属性是只读的,不能直接赋值,可以利用运行时机制发送消息

六. UITabBarController的简单使用

(一). 使用步骤:

  1. 初始化UITabBarController

  2. 设置UIWindow的rootViewController为UITabBarController

  3. 创建相应的子控制器(viewcontroller)

  4. 把子控制器添加到UITabBarController

(二). 具体代码

1. AppDelegate.m文件

#import "AppDelegate.h"#import "ViewController.h"#import "TwoViewController.h"#import "NavigationController.h"@interface AppDelegate ()@end@implementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  // 创建窗口  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];  // 创建标签控制器  UITabBarController *tabBarC = [[UITabBarController alloc] init];  // 设置窗口的根控制器为标签控制器  self.window.rootViewController = tabBarC;  // 显示窗口  [self.window makeKeyAndVisible];  // 创建标签控制器的子控制器  ViewController *vc1 = [[ViewController alloc] init];  TwoViewController *vc2  =[[TwoViewController alloc] init];  NavigationController *nav = [[NavigationController alloc] init];  // 添加子控制器方式一  //tabBarC.viewControllers = @[vc1,vc2,nav];  // 添加子控制器方式二  [tabBarC addChildViewController:vc1];  [tabBarC addChildViewController:vc2];  [tabBarC addChildViewController:nav];  // 设置标签栏的背景图片  tabBarC.tabBar.backgroundImage = [UIImage imageNamed:@"Snip20160825_2"];  return YES;}@end

2. ViewController.m文件

#import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (instancetype)init {  if (self = [super init]) {    // 设置标题    self.tabBarItem.title = @"界面1";    // 设置图片,只有设置图片的渲染模式,才能看到图片    self.tabBarItem.image = [[UIImage imageNamed:@"Snip20160825_1"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];    // 设置角标,如果没有设置图片,角标默认显示在左上角,设置了图片就会在图片的右上角显示    self.tabBarItem.badgeValue = @"10";  }  return self;}- (void)viewDidLoad {  self.view.backgroundColor = [UIColor redColor];}@end

3. TwoViewController.m文件

#import "TwoViewController.h"@interface TwoViewController ()@end@implementation TwoViewController- (instancetype)init {  if (self = [super init]) {    // 设置标题    self.tabBarItem.title = @"界面2";  }  return self;}- (void)viewDidLoad {  self.view.backgroundColor = [UIColor greenColor];}@end

4. NavigationController.m文件

#import "NavigationController.h"@interface NavigationController ()@end@implementation NavigationController- (instancetype)init {  if (self = [super init]) {    // 设置标题    self.tabBarItem.title = @"界面3";    // 设置图片,只有设置图片的渲染模式,才能看到图片    // 设置角标,如果没有设置图片,角标默认显示在左上角,设置了图片就会在图片的右上角显示    self.tabBarItem.badgeValue = @"100";  }  return self;}- (void)viewDidLoad {  self.view.backgroundColor = [UIColor blueColor];}@end
0 0
原创粉丝点击