概述
View Controller Programming Guide for iOS
View Controllers分类
View Controller的内容可以通过多种方式来展示:
- 把view controller作为window的根视图控制器
- 把view controller作为一个容器的子控制器
- 通过弹出popover来展示view controller
- 从另一个view controller present出来
当view controller的view被访问时view controller来实例化其视图层次结构
当app的某些部分来请求view controller的view对象时,view对象当前不在内存中,那么view controller就会加载这个view hierarchy到内存中,并将其存储在其view属性中,已备用。加载周期如下:
1.view controller 调用loadView方法。默认实现的loadView方法会执行如下两个操作之一:
- 如果view controller使用了storyboard,它会从storyboard中加载views
- 如果view controller没有使用storyboard,会创建一个空的UIView对象,并将其指派给view属性。
2.view controller会调用viewDidLoad方法
How View Controllers Participate in the View Layout Process(视图控制器是如何参与视图布局过程的)?
当视图控制器的view大小改变时,它的子视图会重新定位以适合新的空间。视图控制器中view的view hierarchy执行这项工作,大部分是使用布局约束和autoresizing mask。然而,view controller也会在不同的点被调用,以便它能参与这一过程。这里做的是:
1.view controller被调整到新的大小
2.如果Auto Layout没使用,views根据它们的autoresizing masks来调整大小。
3.view controller的viewWillLayoutSubviews方法被调用。
4.view的layoutSubviews方法被调用,如果auto layout被用来配置view hierarchy,它会通过执行如下的步骤来更新布局约束:
- view controller的updateViewConstraints方法被调用。
- UIViewController类的updateViewConstraints方法的实现来调用view的updateConstraints方法。
- 在布局约束被更新后,一个新的布局被计算出来,views来重新定位。
5.view controller的viewDidLayoutSubviews方法被调用。
理想情况下,views本身会执行所有必须得工作来重新定位自己,根本不需要view controller参与其中。通常情况下,你可以完全在Interface Builder中来配置布局。然而,如果在view controller中动态的添加和删除views,那么在Interface Builder中的静态布局则可以不太合适。在这种情况下,view controller是个控制过程的好地方。在view controller中最佳途径是:
- 使用布局约束来自动定位views(iOS6及以后)。你可以重写updateViewConstraints方法来添加任何必要的约束,并不仅仅是已经配置的约束。此方法必须调用[super updateViewConstraints]方法。
- 联合使用autoresing mask和代码来手动定位view(iOS5.x)。你可以重写layoutSubviews,使用它来重新定位不能通过使用autoresing mask的任何view。
Supporting Multiple Interface Orientations支持多个方向
当iOS设备的方法变化的时候,系统会发出UIDeviceOrientationDidChangeNotification的通知。UIKit framework会监听这个通知,并使用它来自动的旋转屏幕。
当用户界面旋转时,window会调整大小以匹配新的方向。window会调整根view controller的大小来匹配,并且此大小会依次传递到视图层级的其它view上。另外,在view controller中支持多个方向的最简单的做法是配置其view hierarchy,以便子view在其根view controller的frame改变后,重新更新位置。了解更多信息,请参见Resizing the View Controller’s Views.
控制支持的屏幕方向(iOS6)
当UIKit接收到了一个旋转通知时,它会使用UIApplication对象和根view controller来确定是否允许新的方向。如果两个对象都同意支持新的方向,那么就旋转方向到新的用户界面。否则就忽略设备的方向。
当在根view controller上present了一个view controller之后,系统会以两种方式来做出改变。首先,当确定是否支持一个方向时,弹出的view controller会代替根view controller。第二,弹出的view controller还可以提供一个首选的方向。如果view controller是全屏的,那么用户界面会以首选的方向弹出。用户预计将会看到一个不同于设备方向的方向。首选方向,经常用与在一个新的方向上展示内容。
声明View Controller支持的方向
一个作为主window的根控制器的view controller 或 一个在主window上全屏展示的view controller可以声明它支持什么方向。通过重写supportedInterfaceOrientations方法。默认请款下,view controller在iPad设备上支持4个方向。在iPhone上,除了竖屏颠倒方向,其它的都支持。
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft;
}
动态控制是否发生旋转
有时你可能想要禁止自动旋转。例如,你可能想在短时间内抑制旋转。你必须暂时禁用改变方向,你想要手动控制状态栏的位置(例如你可以调用setStatusBarOrientation:animated: 方法)。
如果你想要暂时禁用自动旋转,避免操作orientation mask来做到这点。相反,重写最顶层的view controller的 shouldAutorotate 方法。这个方法在执行任何旋转之前被调用。如果返回值为NO,就禁止旋转。
Declaring a Preferred Presentation Orientation(声明一个首选的展示方向)
如果内容仅仅可以在某个方向显示,那么在supportedInterfaceOrientations方法中返回这个方向即可。如果view controller支持多个方向,但在一个不同的方向出现会更好,你可以通过重写preferredInterfaceOrientationForPresentation方法来提供首选的方向。
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationLandscapeLeft;
}
最后
以上就是舒心悟空为你收集整理的View Controller Programming Guide for iOS摘要的全部内容,希望文章能够帮你解决View Controller Programming Guide for iOS摘要所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复