hidesBottomBarWhenPushed的正确用法_weixin_34054866的博客-程序员宅基地

技术标签: 移动开发  xcode  

 

//BaseNavigationController.h

#import <UIKit/UIKit.h>

@interface BaseNavigationController : UINavigationController

@end


//BaseNavigationController.m

#import "BaseNavigationController.h"

@interface BaseNavigationController ()

@end

@implementation BaseNavigationController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if (self.childViewControllers.count > 0) {
        //当这个控制器push的时候,底部的Bar,比如Tabbar会滑走,也就是不会在push后的视图上显示出来,默认值为NO。
        viewController.hidesBottomBarWhenPushed = YES;
    }
    [super pushViewController:viewController animated:animated];
}

@end

 

 

http://www.isaced.com/post-223.html

今天说的是在TabBar嵌套Nav时,进行Push的时候隐藏TabBar的问题。

之前项目也需要这么做,那时候iOS7还没出,也是各种搜罗,后来的解决方法是当push操作的时候自己隐藏Tabbar,push过去视图拉伸适应屏幕,再pop回来的时候接再显示Tabbar,过程复杂还需要自己写动画,最终效果也不是很理想。

前两天公司APP上架,当时没有适配iOS7,在XCode4.6上开发编译并发布,居然在iOS7下跑起来没有太大的问题,只是一个Nav的文字错位,有闪退,不过勉强还能用,其中有自定义Tabbar,有很多动画,后来在一篇介绍iOS7适配的文章中看到这么一句话:

在Xcode 4.6上使用iOS 6 SDK进行编译的app在iOS
7上运行时是采用一种特殊的模拟模式,它试图保存app原来的样子。但是一旦你升级到了Xcode 5,在iOS
7SDK上编译,你的app就会开始出现状况了。

已经写的很清楚了,于是我再到Xcode5中编译运行原来的项目,就破漏百出了,开始完全崩溃,各种问题浮现。

好了,回到今天说的正题,先和大家说说hidesBottomBarWhenPushed,从这个属性名也能知道它的意思了,官方的解释是这样:

If YES, then when this view controller is pushed into a controller hierarchy with a bottom bar (like a tab bar), the bottom bar will slide out. Default is NO.

大致意思是如果为YES,当这个控制器push的时候,底部的Bar,比如Tabbar会滑走,也就是不会在push后的视图上显示出来,默认值为NO。

我讲的场景大概为这个样子:

 

整体结构

 

最外面是一个TabBarController,套了两个NavgationController,当其中一个VC push下去的时候,一般情况是这样:

 

push

 

当隐藏Tabbar的时候再push,效果是这样:

 

push next

 

怎么样,是不是有时候确实会遇到这样的情况?其实苹果真的考虑的很周全,为我们创造了hidesBottomBarWhenPushed这个属性,为了解决这个问题。代码非常简单,一句或者两句话即可,这里得分几种Push的情况。

Case1:xib加载或者Storyboard用identifier获取Controller

UIViewController *v2 = [self.storyboard instantiateViewControllerWithIdentifier:@"v2"];
v2.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:v2 animated:YES];

Case2:拉线,也就是Storyboard用performSegue

self.hidesBottomBarWhenPushed = YES;
[self performSegueWithIdentifier:@"tov2" sender:nil];
self.hidesBottomBarWhenPushed = NO;

Tip:经测试证明,此种方式只会对后面的一级生效,继续往后Push还会出现TabBar,要继续往后push也隐藏Tabbar还得使用Case3的方法,也建议如此!

Case3:拉线,在prepareForSegue函数里

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    [segue.destinationViewController setHidesBottomBarWhenPushed:YES];
}

更方便的做法:如果你在用 Storyboard,可以在 ViewController 的设置面板中把 Hide Bottom Bar on Push 属性勾选上,效果和上文代码一样。

暂时就用到这几点,我之前的做法,自己手动隐藏,拉伸view,显示不但麻烦,兼容性也不好,移到iOS7上问题多多,不过用这个属性可以非常方便的实现此需求,并且在iOS6上也完美兼容哦。

注意:还有个问题,这个属性只支持非自定义的Tabbar,也就是只支持原生Tabbar,如果是自定义的Tabbar会产生你意想不到的效果,我之前就遇到过,因为使用hidesBottomBarWhenPushed后,系统内部会处理TabbarController上Tabbar这个View,我之前自定义的Tabbar做法是吧原生Tabbar这个View隐藏掉,然后添加到自己绘制的Tabbar
View上去,缺点就是这样你的自定义的TabBarview接收不到系统应有的一些响应,于是我尝试着把自定义的TabBar
View添加到原来的TabBar View上,也就是不隐藏原生的TabBar,而是覆盖在上面,看不出任何区别,效果也能达到上面图片的效果!

转载于:https://my.oschina.net/huqiji/blog/1137786

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34054866/article/details/91794434

智能推荐

Springmvc传递参数过程中RequestBody,RequestParam区别_爱飞的光的博客-程序员宅基地

在SpringMVC中我们可以选择数种接受JSON的方式,在说SpringMVC如何接受JSON之前,我们先聊聊什么是JSON。具体的定义我也不赘述了,在JavaScript中我们经常这样定义JSON对象。var jsonObject = { "username":"admin", "password":123 }这种形式的我们叫它JSON对象,同时还有一个概念叫做JSON字符串,字符串...

求一个数各个位数之和_疯的世界的博客-程序员宅基地

//求一个数各个位数之和int parm(int n){ if(n<10) { return n; } else { return parm(n/10)+n%10; }}int main(){ printf("%d",parm(12345)); return 0;}

Linux指令——压缩与解压+虚拟环境_linux tar zv_Jhinhua的博客-程序员宅基地

目录压缩与解压 虚拟环境 压缩与解压 windows下常见的压缩包: > zip rar > linux下常见的压缩包格式 > zip gz bz2 tar(归档) zip > 压缩: zip 压缩包 文件1 文件2 > 解压: unzip 压缩包 > gzip /bzi..._linux tar zv

什么是拦截器?拦截器如何配置?_配置拦截器_didiplus的博客-程序员宅基地

今天这篇文章来介绍一下拦截器在SpringBoot中的如何自定义及如何配置的,拦截器的具体作用和应用场景。SpringBoot版本本文基于的Spring Boot的版本是2.6.7 。什么是拦截器Spring MVC中的拦截器(Interceptor)类似于ServLet中的过滤器(Filter),它主要用于拦截用户请求并作出相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。工作原理一个拦截器,只有preHandle方法返回true,postHandle、a._配置拦截器

线程注入、HOOK APIs(附VC6源码)_BeanJoy的博客-程序员宅基地

工作关系,想HOOK并修改一些API,使得不支持某些设备的第三方工具可以正常运行,因此花时间写了这么个工具。比如ReadFile时,某些设备不支持指定的缓存大小(如512KB),可以HOOK ReadFile,把缓存大小修改为更小,可能ReadFile就能正常工作,第三方工具也能正常使用。其实,只是想借工作这个契机,学习远程线程注入和HOOK API。工作上测试的设备和第三方工具运行在64位机

SpringCloud实战(十三)-轻量级集群管理工具(Portainer)_张志翔的博客的博客-程序员宅基地

本文是SpringCloud实战(十三)-轻量级集群管理工具(Portainer),若要关注前文,请点击传送门:SpringCloud实战(十二)-自动化质量检测工具(SonarQube)前文我们介绍了Jenkins集成Sonar实现自动化质量检测。随着我们容器数量的日益增多,管理起来也慢慢地力不从心,这个时候我们可能需要一个工具来帮我们实现容器管理,如果你使用的是kubernetes,那...

随便推点

pip mysql_config not found_pip3 install mysqlclient 报错 “/bin/sh: 1: mysql_config: not found”的解决方法..._weixin_39593247的博客-程序员宅基地

报错信息[root@localhosthc_BgpServer]#pip3installmysqlclientCollectingmysqlclientDownloadinghttps://files.pythonhosted.org/packages/f4/f1/3bb6f64ca7a429729413e6556b7ba5976df06019a5245a43d36032f1061e/..._/bin/sh: 1: mysql_config: not found

Glide加载图片_lixiaoqi6688的博客-程序员宅基地

转自:http://www.jb51.net/article/83156.htm零、选择Glide为什么图片加载我首先推荐Glide?图片加载框架用了不少,从afinal框架的afinalBitmap,Xutils的BitmapUtils,老牌框架universalImageLoader,著名开源组织square的picasso,google推荐的glide到FaceBoo

html表单怎么自动提交表单数据类型,表单提交时编码类型enctype详解_索米龙的博客-程序员宅基地

很早以前,当还没有前端这个概念的时候,我在写表单提交完全不去理会表单数据的编码,在action属性里写好目标URL,剩下的啊交给浏览器吧~但是现在,更多时候我们都采用Ajax方式提交数据,这种原始的方式仅仅被当成优雅降级的产物。当我们用异步方式提交表单,就需要稍微关注一下表单数据的编码问题了。回想一下,在写回调函数时是不是有根据过请求的Content-Type写不同业务逻辑的经历,那这个Conte..._html自动提交表单

课后作业2:个人项目(计算器)_avt73695的博客-程序员宅基地

1.我的远程仓库的码云项目地址https://gitee.com/PJ98H/personal_project41656/commit/e5c96bfbdb7b47f76bd9bc843facdec189a0938f2.我的PSP表格,表格中的任务估计花费时间以及实际花费时间。3.解题思路描述。即刚开始拿到题目后,如何思考,如何找资料的过程。审题:实现一个能够对表达式进行...

Circle Collision inaccurate_ssh591的博客-程序员宅基地

Hello,Im using Kwigbos collision detection code, and what I get is an in-accurate graphical result but accurate mathematically.OK, so I checked the collision code using the vector normaliza

推荐文章

热门文章

相关标签