- 浏览: 406844 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (325)
- 神经网络 (1)
- javascript (11)
- 数据结构 (2)
- 计算机图形学 (11)
- 模式识别 (1)
- 前端开发 (14)
- 机器学习 (11)
- ios开发 (50)
- Python (9)
- HTML5 (4)
- 计算机视觉 (9)
- 数字图像处理 (7)
- 架构设计 (19)
- 数据库设计 (9)
- 算法设计 (59)
- Java (37)
- 其他 (3)
- 游戏开发 (5)
- c++ (17)
- Linux (3)
- TCP/IP (2)
- Flex (41)
- 健康 (6)
- AI (2)
- 工具 (1)
- 数据挖掘 (1)
- 性能优化 (6)
- 综合 (2)
- 网络通信 (12)
- Android (2)
- UML (3)
- 软件设计 (11)
- 编程经验 (7)
- J2EE (1)
- 多媒体技术 (3)
- 数学 (7)
- php (4)
- 设计 (1)
- CS (2)
- 计算机理论 (1)
- 信息安全 (1)
最新评论
-
ahead_zhan:
good good good
flex3控件_ModuleLoader -
lonerzf:
好样的。非常感谢楼主
OpenCV视频教程整理 -
lonerzf:
好样的。谢谢~
OpenCV视频教程整理 -
coding1688:
博主说的不错,我在实现瀑布流布局时也用的masonry插件,有 ...
Javascript 瀑布流式布局及其动态效果的实现 -
snowolf:
除非玩游戏,不然没啥win的事情,或者用win的银行客户端,通 ...
macbook安装操作系统的机理分析
一. UIViewController
做iOS开发的经常会和UIViewController打交道,从类名可知UIViewController属于MVC模型中的C(Controller),说的更具体点它是一个视图控制器,管理着一个视图(view)。
UIViewController的view是lazy loading的,当你访问其view属性的时候,view会从xib文件载入或者通过代码创建(覆盖loadView方法,自定义其view hierarchy),并返回,如果要判断一个View Controller的view是否已经被加载需要通过其提供的isViewLoaded方法来判断。
view加载后viewDidLoad会被调用,这里可以进行一些数据的请求或加载,用来更新你的界面。
当view将被加入view hierarchy中的时候viewWillAppear会被调用,view完成加入的时候viewDidAppear会被调用,同样当view将要从view hierarchy中移除的时候viewWillDisappear会被调用,完成移除的时候viewDidDisappear会被调用。
当内存紧张的时候,所有的UIViewController对象的didReceiveMemoryWarning会被调用,其默认实现是 如果当前viewController的view的superview是nil的话,则将view释放且viewDidUnload会被调用,viewDidUnload中你可以进行后继的内存清理工作(主要是界面元素的释放,当再次加载的时候需要重建)。
如果想要展示一个View Controller,一般有如下一种途径
- 设置成Window的rootViewController(iOS 4.0之前UIWindow并没有rootViewController属性,只能通过addSubview的方式添加一个View Controller的view)
- 使用某个已经存在的Container来展示,比如使用UINavigationController来展示某个View Controller [navigationController pushViewController:vc animated:YES];
- 以模态界面的方式展现出来 presentModalViewController
- 以addSubview的方式将使其view作为另一个View Controller的view的subView
直接使用4种方法是比较危险的,上一级 View Controller并不能对当前View Controller的 生命周期相关的函数进行调用,以及旋转事件的传递等。
二.Hierarchy
我们知道一个View可以将另一个View添加为子View(subview),构成一个View Hierarchy.当某一个View添加到window的View Hierarchy中时,将被“显示”。每一个View Controller管理着的其实就是一个View Hierarchy.而View Controller本身可以有Child View Controller,所以也存在一个 View Controller Hierarchy的概念,当View Controller收到上层传来的诸如旋转,显示事件的时候,需要传递给它的Child View Controller. 一般情况下,View Hierarchy 和 View Controller Hierarchy需要保持一致性,比如一个View Controller的view的superView是由其parent view controller管理着
三.Container
一个iOS的app很少只由一个ViewController组成,除非这个app极其简单。 当有多个View Controller的时候,我们就需要对这些View Controller进行管理。 那些负责一个或者多个View Controller的展示并对其视图生命周期进行管理的对象,称之为容器,大部分容器本身也是一个View Controller,这样的容器可以称之为Container View Controller,也有极少数容器不是View Controller,比如UIPopoverController,其继承于NSObject。
我们常用的容器有 UINavigationController,UITabbarController等,一般容器有一些共同的特征:
- 提供对Child View Controller进行管理的接口,比如添加Child View Controller,切换Child View Controller的显示,移除Child View Controller 等
- 容器“拥有”所有的Child View Controller
- 容器需要负责 Child View Controller的appearance callback的调用(viewWillAppear,viewDidAppear,viewWillDisaapper,viewDidDisappear),以及旋转事件的传递
- 保证view hierarchy 和 view controller hierarchy 层级关系一致,通过parent view controller将child view controller和容器进行关联
从上面可以看出来,实现一个Container View Controller并不是一个简单的事情,好在iPhone的界面大小有限,一般情况下一个View Controller的view都是充满界面或者系统自带容器的,我们无需自己创建额外的容器,但是在iPad中情况就不同了。
四. Custom Container View Controller
在iOS 5之前框架并不支持自定义 Container View Controller, iOS 5开始开放了一些新的接口来支持支持自定义容器
addChildViewController:
removeFromParentViewController
transitionFromViewController:toViewController:duration:options:animations:completion:
willMoveToParentViewController:
didMoveToParentViewController:
其中前两个接口比较重要,可以直接改变View Controller 的 Hierarchy。
有点意外的是,在不做任何额外设置的情况下进行如下操作
[viewController.view addSubview:otherViewController.view]
iOS 5中otherViewController是可以立刻收到viewWillAppear和viewDidAppear的调用。
至于旋转事件的传递以及其他时机viewWillAppear viewDidAppear的调用是需要建立在 [viewController addChildViewController:otherViewController]基础上的。
当我们需要在iOS 4上实现自定义容器,或者有时候我们不想让viewWillAppear这类方法被自动调用,而是想自己来控制,这个时候我们就得需要手动来调用这些方法,而不是由框架去自动调用。 iOS 5中可以很方便的禁用掉自动调用的特性,覆盖automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers返回NO
但是单单覆盖这个方法在iOS5下还是有问题的,当执行下面的语句的时候
[viewController.view addSubview:otherViewController.view]
otherViewController还是是可以立刻收到viewWillAppear和viewDidAppear的调用。
解决这一问题的方法就是在iOS5的时候调用[viewController.view addSubview:otherViewController.view]之前 进行如下操作
[viewController addChildViewController:otherViewController]
总的来说实现兼容iOS 4和iOS 5的容器有不少问题和注意点的
- view加入view层级前后分别调用viewWillAppear和viewDidAppear;容器的viewWillAppear,viewDidAppear,viewWillDisappear,viewDidDisappear中需要对当前显示的Child View Controller调用相同的方法,容器需要保证Child View Controller的viewWillAppear调用之前Child View Controller的view已经load了.还有一点就是保证容器的View不会出现bounds为CGRectZero的情况,因为如果此View包含多个subview,其bounds改变的时候subview会根据自己的autoresizingMask改变frame,但是当bounds变为0再变为非0的时候,subview的frame就有可能不是你想要的了(比如某个subview的autoresizingMask为UIViewAutoresizingFlexibleBottomMargin)
- 容器的shouldAutorotateToInterfaceOrientation中需要检测每一个Child View Controller的shouldAutorotateToInterfaceOrientation如果一个不支持,则看做不支持
- 容器的willRotateToInterfaceOrientation,didRotateFromInterfaceOrientation,willAnimateRotationToInterfaceOrientation方法中需要将这些事件传递给所有的Child View Controller
- 由于UIViewController的parentViewController属性为只读,且iOS4中没有提供容器支持的接口(iOS 5中容器支持的接口会间接的维护这个属性),所以为了使得childViewController和容器得以关联,我们可以顶一个View Controller的基类,添加一个比如叫做superController的属性用来指定对应的parentViewController
- 由于UIViewController的interfaceOrientation为只读属性,且iOS5中没有提供容器接口,所以UIViewController的这个interfaceOrientation变的不可信,为了取得当前UIViewController的orientation我们可以用UIWindow下的rootViewController的interfaceOrientation的值
- 容器的viewDidUnload方法中需要对view未释放的childViewController的view进行释放,且调用其viewDidUnload方法
苹果对UIViewController以及其使用有着非常详细的文档 UIViewController Reference , ViewController Programming Guide。
------------------------------------------
对于iPhone app,UIViewController类提供了基本的视图管理模式。当设备改变方向的时候view controller的视图会自动随之旋转的。如果视图和子视图的autoresizing属性设置是对的,这时候视图又没有随着设备一起旋转,可能是以下的原因:
1.view controller没有完成代理方法
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation;
也要实现了shouldAutorotateToInterfaceOrientation方法,同时shouldAutorotateToInterfaceOrientation方法要返回YES来支持所有的旋转方向
2.view controller的UIView属性嵌入在UIWindow中,并非是一个附加的view controller
你可能会发现shouldAutorotateToInterfaceOrientation方法只会在view controller启动的时候被调用,不会因为设置的旋转而在被调用。这是因为view controller束缚着他们所管理的视图,view controller是用来处理时间的响应链的一部分。view controller是从UIResponder继承而来,同时他被插入到他所管理的视图和他的superview之间。因此,通常的做法是在你的app中有一个主view controller来作为响应链的一部分。通常来说会添加一个主view controller,例如UINavigationController, UITabBarController或者UIViewController到UIWindow上。
例如
[myWindow addSubview:primaryViewController.view];
如果你添加了另外一个view controller的UIView属性到UIWindow(anotherController和主view controller在同一个等级上)
[myWindow addSubview:anotherController.view];
anotherController将不会接受旋转事件,只有第一个view controller(primaryViewController)会接受旋转事件。
3.你添加了view controller的UIView属性到UIWindow作为subview,但是过早的release它。
UIWindow会retain视图,而不是view controller。你不能过早的release他。在UIApplicationDelegate子类中定义他为retain属性。
4.在UITabBarController或者UINavigationController中的子view controller没有对同一方向的支持。
为了确保所有的子view controller旋转正确,你的每一个view controller,每一个tab或者额navigation都要完成shouldAutorotateToInterfaceOrientation,而且必须支持对于同一方向的旋转,也就是说对于同一方向的位置要返回为YES。
5.重写-(id)init:或者 -(id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle 方法的时候没有调用super。
对于对象的初始化,在你的view controller的init或者initWithNibName方法中必须要调用super。
发表评论
-
IVEngine —— Objective-C的Spring
2013-12-15 20:35 0背景: 只要是Java程序员,相信都听说 ... -
XCode环境变量及路径设置
2013-11-17 16:05 1771转自:http://blog.csdn.net/freedo ... -
OVGap — 沟通 Objective-C 与 Javascript
2013-11-14 15:14 812Github 地址: https://github.com ... -
IOS开发常用命令
2013-10-11 10:41 641统计代码行数 打开terminal, cd到项目根目 ... -
提高在Xcode上的工作效率
2013-08-31 11:05 1095转自:http://liuminqian.github.io ... -
把ipa包上传到AppStore
2013-08-26 21:46 925转自:http://doc.appcan.cn/dev_io ... -
iPhone应用程序中App目录结构
2013-08-26 17:30 960转自:http://blog.csdn.net/justin ... -
iOS运行回路(RunLoop)总结
2013-08-05 13:37 745转自:http://www.cocoachina.com/i ... -
Simple iPhone Keychain Access
2013-08-04 15:54 737转自:http://useyourloaf.com/b ... -
IOS媒体层
2013-07-28 15:18 843转自:http://wd397.blog.163.com/b ... -
nginx上搭建HLS流媒体服务器
2013-07-28 13:31 1386转自:http://blog.csdn.net/ ... -
Compile ffmpeg for iOS 6, support Simulator & armv7 & armv7s
2013-07-23 17:03 802转自:http://witcheryne.iteye.co ... -
UITableView 修改编辑模式下的切图
2013-07-14 21:03 1165把以下代码放在点解 “编辑” 按钮时触发的方法中。 ... -
iOS平台UDID方案比较
2013-07-09 20:27 1523转自:http://www.cocoachina.com/b ... -
25 Free iOS Design Resources
2013-05-12 19:08 545Some great designers around th ... -
谈谈iOS Animation
2013-05-07 09:39 604转自:http://geeklu.com/2012/09/a ... -
IOS文件系统的管理
2013-05-06 17:11 626转自:http://blog.csdn.net/zhuzhi ... -
iOS应用的本地缓存机制设计
2013-05-06 16:18 675参考:http://www.cnblogs.com/peng ... -
iOS并发编程指南(3)
2013-04-28 14:37 748转自:http://mobile.51cto.com/iph ... -
iOS运行回路(RunLoop)总结
2013-04-27 23:24 676转自:http://www.cocoachina.com/i ...
相关推荐
UIViewController添加多个UIViewController。可以把UIViewController的View当作容器,让其他UIViewController添加进该View,并可以在多个UIViewController间切换。
在iOS开发中,`UIViewController`是苹果提供的一个核心视图控制器类,它是所有自定义视图控制器的基础。在iOS 13及更高版本中,Apple对`UIViewController`的模态弹出行为进行了重大调整,引入了新的交互模式,旨在...
5. **源代码分析** `UIViewControllerTest` 文件可能是包含了这两种创建方式的源代码示例。代码可能包含以下部分: - nib文件加载的`UIViewController`子类,检查`nibName`和`initWithNibName:bundle:`方法的使用...
### UIViewController 生命周期详解 在iOS开发过程中,`UIViewController`作为UIKit框架中的一个重要组成部分,其生命周期管理是每一个iOS开发者都需要掌握的核心技能之一。理解`UIViewController`的生命周期不仅有...
在iOS应用开发中,`UIViewController`是苹果提供的一种基础视图控制器类,它负责管理屏幕上的内容和交互。有时候,开发者可能希望自定义导航栏的返回按钮,例如隐藏标题或者改变其外观。在这个场景下,我们可以创建...
1. **创建Category**:创建一个`UIViewController`的Category,例如`UIViewController+PageTracking`,这样可以在不修改原`UIViewController`的基础上添加新的功能。 2. **获取原始IMP**:获取需要替换的方法的原始...
在iOS应用开发中,UIStoryboard和UIViewController是两个核心组件,用于构建用户界面。当你需要在多个UIViewController之间实现平滑切换时,通常会采用各种技术来提供流畅的用户体验。本教程将深入探讨如何在iOS应用...
AICustomViewControllerTransition, 为iOS创建定制UIViewController转换的简单而简洁的方法 AICustomViewControllerTransition为iOS创建定制UIViewController转换的简单而简洁的方法没有限制,也没有实现...
`UIViewController`是iOS应用开发中的核心组件之一,属于UIKit框架,它是显示用户界面的主要控制器类。在iOS应用中,每个可视的屏幕或者视图都由一个`UIViewController`实例管理。这个类不仅负责管理屏幕上的内容,...
`UIViewController`是所有自定义视图控制器的基础类,它提供了一个容器来管理屏幕上的视图和交互逻辑。你可以通过子类化`UIViewController`并添加自定义的视图来构建复杂的应用界面。`UIViewController`的主要职责是...
在iOS开发中,UIViewController是苹果提供的一个核心组件,它负责管理屏幕上的内容和用户交互。在iOS5中,UIViewController引入了一系列的新特性和改进,极大地增强了开发者处理界面和控制视图的能力。以下是对这些...
// 在容器视图中添加从和到的视图 transitionContext.containerView.addSubview(toView) transitionContext.containerView.addSubview(fromView) // 缩放动画 fromView.transform = CGAffineTransform(scaleX...
在iOS开发中,UIViewController是一个至关重要的组件,它是MVC(Model-View-Controller)设计模式中的控制器部分。在iOS应用的界面构建中,UIViewController扮演着协调者和管理者角色,负责组织和控制应用的用户界面...
在iOS应用开发中,`UITabBarController`、`UINavigationController`和`UIViewController`是三个非常重要的视图控制器类,它们协同工作,构建出用户友好的界面和流畅的导航体验。`UITabBarController`用于实现底部...
在iOS开发中,`UIViewController`是苹果提供的一个核心类,用于构建用户界面。自iOS 5发布以来,这个类引入了一些新的使用方法,极大地增强了UI的管理和交互能力。本篇文章将详细探讨`UIViewController`在iOS 5及...
在iOS应用开发中,UIViewController是核心的控制器类,它负责管理屏幕上的用户界面视图以及与之相关的数据。本文将深入探讨UIViewController的生命周期及其主要属性和方法,帮助开发者更好地理解和运用这一关键组件...
在iOS开发中,自定义UIViewController的弹出效果是一种常见的需求,可以用于展示模态视图、弹窗或者对话框。这种效果通常是通过动画实现的,让视图控制器以一种吸引用户注意力的方式出现。"IOS弹出自定义...
// 在容器视图中添加fromView和toView transitionContext.containerView.addSubview(fromView!) transitionContext.containerView.addSubview(toView!) // 缩放动画 UIView.animate(withDuration: ...
在iOS开发中,UIViewController是应用界面的基本控制器,它负责管理屏幕上的用户界面。当我们需要在不同的UIViewController之间传递数据或进行交互时,通常有多种方式,其中包括带值跳转和利用协议实现通信。本篇...