UINavigationController

1、认识UINavigationController

  • 容器视图控制器的一种,称之为导航视图控制器,导航视图控制器固定高度是非全面屏44,全面屏88。
  • 导航视图控制器中存放的是视图控制器。
  • 导航条的颜色与状态条相同。

1、navigationController 的创建

ViewController1 *viewController1 = [[ViewController1 alloc] init];

// 相当于将 viewController1 对象放到 navigationController 容器中,现在容器中只有一个视图控制器
UINavigationController *navigationController = [[UINavigationController alloc] 
           initWithRootViewController: viewController1];

// 将 navigationController 添加到 viewController 上
[self addChildViewController:navigationController];
[self.view addSubview:navigationController.view];

// 将 navigationController 做为 window 的根视图控制器
self.window.rootViewController = navigationController;    

2、navigationBar 导航条的设置

  • 自定义iOS导航栏背景,标题和返回按钮文字颜色

  • navigationBar 属性是属于 navigationController 的,不是某个 viewController 的,在一个 viewController 中设置,其他的 viewController 的导航条也会改变。
  • 导航条的设置除 appearance 外都在 viewController 中完成设置。
// 设置导航条类型
self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
// 设置导航条标题文字的字体和颜色, appearance 用于对没有创建的控件进行统一设置,无法对已经创建的控件进行设置
[UINavigationBar appearance].titleTextAttributes = @{NSFontAttributeName:[UIFont boldSystemFontOfSize:20], 
  NSForegroundColorAttributeName:[UIColor yellowColor]};
// 设置按钮文字颜色:设置按钮的颜色,默认为蓝色
self.navigationController.navigationBar.tintColor = [UIColor redColor];
// 设置导航条背景颜色:默认为白色半透明
self.navigationController.navigationBar.barTintColor = [UIColor lightGrayColor];

// 设置导航条的背景图片
/*
如果图片的高正好是 44,图片与整个导航的高重合,这时候最上面 20 的状态条回到 ios6 以前的效果变成黑色的。
如果图片的高不是 44,哪怕比 44 多一个像素 45,这时候图片往上拉伸,占据状态栏的 20,这时整个高度为 64。
*/
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"pic2"] 
      forBarMetrics:UIBarMetricsDefault];
/*
设置是否关闭导航条半透明状态
NO:关闭,关闭时导航控制器下方视图的 y 坐标为 64,打开时为 20。默认打开
*/
self.navigationController.navigationBar.translucent = NO;

// 设置是否隐藏导航视图控制器:显示时导航控制器下方视图的 y 坐标为 64,隐藏时为 20
self.navigationController.navigationBarHidden = YES;

3、navigationItem 导航栏的设置

  • navigationItem 属性不是公有的,是每个 ViewController 都有一个自己 navigationItem,设置自己界面上的 navigationItem 属性不会影响其他的 viewController 界面。
  • 导航栏的设置在 viewController 中完成设置。不设置左侧按钮(leftBarButtonItem)时,系统会自动以上一个视图控制器的标题作为左侧按钮,并自带返回响应事件。
// 设置导航栏提示内容:导航栏提供了一个很少用的提示模式,该模式将高度扩展了 30 像素
self.navigationItem.prompt = @"hello";
// 设置标题
self.navigationItem.title = @"详情页";

// 设置自定义标题视图:x,y,width 设置无效,图片不会自动压缩
self.navigationItem.titleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"logo_title.png"]];

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 0, 35)];
imageView.image = [UIImage imageNamed:@"logo_title.png"];
self.navigationItem.titleView = imageView;

// 设置按钮文字颜色:需要先设置按钮才能生效,iOS6 中是设置背景颜色,在 iOS7 以后变成设置文字颜色
self.navigationItem.leftBarButtonItem.tintColor = [UIColor redColor];
self.navigationItem.rightBarButtonItem.tintColor = [UIColor greenColor];

// 设置导航栏按钮

// 1、通过设置标题文字设置
/*
设置左侧按钮,当设置左按钮的时候,自动隐藏系统自带的返回上一页,需手动设置按钮点击事件
*/
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" 
                           style:UIBarButtonItemStylePlain 
                          target:self 
                          action:@selector(leftButtonClick:)];

// 2、通过系统编辑按钮设置
/*
系统自带的导航专用编辑按钮,点击后变为 Done,再次点击变回 Edit,自带点击响应事件
*/
self.navigationItem.rightBarButtonItem = self.editButtonItem;

// 系统自带编辑按钮点击响应事件,self.editButtonItem 自带的点击事件
- (void)setEditing:(BOOL)editing animated:(BOOL)animated {

	// 使用这个方法时,需要让父类也执行一下这个方法
	[super setEditing:editing animated:animated];
}

// 3、通过系统提供的样式设置
/*
UIBarButtonSystemItemDone,           Done
UIBarButtonSystemItemCancel,         Cancel
UIBarButtonSystemItemEdit,           Edit
UIBarButtonSystemItemSave,           Save
UIBarButtonSystemItemUndo,           Undo
UIBarButtonSystemItemRedo,           Redo
UIBarButtonSystemItemAdd,            加号 图标按钮
UIBarButtonSystemItemFlexibleSpace,  弹簧 按钮,将 button 推向两边
UIBarButtonSystemItemFixedSpace,     弹簧 按钮,将 button 推向两边,
     可设间距 fixedSpaceButton.width = 50;
UIBarButtonSystemItemCompose,        撰写 图标按钮
UIBarButtonSystemItemReply,          答复 图标按钮
UIBarButtonSystemItemAction,         详情 图标按钮
UIBarButtonSystemItemOrganize,       文件夹 图标按钮
UIBarButtonSystemItemBookmarks,      书籍 图标按钮
UIBarButtonSystemItemSearch,         搜索 图标按钮
UIBarButtonSystemItemRefresh,        刷新 图标按钮
UIBarButtonSystemItemStop,           X 号 图标按钮
UIBarButtonSystemItemCamera,         相机 图标按钮
UIBarButtonSystemItemTrash,          删除 图标按钮
UIBarButtonSystemItemPlay,           播放 图标按钮
UIBarButtonSystemItemPause,          暂停 图标按钮
UIBarButtonSystemItemRewind,         快退 图标按钮
UIBarButtonSystemItemFastForward,    快进 图标按钮
*/

self.navigationItem.rightBarButtonItem =[[UIBarButtonItem alloc] 
initWithBarButtonSystemItem: UIBarButtonSystemItemCamera 
                     target: self 
                     action: @selector(rightButtonClick:)];

// 4、通过图片设置
/*
处理阴影,如果直接设置 image 出现阴影,这时候需要设置图片渲染方式
*/
UIImage *image = [[UIImage imageNamed:@"main_right_nav.png"] 
 imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] 
               initWithImage:image 
                       style:UIBarButtonItemStylePlain 
                      target:self 
                      action:@selector(rightButtonClick:)];

// 5、通过自定义视图设置
/*
前两个坐标设置无效,图片会自动压缩
*/
UIButton *myView = [UIButton buttonWithType:UIButtonTypeCustom];
myView.frame = CGRectMake(0, 0, 50, 30);
[myView setBackgroundImage:[UIImage imageNamed:@"pic1"] forState:UIControlStateNormal];
[myView addTarget:self action:@selector(rightButtonClick:) forControlEvents:UIControlEventTouchUpInside];

self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:myView];

4、toolBar 工具条的设置

  • navigationController 自带的 toolbar 属性是所有添加在 navigationController 上的视图所共用的,是属于 navigationController 的,不是属于每个 ViewController 的,但 toolbar 上显示的内容的是每个 ViewController 的,需要在每个 ViewController 上单独设置。
  • toolbar 的显示状态会被带到已经显示过的 ViewController 上,跳转到未显示过的 ViewController 时,toolbar 再次被隐藏。
// 显示 toolBar
/*
toolBar 默认是隐藏的,首先需要让它显示出来,默认在屏幕的最下方
*/
self.navigationController.toolbarHidden = NO;

// 向 toolBar 添加按钮
/*
往 toolBar 上添加按钮,最多只能显示8个,往 self.navigationController.toolbarItems 上添加时无用
*/
self.toolbarItems = buttonArray;

5、NC 中 viewController 页面设置

// 标题会显示在导航视图控制器中根视图的导航条中
viewController1.title = @"vc1 title";
viewController1.navigationItem.title = @"vc1";

// 隐藏分栏视图控制器:导航视图控制器推出新的视图时,隐藏新视图下的分栏视图控制器
viewController1.hidesBottomBarWhenPushed = YES;

6、NC 中 viewController 页面跳转

  • 跳转到未设置背景颜色(包含 clearColor)的 ViewController 界面时,会发生卡顿的现象。
// 跳转到新页
// 推出新页:自动将 otherViewController 添加到 navigationController 容器中
[self.navigationController pushViewController:otherViewController animated:YES];

// 跳转到已添加页
// 返回上一页
[self.navigationController popViewControllerAnimated:YES];

// 返回到指定页:viewController 添加在容器视图中的顺序已知
[self.navigationController popToViewController:self.navigationController.viewControllers[1] 
  animated:YES];

// 返回到指定页:viewController 添加在容器视图中的顺序未知
for (UIViewController *viewController in self.navigationController.viewControllers) {
	if ([viewController isKindOfClass:[ViewController3 class]]) {
			// 回到指定的某一页
			[self.navigationController popToViewController:viewController animated:YES];
		}
}

// 返回到根视图
[self.navigationController popToRootViewControllerAnimated:YES];

7、创建假导航

  • 由假导航跳转到已经存在的 ViewController 界面时,需要在要跳转到的 ViewController 界面中打开显示原生导航。
- (void)viewWillAppear:(BOOL)animated {
	// 隐藏原生导航:从其它视图控制器进入该视图控制器时隐藏原生导航,在该视图控制器中显示自定义的假导航
	self.navigationController.navigationBarHidden = YES;
}

- (void)viewWillDisappear:(BOOL)animated {

	// 显示原生导航:退出该视图控制器时打开显示,在其它的视图控制其中继续显示原生导航
	self.navigationController.navigationBarHidden = NO;
}

8、设置转场动画

  • 添加上一个页面 push 到本页面的动画效果。
// 创建动画
CATransition *animation = [CATransition animation];
// 设置动画时间
animation.duration = 1;

// 设置动画方向
/*
四种预设,某些类型中此设置无效:

kCATransitionFromRight
kCATransitionFromLeft
kCATransitionFromTop
kCATransitionFromBottom
*/
animation.subtype = kCATransitionFromTop;

// 设置动画类型
/*
基本型:
kCATransitionFade      交叉淡化过渡
kCATransitionMoveIn    新视图移到旧视图上面
kCATransitionPush      新视图把旧视图推出去
kCATransitionReveal    将旧视图移开,显示下面的新视图

用字符串表示的类型:
fade   moveIn  push    reveal    和系统自带的四种一样
pageCurl   pageUnCurl            翻页
rippleEffect                     滴水效果
suckEffect                       收缩效果,如一块布被抽走
cube   alignedCube               立方体效果
flip   alignedFlip   oglFlip     翻转效果
rotate                           旋转
cameraIris     cameraIrisHollowOpen    cameraIrisHollowClose      相机
*/
animation.type = kCATransitionMoveIn;

animation.type = @"pageCurl";

// 添加动画效果:向导航视图控制器上添加动画效果,添加完后再进行跳转
[self.navigationController.view.layer addAnimation:animation forKey:@"animation"];

9、导航控制器的管理原则

posted @ 2018-06-09 00:27  CH520  阅读(403)  评论(0编辑  收藏  举报