2

iOS:hidesBottomBarWhenPushed的正确用法

 2 years ago
source link: https://www.isaced.com/post-223.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

iOS:hidesBottomBarWhenPushed的正确用法

今天说的是在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,而是覆盖在上面,看不出任何区别,效果也能达到上面图片的效果!


Recommend

  • 70

    当docker容器在“-d”守护态运行的时候,比如通过supervisord控制两个程序非守护态运行:ssh-Dtomcat那么这个时候,用户就无法直接进入到容器中去,dockerattach容器id就会一直卡着。因为此时容器运行的进程是ssh,而不是/bin/bash也没有虚拟终端(-it)参数,所以是...

  • 40

    原文地址:JavaScript async/await: The Good Part, Pitfalls and How to Use ES7通过介绍async/await使得JavaScript的异步编程实现了重大改进。它提供了一种使用同步代码样式异步访问r

  • 34
    • weibo.com 5 years ago
    • Cache

    nubia X 的正确用法…

    nubia X 的正确用法…

  • 42
    • www.woshipm.com 5 years ago
    • Cache

    奖励和积分的正确用法

    本文主要跟大家说说奖励和积分的正确用法,一起来看看~ 魔兽世界这样的游戏能风靡全球,很重要的一个原因就是它们具有清晰直观的实时反馈系统。玩家所有的操作都会影响角色的形象和属性,它们随着等级的增加而增加。你可以通过面前闪过的「耐力+1、智力+1、力量+1...

  • 9
    • blogread.cn 3 years ago
    • Cache

    Lua C API 的正确用法

    Lua C API 的正确用法 浏览:1216次  出处信息    Lua 作为一门嵌入式语言,提供了完...

  • 6
    • blog.henix.info 3 years ago
    • Cache

    dmenu 的正确用法

    dmenu 的正确用法 最后更新日期:2014-05-24   dmenu_run 是一个程序启动器:输入程序名,回车,启动相应程序,很简单。   我很想要一个功能:根据我的使用频率调整项目的...

  • 6

    nodejs 子进程的正确用法(你应该忽视函数名) 本文来自依云's Blog...

  • 14

    电视盒子的正确用法?零成本打造复古游戏盒子 2022-02-02 00:15 出处:PConline原创 作者:Ting   OK,今天...

  • 8
    • www.geekpark.net 2 years ago
    • Cache

    那些吃灰产品的「正确」用法

    极客之选3min read那些吃灰产品的「正确」用法2022/02/04

  • 5
    • blog.51cto.com 2 years ago
    • Cache

    QProcess的正确用法

    QProcess的正确用法 原创 程序员如山石 2022-03-03 14:46:26 博主...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK