(一)有时候一个View里面有多个view,这个大的View来管理多个小的view。那么控制器也是这样的,用一个控制器去管理多个控制器。为了便于控制器管理,iOS提供了两个比较特殊的控制器,UINavgationController和UITabBarController。一般来说一个页面就是一个控制器。
(1)导航条的高度是44,最上面20个点是状态栏。加起来是64。然后用于管理多个控制器,直接push控制器就行了。Navgation也是栈的数据结构。每次push是压栈,看到的都是最后创建的那个。通过nav.viewcontrollers属性就能拿到当前所有的控制器。
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; self.window.backgroundColor = [UIColor clearColor]; UINavigationController *nav = [[UINavigationController alloc] init]; UIViewController *con1 = [[UIViewController alloc] init]; con1.view.backgroundColor = [UIColor yellowColor]; UIViewController *con2 = [[UIViewController alloc] init]; con2.view.backgroundColor = [UIColor orangeColor]; [nav pushViewController:con1 animated:NO]; [nav pushViewController:con2 animated:NO]; // 如果上面动画是NO就是俩,YES就是1,但是数组其实是两个。 NSLog(@"%@",nav.viewControllers); NSLog(@"%@",nav.childViewControllers); self.window.rootViewController = nav; [self.window makeKeyAndVisible];
nav.viewControllers是copy的,nav.childViewControllers是只读的。
(2)在一个Navgation控制器中,特征表示就是上面有标题。整体是一个NavgationController,上面隔开20状态栏后,44个点是NavgationBar,NavgationBar上面是NavgationItem。如果想要设置一个控制器的“返回”按钮或者类型,那就要在前一个控制器实现。
// 如果想要设置一个控制器的返回按钮类型,必须去前一个控制器设置 // 设置一个控制器的标题用title,这些都是在navgationItem中实现的 self.navigationItem.title = @"我是第一个控制器"; self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"自定义返回" style:(UIBarButtonItemStylePlain) target:nil action:nil];
(3)导航栏的内容修改由栈顶控制器的navgationItem来决定的。
3.1左上角返回 :UIBarButtonItem :backItem用上一个控制器来控制
3.2中间标题 : titleView
3.3中间标题文字 : title
3.4左右按钮 : lefr/rightBarButtonItem
所以说,如果要控制颜色,那么bar。如果控制内容,那么item,而控制器就只是控制器。
特例:修改中间title的时候,可以用bar来修改,代码如下:
// 设置中间标题名字,然后设置Bar的字体字典 self.navigationItem.title = @"我只是第三个控制器"; NSDictionary *dict = @{NSFontAttributeName : [UIFont systemFontOfSize:10],NSForegroundColorAttributeName : [UIColor redColor]}; [self.navigationController.navigationBar setTitleTextAttributes:dict];
(4)bar设置一些颜色特效等
4.1高斯模糊:设置bar的背景颜色后,是渐变的。设置tintColor后,整体默认的渲染蓝色会进行更改。
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"高斯模糊" style:UIBarButtonItemStylePlain target:nil action:nil]; self.navigationController.navigationBar.backgroundColor = [UIColor orangeColor]; self.navigationController.navigationBar.tintColor = [UIColor yellowColor];
4.2不渐变,修改整个背景色----》但是这并不是一个纯正的颜色,比一般默认的颜色要深。因为被渲染了,此时要设置一个属性。
self.navigationController.navigationBar.barTintColor = [UIColor greenColor];
self.navigationController.navigationBar.translucent = false;
4.3按钮放置图片时候,也是会被渲染的,想要不渲染要默认设置这个图片不渲染: image imageWithRander....一个方法。
(二)总结
// 设置标题
self.navigationItem.title
self.title
// 设置左右按钮
self.navigationItem.leftBarButtonItem
self.navigationItem.leftBarButtonItems
self.navigationItem.rightBarButtonItem
self.navigationItem.rightBarButtonItems
// 设置标题为自定义view
self.navigationItem.titleView
// nav bar 颜色
[self.navigationController.navigationBar setBackgroundColor:[UIColor redColor]]; // 仅仅是导航条的颜色
[self.navigationController.navigationBar setTintColor:[UIColor redColor]]; // 主题(按钮)颜色
[self.navigationController.navigationBar setBarTintColor:[UIColor redColor]]; // 导航条+状态栏颜色
// 设置bar不透明
self.navigationController.navigationBar.translucent = NO;
// 设置自定义标题
// title
NSDictionary* attr = @{ NSFontAttributeName : [UIFont systemFontOfSize:10],NSForegroundColorAttributeName : [UIColor redColor] };
[self.navigationController.navigationBar setTitleTextAttributes:attr];
// titleView
UILabel* titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 44)];
titleLabel.font = [UIFont boldSystemFontOfSize:20];
titleLabel.textColor =[UIColor orangeColor];
titleLabel.textAlignment = NSTextAlignmentCenter;
titleLabel.text = @"自定义标题";
self.navigationItem.titleView = titleLabel;
// 导航条设置自定义图片为按钮(原始图 不渲染)
UIImage* image = [UIImage imageNamed:@"navigationbar_friendsearch_highlighted"];
image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
// nav bar
// nav controller
// nav item
// 不解释,自己捋...
注意:SB做控制器连线跳转。push都是创建一个。所以往回连也是新创建,那么上面的返回按钮就要执行多次才能返回到最底层的跟控制器。此时就只能创建控制器绑定你要返回的控制器纯代码写了。