iOS - 转场时 appear 与 disappear 的调用顺序探索
不同的转场方式 A、B viewDidDisappear调用的流程不同
在A页面跳转到B页面的过程中 A 的 viewDidDisappear 方法和 B 的 viewDidAppear 谁先调用?
其实我以前一直理所当然的认为它们的顺序就是 A-viewDidDisappear --> B-viewDidAppear,
今天写了个Demo去测试了一下,发现完全不是自己想象的那样,每一种转场(Push,Present,TabBar切换)都是不一样的。
测试
我自定义了两个类,继承自UIViewController,为了方便观察分别叫做A_ViewController,B_ViewController,然后重写了一系列 appear 和 disappear 方法。
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
NSLog(@"A view will appear %@",self);
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
NSLog(@"A view did appear %@",self);
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
NSLog(@"A view will disappear %@",self);
}
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear: animated];
NSLog(@"A view did disappear %@",self);
}
然后分别用 push, present, 以及 tabbar 的切换来测试,然后查看打印的结果。
Push & Pop
--------------------------PUSH-----------------------------
A view will disappear <A_ViewController: 0x7fa11067a730>
B view will appear <B_ViewController: 0x7fa110516530>
A view did disappear <A_ViewController: 0x7fa11067a730>
B view did appear <B_ViewController: 0x7fa110516530>
--------------------------POP-----------------------------
B view will disappear <B_ViewController: 0x7fa110516530>
A view will appear <A_ViewController: 0x7fa11067a730>
B view did disappear <B_ViewController: 0x7fa110516530>
A view did appear <A_ViewController: 0x7fa11067a730>
在这里的调用顺序是和我之前预想的一样的,也就是
A-willDisappear --> B-willAppear --> A-didDisappear --> B-didAppear
Present & Dismiss
在模态的转场中就有一些不一样的事了。我们知道模态转场有好多种style,其中有两种我们需要特别注意的UIModalPresentationCustom,UIModalPresentationOverFullScreen。我们先看一下除了这两种style以外的转场,他们的调用顺序是怎样的。
-----------------------NormalPresent------------------------
A view will disappear <A_ViewController: 0x7fc2a14ac490>
B view will appear <B_ViewController: 0x7fc2a152a880>
B view did appear <B_ViewController: 0x7fc2a152a880>
A view did disappear <A_ViewController: 0x7fc2a14ac490>
-------------------------DISMISS----------------------------
B view will disappear <B_ViewController: 0x7fc2a152a880>
A view will appear <A_ViewController: 0x7fc2a14ac490>
A view did appear <A_ViewController: 0x7fc2a14ac490>
B view did disappear <B_ViewController: 0x7fc2a152a880>
这里其实已经和push的转场不一样了。普通模态的转场的顺序是这样的
A-willDisappear --> B-willAppear --> B-didAppear --> A-didDisappear
再看看前面提到的那两种特殊的模态转场。因为在这两种方式的转场下A的view是不会消失的,所以所有与A有关的 appear 或 disappear 方法都不会被调用
-----------------------CustomPresent------------------------
B view will appear <B_ViewController: 0x7f960249bac0>
B view did appear <B_ViewController: 0x7f960249bac0>
-------------------------DISMISS----------------------------
B view will disappear <B_ViewController: 0x7f960249bac0>
B view did disappear <B_ViewController: 0x7f960249bac0>
所以在这两种style下只有B-willAppear --> B-didAppear
TabBar切换
TabBar 的切换也是一个很神奇的顺序
B view will appear <B_ViewController: 0x7f88cbed7160>
A view will disappear <A_ViewController: 0x7f88cbed6680>
A view did disappear <A_ViewController: 0x7f88cbed6680>
B view did appear <B_ViewController: 0x7f88cbed7160>
与push不同的是,TabBar下,会先调用 B 的 willAppear,再调用 A 的 willDisappear
所以TabBar的顺序是这样的:
B-willAppear --> A-willDisappear --> A-didDisappear --> B-didAppear
总结
在每一种转场下,appear 与 disappear 都有一些不一样的顺序,一定要分清楚,不能一概而论。
Push: A-willDisappear-->B-willAppear-->A-didDisappear-->B-didAppear
Present: A-willDisappear-->B-willAppear-->B-didAppear-->A-didDisappear
CustomPresent: B-willAppear-->B-didAppear
TabBar: B-willAppear-->A-willDisappear-->A-didDisappear-->B-didAppear
iOS - 转场时 appear 与 disappear 的调用顺序探索的更多相关文章
- iOS 转场动画探究(一)
什么是转场动画: 转场动画说的直接点就是你常见的界面跳转的时候看到的动画效果,我们比较常见的就是控制器之间的Push和Pop,还有Present和Dismiss的时候设置一下系统给我们的modalTr ...
- iOS 转场动画探究(二)
这篇文章是接着第一篇写的,要是有同行刚看到的话建议从前面第一篇看,这是第一篇的地址:iOS 转场动画探究(一) 接着上一篇写的内容: 上一篇iOS 转场动画探究(一)我们说到了转场要素的第四点,把那个 ...
- iOS打包导出时出现Missing iOS Distribution signing
iOS打包导出时出现Missing iOS Distribution signing 上传APP就出现Missing iOS Distribution signing indetity for 打包i ...
- 针对SharePointFarm场时安装部署OWA的步骤
下面文章列出针对SharePointFarm场时安装部署OWA的步骤: http://blogs.technet.com/b/meamcs/archive/2013/03/27/office-web- ...
- 【原创】修复ios输入框获取焦点时不支持fixed的bug
前些日子,做了一个手机站的项目,有一个页面是这样的, 有一个固定(position:fixed)的头部和底部导航,中间是一些表单内容,没啥特别的.但是到了ios中,正常滚动页面没有问题,一旦触发了文本 ...
- 取消input聚焦时的边框,去除ios点击时,自动添加的底色效果
/*去除ios点击时,自动添加的底色效果*/ -webkit-tap-highlight-color: rgba(, , , ); /*去除焦点框*/ outline:none;
- [iOS]为什么不要在init初始化方法里调用self.view
首先.如果你调用self.view的时候,就会调用view的getter方法, 这个时候,view是空的,那么系统就会自动给你创建一个view,然后就会触发ViewDidLoad方法.那么这个时候,如 ...
- [ios]IOS的AppDelegate方法中的事件触发调用 以及 关闭 ios应用程序
IOS的AppDelegate方法中的事件触发调用 参考:http://blog.sina.com.cn/s/blog_a573f7990101bphp.html //当应用程序将要进入非活动状态执行 ...
- gcc/g++链接时.o文件及库的顺序问题
折腾gcc/g++链接时.o文件及库的顺序问题 链接静态库的顺序问题 GCC 编译使用动态链接库和静态链接库--及先后顺序----及环境变量设置总结
随机推荐
- Android R.java:10: “duplicate class”
在使用mmm命令编译android的app时出现错误error : R.java:10: "duplicate class" 参考方法: http://www.xuebuyuan. ...
- python程序中的调试:pdb
python中,也有像c/c++语言的 gdb 一样的调试程序,即pdb: 只简单说明一个怎么使用它. 假设已经有了一个python程序名为 test.py, 我们在命令行输入以下内容,即可以进行 p ...
- e615. Finding the Next Focusable Component
public Component findNextFocus() { // Find focus owner Component c = KeyboardFocusManager.getCurrent ...
- JSTL XML标签库 使用
推荐博客:http://blog.sina.com.cn/s/blog_4f925fc30101820u.html XML标签库 JSTL提供了操作xml文件的标签库,使用xml标签库可以省去使用Do ...
- [转]iOS证书(.p12)和描述文件(.mobileprovision)申请
转载于:http://ask.dcloud.net.cn/article/152 iOS有两种证书和描述文件: 证书类型 使用场景 开发(Development)证书和描述文件 用于开发测试,在HBu ...
- Linux top和负载的解释(转载)
转载自://www.blogjava.net/freeman1984/archive/2011/12/08/365853.html op命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程 ...
- vue如何加入百度联盟广告
在百度联盟代码位管理中创建好对应的代码位之后,点击获取代码,会看到这样一段js 直接复制粘贴到自己网页中便可显示对应广告. 在vue中由于都是vue组件,不支持直接在组件中加入这样一段一段的js代码, ...
- 1 go 开发环境搭建与简单代码实现
什么是go语言 go是一门并发支持,垃圾回收的编译型 系统编程语言,旨在创造一门具有静态编译语言的高性能和动态语言的高效开发之间拥有一个良好平衡点 的一门编程语言. go有什么优点? 自动垃圾回收机制 ...
- ABBYY FineReader 14助力2017,正式进入新纪元
ABBYY FineReader 12自2014年推出以来,已经给万千用户的工作带来了便捷,蝉联优秀殊荣这么久,相信不少用户早在期待新版本的到来了吧.这不,ABBYY FineReader 14问世了 ...
- 完美解决ListView中事件ItemCreated中使用ClientID导致插入数据失败
于昨天晚上看到视频做到这个例子,但是发现始终有错误,在ListView的ItemCreated事件中使用了ClientID则会导致数据插入数据库失败.当点击插入按钮时,网页就像点击F5刷新一样,无任何 ...