UITabBarController
首先什么是一个分栏控制器,在许多常用的app里,分栏控制器都是一个必不可少的控件,我们来看看它的样子。
这是QQ里的分栏控制器,我们可以通过不同的需求来确定不同视图的个数,通过分栏控制器来进行切换。
在UI中,分栏控制器用UITabBarController来创建,我们来拆分这个单词,UI就不说了,Tab的意思是选项卡,Bar有横梁的意思,Controller是控制器的意思。
然后我们来看它的代码实现:
对于新版的Xcode 我们不需要自己创建一个window,系统已经创建好了window,之前是在 AppDelegate.m文件里创建一个window并且创建一个根视图控制器,但现在SceneDelagate.m的文件里直接创建根视图控制器即可。
- 在创建视图控制器之前,我们先来创建他们的视图,我们创建三个视图,以UIViewController作为父类:
VCFirst * vcFirst = [[VCFirst alloc] init];
vcFirst.view.backgroundColor = [UIColor blueColor];
VCSecond * vcSecond = [[VCSecond alloc] init];
vcSecond.view.backgroundColor = [UIColor yellowColor];
VCThird * vcThird = [[VCThird alloc] init];
vcThird.view.backgroundColor = [UIColor orangeColor];
将他们的背景颜色改成不同的颜色便于区分。
它们的标题:
vcFirst.title = @"视图1";
vcSecond.title = @"视图2";
vcThird.title = @"视图3";
接下来是分栏控制器的创建:
UITabBarController * tbController = [[UITabBarController alloc] init];
//创建一个控制器数组对象
//将所有要被分栏控制器管理的对象添加到数组里
NSArray * arrayVC = [NSArray arrayWithObjects:vcFirst, vcSecond, vcThird, nil];
在创建好分栏控制器以后,同时创建一个数组将分栏控制器要控制的视图存储起来。
将分栏视图控制器管理数组赋值,并改变分栏控制器的背景颜色。
//将分栏视图控制器管理数组赋值
tbController.viewControllers = arrayVC;
tbController.view.backgroundColor = [UIColor whiteColor];
//将分栏控制器作为根视图控制器
self.window.rootViewController = tbController;
通过数组有索引值这一特性来控制它,我们控制启动程序即显示索引值为2的视图,然后判断如果这个视图和索引值为2的视图相等,即打印当前显示3。
//设置选中的视图控制器索引
//通过索引来确定哪一个控制器
tbController.selectedIndex = 2;
if (tbController.selectedViewController == vcThird) {
NSLog(@"当前显示3");
}
//是否透明
tbController.tabBar.translucent = NO;
打印结果:
当虚拟机启动时,默认启动至视图3:
在启动之后,我们发现第一个视图的显示和标题和我们初始化的不一样,这是如何做到的呢?
这时候就要用到分栏按钮对象这个东西,用UITabBarItem来创建:
我们来创建并初始化它:
UITabBarItem * tabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemContacts tag:101];
对于UITabBarSystemItemContacts这个参数,就是用来确定按钮的风格。
我们可以看到系统设定的按钮风格多种多样,不同的按钮也会有不同的效果,我们来看看不同按钮的区别。
//按钮右上角的提示信息
//通常用来提示未读的信息
tabBarItem.badgeValue = @"22";
self.tabBarItem = tabBarItem;
视图按钮上的消息提醒也可以通过类固有的属性来显示出来,最后将视图显示上去即可。
UITabBarController高级
首先第一步操作和之前一样,这次创建6个视图:
VCFirst * vc01 = [[VCFirst alloc] init];
VCSecond * vc02 = [[VCSecond alloc] init];
VCThird * vc03 = [[VCThird alloc] init];
VCFour * vc04 = [[VCFour alloc] init];
VCFive * vc05 = [[VCFive alloc] init];
VCSix * vc06 = [[VCSix alloc] init];
vc01.view.backgroundColor = [UIColor blueColor];
vc02.view.backgroundColor = [UIColor yellowColor];
vc03.view.backgroundColor = [UIColor purpleColor];
vc04.view.backgroundColor = [UIColor grayColor];
vc05.view.backgroundColor = [UIColor greenColor];
vc06.view.backgroundColor = [UIColor orangeColor];
vc01.title = @"视图1";
vc02.title = @"视图2";
vc03.title = @"视图3";
vc04.title = @"视图4";
vc05.title = @"视图5";
vc06.title = @"视图6";
NSArray * arrayVC = [NSArray arrayWithObjects:vc01, vc02, vc03, vc04, vc05, vc06, nil];
UITabBarController * tbc = [[UITabBarController alloc] init];
tbc.viewControllers = arrayVC;
tbc.tabBar.translucent = NO;
self.window.rootViewController = tbc;
我们运行会发现只显示了四个视图,剩下两个在More里:
这时候就会出现新的功能,视图的顺序就可以调整:
我们可以通过拖动来选择显示哪个视图。
这时候我们给类的声明里添加两个协议,通过协议方法来显示这个过程:
@interface SceneDelegate : UIResponder <UIWindowSceneDelegate, UITabBarControllerDelegate>
协议里方法的创建:
- (void)tabBarController:(UITabBarController *)tabBarController willBeginCustomizingViewControllers:(NSArray<__kindof UIViewController *> *)viewControllers {
NSLog(@"编辑器前");
}
- (void)tabBarController:(UITabBarController *)tabBarController willEndCustomizingViewControllers:(NSArray<__kindof UIViewController *> *)viewControllers changed:(BOOL)changed{
NSLog(@"即将结束");
}
- (void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray<__kindof UIViewController *> *)viewControllers changed:(BOOL)changed {
if (changed == YES) {
NSLog(@"顺序发生改变");
}
NSLog(@"已经结束");
}
输出结果: