惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
G
Google Developers Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
GbyAI
GbyAI
V
Vulnerabilities – Threatpost
Hugging Face - Blog
Hugging Face - Blog
I
Intezer
S
Securelist
Forbes - Security
Forbes - Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Jina AI
Jina AI
Y
Y Combinator Blog
N
News | PayPal Newsroom
S
Schneier on Security
O
OpenAI News
T
The Blog of Author Tim Ferriss
V
Visual Studio Blog
Simon Willison's Weblog
Simon Willison's Weblog
Martin Fowler
Martin Fowler
人人都是产品经理
人人都是产品经理
雷峰网
雷峰网
NISL@THU
NISL@THU
阮一峰的网络日志
阮一峰的网络日志
WordPress大学
WordPress大学
N
News and Events Feed by Topic
Microsoft Azure Blog
Microsoft Azure Blog
P
Proofpoint News Feed
The Cloudflare Blog
Last Week in AI
Last Week in AI
博客园 - 司徒正美
L
LangChain Blog
C
CERT Recently Published Vulnerability Notes
L
LINUX DO - 热门话题
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
aimingoo的专栏
aimingoo的专栏
Apple Machine Learning Research
Apple Machine Learning Research
Recent Commits to openclaw:main
Recent Commits to openclaw:main
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
The Hacker News
The Hacker News
博客园 - Franky
Attack and Defense Labs
Attack and Defense Labs
Security Latest
Security Latest
T
Tailwind CSS Blog
博客园_首页
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Microsoft Security Blog
Microsoft Security Blog
V2EX - 技术
V2EX - 技术
腾讯CDC
V
V2EX

isaced

使用 TypeScript 构建的 appstore-connect-sdk 归档 我用 SwiftUI 写了一个 V2ex 客户端 Docker 容器化多应用部署 Swift Server-side SDWebImage 为什么无法读取 webpmux 生成的 WebP 动图? [译] 探索 Swift 4 中新的 String API 对一个 Django 站点做 ab 压力测试 fir-mac 开发笔记 iOS10 Safari 引导用户信任企业签名 Swift Web 开发之 Vapor - 模版 Leaf(三) Swift Web 开发之 Vapor - 路由(二) HoloLens 初体验 Swift Web 开发之 Vapor - 入门(一) Jenkins for iOS 搭建日记 iOS HOOK 注入与重签名 Xcode 使用 Configuration 来配置不同的项目环境 图床从SAE迁移到七牛 给 UIProgressView 脱掉那层微弱的渐变 初用 CocoaAsyncSocket 记一次 SQLite 性能优化 有多色 - 开发小记 海岛风情 - 泰国普吉岛六日游 EGOCache 源码解析 日语五十音假名临摹校验算法 [iOS] UITextView 追加文字自动跳到顶部解决方法 Cocoa 新的依赖管理工具:Carthage 新年快乐! 博客主机换到搬瓦工 写了个iOS小游戏:有多色 iOS 后台任务之 Long-running background task 悄悄的就必须用 XCode 5.1.1 上传了! HTTP Content-type 与 AFNetworking Objective-Cloud 初体验(1) 掌中站上架小记 NSLoger 上线了 Python Markdown 做语法限制 Nginx + Gunicorn + Django 部署小记 用Shell脚本批量裁剪App Icon各个尺寸 LaunchRocket使用小记 用宏提速NSCoding 2014新年伊始:近期读过的好文推荐 [iOS] stringWithFormat 和 initWithFormat 有何不同? Apache + Flask + mod_wsgi + Koding 部署小记 收集几个Objective-C的HTML解析库 NSMapTable: 不只是一个能放weak指针的 NSDictionary 2013,再见! Emlog到Typecho的迁移工具:emlog2typecho [iOS]给上拉下拉刷新PullToRefresh做本地化 [iOS]代码推荐:大图缩放视图 - Vertigo Xcode 5新的Interface Builder,你准备好了吗? [翻译]如何使用Django创建简单的博客 我的Mac音乐播放器 初识 NSDataDetector Objective-C 计算代码运行时间 WordPress上传文件自动重命名 iOS:仿jing.fm的音乐播放视图 我的啃黑苹果之路 关于 搜索 项目
iOS:hidesBottomBarWhenPushed的正确用法
2013-10-12 · via isaced

今天说的是在 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 下去的时候,一般情况是这样:

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

怎么样,是不是有时候确实会遇到这样的情况?其实苹果真的考虑的很周全,为我们创造了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,而是覆盖在上面,看不出任何区别,效果也能达到上面图片的效果!