一. 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;
@property(nonatomic,readonly) UINavigationController *moreNavigationController;
@property(nonatomic,copy) NSArray *customizableViewControllers;
@property(nonatomic,readonly) UITabBar *tabBar
@property(nonatomic,assign) id<UITabBarControllerDelegate> delegate;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
三. UITabBarController的代理方法
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController;
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController;
- (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;
四. UITabBarController的原理
-
当UITabBarController做为Window的根控制器时,程序一启动,UITabBarController就会一次性初始化所有子控制器,但是默认只加载第一个控制器视图,其他视图控制器只初始化,但默认不会加载,只有在需要显示的时候才调用loadView方法加载。特殊情况:在AppDelegate中设置其他的子控制器视图的背景颜色,就会提前加载该控制器视图,但不显示该视图。
-
每一个控制器视图只加载一次,就会一直存在内存中,当切换子控制器时直接显示,不显示在屏幕上的子控制器不会被销毁。当遇到内存警告时,会释放掉没有加载的子控制器。
-
每个视图控制器都有一个tabBarController属性,通过它可以访问所在的UITabBarController,而且对于UITabBarController的直接子视图,其tabBarController属性相当于它的父视图parentViewController。
-
每个视图控制器都有一个tabBarItem属性,通过它控制视图在UITabBarController的tabBar中的显示信息
-
tabBarItem的image属性必须是png格式(建议大小32*32),并且打开alpha通道否则无法正常显示。
-
当往UITabBarController添加子控制器,标签栏就会有序的自动生成对应的UITabBarButton对象,有多少个子控制器,标签栏就有多少个UITabBarButton对象,但是子控制器的数量超过5个的时候,标签栏上的第五个UITabBarButton对象就会显示成”More”类型的按钮。
五. UITabBarController的知识点
(一). 关于UITabBarController
-
UITabBarController没有根控制器的概念。在添加了相同的子控制器,不会增加tabitem的数量。子控器可以是UIViewController、UINavigationController、UITableViewController或者其他的视图控制器
-
UITabBarButton在UITabBar中的位置是均分的,UITabBar的高度为49,UITabBarButton⾥面显⽰什么内容,由对应子控制器的tabBarItem属性来决定
-
UITabBarController一般作为应用程序的rootViewController,但是它不能作为UINavigationController的根控制器
-
UITabBarController默认只支持竖屏,当设备方向放生变化时候,它会查询viewControllers属性中包含的所有ViewController,仅当所有的viewController都支持该方向时,UITabBarController才会发生旋转,否则默认的竖向
(二). 关于UITabBar
1. 简介
UITabBar继承于UIView,方便用户切换到对应的界面,当往标签控制器里添加子控制器,标签栏就会有序的自动生成对应的标签;创建一个标签控制器,就默认创建一个标签栏,标签栏最多显示5个标签
2. 常用属性和方法
@property(nonatomic,assign) id<UITabBarDelegate> delegate;
@property(nonatomic,copy) NSArray *items;
@property(nonatomic,assign) UITabBarItem *selectedItem;
@property(nonatomic,retain) UIColor *tintColor;
@property(nonatomic,retain) UIColor *barTintColor;
@property(nonatomic,retain) UIImage *backgroundImage
@property(nonatomic,retain) UIImage *selectionIndicatorImage
@property(nonatomic,retain) UIImage *shadowImage
- (void)setItems:(NSArray *)items animated:(BOOL)animated;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
3. UITabBar的数据模型
UITabBar的每个按钮的内容由对应的子控制的tabBarItem属性决定
---------- UITabBarItem的常用接口
@interface UITabBarItem : UIBarItem
@property(nonatomic,retain) UIImage *selectedImage;
@property(nonatomic,copy) NSString *badgeValue;
- (instancetype)initWithTitle:(NSString *)title image:(UIImage *)image tag:(NSInteger)tag;
- (instancetype)initWithTitle:(NSString *)title image:(UIImage *)image selectedImage:(UIImage *)selectedImage;
- (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,
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
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的简单使用
(一). 使用步骤:
-
初始化UITabBarController
-
设置UIWindow的rootViewController为UITabBarController
-
创建相应的子控制器(viewcontroller)
-
把子控制器添加到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 addChildViewController:vc1];
[tabBarC addChildViewController:vc2];
[tabBarC addChildViewController:nav];
tabBarC.tabBar.backgroundImage = [UIImage imageNamed:@"Snip20160825_2"];
return YES;
}
@end
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
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