ViewController Programming Guide 笔记(一)

最近花时间重读了一遍 View Controller Programming Guide,官方文档无论怎么都是最值得花时间去研读的,Apple 在 iOS 8.0 之后也更新了文档,我这个小 blog,今年挖了不少坑,不过从后台统计看,每天也有不少人从 Google 找到这里,既然能帮到大家,我就抽时间把之前坑都填了。关于 Advanced NSOperation Apple 又更新了代码,Limboy 也写了一篇深入浅出的 介绍,另外他最新的一篇 学习如何学习 也值得推荐。不忘初心,方得始终!

Defining Your Subclass

我们通常会子类化 UIViewController 来展示 App 的内容

Defining Your UI

通常你会使用 Storyboard 来定义 UI

  • 为 Viewcontroller 添加,布局,设置 View
  • 连接 outlets 和 actions
  • 用 segue 创建 view controller 间的关系
  • 为不同的 size classes 创建对应的 layout
  • 为 views 添加各种手势

Handling User Interactions

View Controller 很少直接参与响应事件,而是采用下面的方式:

  • 定义 action 方法处理一些高等级的事件
    • 控件事件
    • 手势识别
  • 观察由系统或其他对象发出的通知
  • 扮演其他对象的 data source 或 delegate

Displaying Your Views at Runtime

Storyboards 使载入 View 这一过程变得异常简单,UIKit 会在需要时自动从 Stroyboards 中导入 views。整个步骤如下:

  • 使用 storyboard 中的文件来实例化 views
  • 连接所有的 outlets 和 actions
  • 分配 root view 给 view controller 的 view 属性
  • 调用 view controller 的 awakeFromNib 方法。该方法被调用时,view controller 的 trait collection 为空,并且 views 可能还没有到相应的位置上
  • 调用 view controller 的 viewDidload 方法

在 View 出来之前,UIKit 给你额外的机会来准备这些 view(出现在屏幕前和出现在屏幕后)

  • viewWillAppear: view 出现在屏幕前调用
  • 更新 views 的 layout
  • 显示在屏幕上
  • 出现之后,调用 viewDidAppear:

当你添加、移除、修改 views 的尺寸,位置,记得移除相关的 constraints,对你的视图层次结构的布局相关更改会导致 UIKit 来标记为脏布局,在下次 runloop,layout 引擎会重新计算

Managing View Layout

当 view 的位置和尺寸发生变化时,UIKit 会更新 view 层级的 layout 信息,对于使用 Auto Layout 的系统,UIKit 会向一些相关对象更新约束信息,这样可以做出相应的改变。

在 layout 进程中, UIKit 会在下面一些时间点让你做一些 layout 相关的事情,对应的 view controller 会做下面的一些操作:

  • 在必要时,更新 view controller 的 trait collections 以及相关的 view
  • 调用 viewWillLayoutSubviews
  • 在当前 UIPresentationController 对象上调用 containerViewWillLayoutSubviews 方法
  • 在 view controller 的根 view 上调用 layoutSubviews 方法。该方法默认会使用当前可用的约束来计算新的 layout 信息,然后在 subview 上依次调用 layoutSubviews 方法
  • 应用新计算出的 layout 约束
  • 调用 View controller 的 viewDidLayoutSubviews 方法
  • 在当前 UIPresentationController 对象上调用 containerViewDidLayoutSubviews 方法

View controller 可以使用 viewWillLayoutSubviewsviewDidLayoutSubviews 方法在 layout 过程中来执行一些额外的操作,比如在 layout 前,增加或移除 views,更新 views 的尺寸 和大小,更新约束或者是 view 相关的属性。在 layout 后,你可能会重新载入数据,更新 view 的内容,或者确定 view 最终的尺寸和位置。

这里是一些高效管理 layout 的小贴士:

  • 尽量使用 Auto Layout
  • 利用 the top and bottom layout guides,可以确保你的内容始终是可见的(不会被状态栏,导航栏,tab bar 和 toolbar 遮挡住)
  • 当你增加或移除 views 后,记得更新 constraints
  • 临时移除 constraints 可以让 view 动画起来(移除完了再添加回来)

Managing Memory Efficiently

  • Initialization methods VC 的初始化方法中,确保 VC 到一个确定的状态
  • viewDidLoad 载入需要显示的数据
  • didReceiveMemoryWarning 内存紧张时调用
  • dealloc 做一些清理工作

-EOF-

如果感觉此文对你有帮助,请随意打赏支持作者 😘

chengway

认清生活真相之后依然热爱它!

Subscribe to Talk is cheap, Show me the world!

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!