View Controller Programming Guide for iOS摘要

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值