说说UINavigationController那些事儿(下)
2016-12-31 00:08
162 查看
自定义后退按钮
直接上代码// 1 设置自定义后退按钮 UIButton *backButton = [[UIButton alloc] initWithTitle:@"返回" image:[UIImage imageNamed:@"return_l"] color:[UIColor colorWithRed:88.0f/255.0f green:195.0f/255.0f blue:224.0f/255.0f alpha:1.0] fontSize:15]; [backButton addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside]; UIBarButtonItem* leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton]; // 调整间距 // UIBarButtonItem *seperator1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil]; // seperator1.width = -10; //控制器跳转的时候隐藏tabBar viewController.hidesBottomBarWhenPushed = YES; //设置导航条上的item viewController.navigationItem.leftBarButtonItems = @[leftBarButtonItem]; //后退 - (void)back { [self popViewControllerAnimated:YES]; }
跳到指定的控制器
//定义一个数组来接收所有导航控制器里的视图控制器 NSArray *controllers = self.navigationController.viewControllers; //根据索引号直接pop到指定视图 [self.navigationController popToViewController:[controllers objectAtIndex:1] animated:YES];
在iOS开发中,经常需要从一个无NavigationBar的控制器push到一个有NavigationBar的控制器,或者相反。看似只要设置一下NavigationBar的Hidden属性就可以了,其实里面还有不少坑。
隐藏导航栏
[self.navigationController setNavigationBarHidden:YES];
倘若下一级页需要显示导航,再简单
self.navigationController.navigationBarHidden = NO;
真的就这么easy?
有小伙伴就会说了,当然简单啊~~~
隐藏导航栏的方法很简单,只要在控制器将要出现的时候设置NavigationBar隐藏就可以了,然后在控制器将要消失的时候重新显示NavigationBar,
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // 隐藏导航栏方法1 self.navigationController.navigationBarHidden = YES; // 方法2 // [self.navigationController setNavigationBarHidden:YES]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self.navigationController setNavigationBarHidden:NO]; }
效果如下
细心的小伙伴会发现切换的过程并不顺滑:1.有导航栏的控制器出现时,导航栏会立即出现,而控制器的View是自右向左渐入的(简书其实就是这样的);2.点击返回按钮时,导航栏消失且右侧会出现黑边。如图所示
导航栏的显示和隐藏是不是也应该有个animated属性。果不其然,设置导航栏隐藏还有另一个方法可以开启和关闭动画,
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController setNavigationBarHidden:YES animated:YES]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self.navigationController setNavigationBarHidden:NO animated:YES]; }
我们开启动画之后再看看效果
导航栏的显示和控制器的View显示都有动画了,pop的时候也不会出现黑边了。这个animated属性官方是这样解释的:If animated, it will transition vertically using UINavigationControllerHideShowBarDuration. 意思就是说如果开启动画,导航栏会以某个时长进行垂直过渡。
对于UINavigationControllerHideShowBarDuration官方文档也给出了解释:This variable specifies the duration when animating the navigation bar. Note that this is a constant value, so it cannot be set. 就是说UINavigationControllerHideShowBarDuration决定了导航栏动画的时长,注意这是一个常量,不能被改变。
这样就完美解决了吗?不,另一个坑出现了。点击TabBarItem进入”我的”页面的时候,导航栏也出现了动画,因为动画只能写在ViewWillAppear方法里,所以每次显示页面都会调用。
示例如下
如果希望Pop的时候导航栏不会立即消失而且没有黑边,切换TabBarItem的时候又不会出现动画,那么依旧还是要开启animated属性的。
//1.给"我的"控制器.h文件里添加一个关闭动画的属性 @interface HQMineViewController : UITableViewController @property (nonatomic, assign) BOOL closeAnimating; @end //2.在自定义的TabBarController里面实现UITabBarControllerDelegate,并实现如下方法 @interface HQTabBarController ()<UITabBarControllerDelegate> @end @implementation HQTabBarController - (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController { UINavigationController *navigationController = (UINavigationController *)viewController; if ([navigationController.topViewController isKindOfClass:[HQMineViewController class]]) { HQMineViewController *mineVc = (HQMineViewController *)navigationController.topViewController; // 点击TabBarItem进入"我的"控制器 会关闭导航栏消失的动画 mineVc.closeAnimating = YES; } return YES; } } //3.修改"我的"控制器中隐藏导航栏的方法 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController setNavigationBarHidden:YES animated:!self.closeAnimating]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self.navigationController setNavigationBarHidden:NO animated:YES]; // 控制器消失时要开启动画,保证由其他方式进入控制器会有动画 self.closeAnimating = NO; }
聪明的小伙伴,针对上述现象实际上是由更简单的写法
其实只要将animated属性继承ViewWillAppear(Disappear)的animated属性即可
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController setNavigationBarHidden:YES animated:animated]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self.navigationController setNavigationBarHidden:NO animated:animated]; }
效果如下
关于NavigationBar 详解 设置,有篇文章很不错.
NavigationBar 详解 设置超链接相关文章推荐
- 说说JSON和JSONP,也许你会豁然开朗
- 李奎元:说说那些征信模型(Z计分模型、巴萨利模型和A值模型)
- 说说 spring-secuirty
- 想走编程道路的人,进来看看,说说我走过的路
- 说说你对闭包的理解
- 说说多线程(linux、windows/c c++ mfc python java多线程)
- 说说 Java I/O 系统之标准 I/O
- 分布式事务之说说TCC事务
- 说说JSON和JSONP,也许你会豁然开朗,含jQuery用例
- 说说如何使用 JavaScript 进行错误处理
- 说说你对servlet 的理解或者 servlet 是什么?
- 我也说说中文分词(上:基于字符串匹配)
- 说说Java的NIO
- 说说缓冲流BufferedInputStream和B…
- java面试题:请说说MVC架构
- 比较顺序表和链表的优缺点,说说它们分别在什么场景下使用?
- STL中的multimap---顺便说说如何查找同一关键字对应的所有值(利用count, lower_bound/upper_bound, equal_range)
- [转载]说说我今年买二手房被毁约的血泪史,各种坑爹心酸~
- 说说腾讯和耕读的异同
- 说说TLS协议里的wireshark抓包内容(一)