1、认识UINavigationController
- 容器视图控制器的一种,称之为导航视图控制器,导航视图控制器固定高度是非全面屏44,全面屏88。
- 导航视图控制器中存放的是视图控制器。
- 导航条的颜色与状态条相同。
1、navigationController 的创建
复制ViewController1 *viewController1 = [[ViewController1 alloc] init];
UINavigationController *navigationController = [[UINavigationController alloc]
initWithRootViewController: viewController1];
[self addChildViewController:navigationController];
[self.view addSubview:navigationController.view];
self.window.rootViewController = navigationController;
2、navigationBar 导航条的设置
-
- navigationBar 属性是属于 navigationController 的,不是某个 viewController 的,在一个 viewController 中设置,其他的 viewController 的导航条也会改变。
- 导航条的设置除 appearance 外都在 viewController 中完成设置。
self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
[UINavigationBar appearance].titleTextAttributes = @{NSFontAttributeName:[UIFont boldSystemFontOfSize:20],
NSForegroundColorAttributeName:[UIColor yellowColor]};
self.navigationController.navigationBar.tintColor = [UIColor redColor];
self.navigationController.navigationBar.barTintColor = [UIColor lightGrayColor];
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"pic2"]
forBarMetrics:UIBarMetricsDefault];
self.navigationController.navigationBar.translucent = NO;
self.navigationController.navigationBarHidden = YES;
3、navigationItem 导航栏的设置
- navigationItem 属性不是公有的,是每个 ViewController 都有一个自己 navigationItem,设置自己界面上的 navigationItem 属性不会影响其他的 viewController 界面。
- 导航栏的设置在 viewController 中完成设置。不设置左侧按钮(leftBarButtonItem)时,系统会自动以上一个视图控制器的标题作为左侧按钮,并自带返回响应事件。
self.navigationItem.prompt = @"hello";
self.navigationItem.title = @"详情页";
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;
self.navigationItem.leftBarButtonItem.tintColor = [UIColor redColor];
self.navigationItem.rightBarButtonItem.tintColor = [UIColor greenColor];
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回"
style:UIBarButtonItemStylePlain
target:self
action:@selector(leftButtonClick:)];
self.navigationItem.rightBarButtonItem = self.editButtonItem;
- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
[super setEditing:editing animated:animated];
}
self.navigationItem.rightBarButtonItem =[[UIBarButtonItem alloc]
initWithBarButtonSystemItem: UIBarButtonSystemItemCamera
target: self
action: @selector(rightButtonClick:)];
UIImage *image = [[UIImage imageNamed:@"main_right_nav.png"]
imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]
initWithImage:image
style:UIBarButtonItemStylePlain
target:self
action:@selector(rightButtonClick:)];
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];
- navigationController 自带的 toolbar 属性是所有添加在 navigationController 上的视图所共用的,是属于 navigationController 的,不是属于每个 ViewController 的,但 toolbar 上显示的内容的是每个 ViewController 的,需要在每个 ViewController 上单独设置。
- toolbar 的显示状态会被带到已经显示过的 ViewController 上,跳转到未显示过的 ViewController 时,toolbar 再次被隐藏。
self.navigationController.toolbarHidden = NO;
self.toolbarItems = buttonArray;
5、NC 中 viewController 页面设置
viewController1.title = @"vc1 title";
viewController1.navigationItem.title = @"vc1";
viewController1.hidesBottomBarWhenPushed = YES;
6、NC 中 viewController 页面跳转
- 跳转到未设置背景颜色(包含 clearColor)的 ViewController 界面时,会发生卡顿的现象。
[self.navigationController pushViewController:otherViewController animated:YES];
[self.navigationController popViewControllerAnimated:YES];
[self.navigationController popToViewController:self.navigationController.viewControllers[1]
animated:YES];
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、设置转场动画
CATransition *animation = [CATransition animation];
animation.duration = 1;
animation.subtype = kCATransitionFromTop;
animation.type = kCATransitionMoveIn;
animation.type = @"pageCurl";
[self.navigationController.view.layer addAnimation:animation forKey:@"animation"];
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)