这是我参与「第四届青训营」笔记创作活动的第3天,记录了8月3日下午iOS青训营课程的主要内容
课堂重点
本次课程主要讲解了iOS App的生命周期,视图、视图层级及其效果,介绍了常用的UI控件,为进行iOS App开发奠定基础。
iOS App的生命周期
iOS App的入口
- main函数:一般情况下开发者不修改它的实现
- UIApplicationMain方法:创建UIApplication对象,指定代理对象AppDelegate,开启应用程序的生命周期
- UIApplication:单例模式,iOS的应用实例,监听应用级事件(点击等事件首先发给它,后续分配处理)
- AppDelegate:应用级事件代理,管理应用程序的生命周期、通知事件、外部调用等
- UIApplicationMain方法:创建UIApplication对象,指定代理对象AppDelegate,开启应用程序的生命周期
iOS App的生命周期
- 包含五种状态
- Not Running:未运行
- Inactive:前台非活动状态,处于前台,不接受事件处理
- Active:前台活动状态,处于前台,接受事件处理
- Background:后台状态,进入后台,如果有可执行代码则执行,执行完毕之后进入挂起状态(Suspended)
- Suspended:挂起状态,进入后台,不能执行代码,如果内存不足则杀死(进入Not Running)
点击抖音(Active) —— 点击home(Active -> Inactive -> Suspended) —— 内存不足(-> Not Running)
-
App的生命周期,就是根据这些状态之间进行变化而在UIApplicationDelegate中响应的回调方法
视图与视图层级
UIKit:提供基础的视图类库
- 视图(UIView):创建并管理图层,处理布局(图片、文字、视频)和触摸事件(鼠标、手势等用户输入),不处理绘图和动画
- 使得动画和操作更简单,可以处理点击
- 灵活缺陷:没有相应接口时,只能调用CALayer层的操作
- 生命周期:创建、子视图布局、将自己加入父视图、将自己移出父视图、添加到窗口、移出窗口(在接口层可以查看)
- 图层(CALayer):管理子图层位置,用方法和属性做动画和变换(前缀来自CoreAnimation),不处理用户交互,不响应事件
- 每个视图都是对图层的封装,二者具有平行的层级关系
- 视图控制器(UIViewController):所有控制器的基类,负责视图显示、界面跳转
-
生命周期:创建 -> 呈现 -> 消失(跳转)
init -> loadView -> viewDidLoad -> viewWillAppear -> viewDidAppear -> (开始退出) -> viewWillDisappear -> viewDidDisappear -> viewWillUnload -> viewDidUnload -> dealloc -
init:进行数据初始化
-
loadView:创建和初始化View
-
viewDidLoad:创建附加的View和空间
-
viewWillAppear:显示前处理,如键盘弹出、特殊动画
-
viewDidAppear:显示动画后的操作
-
图层几何学
- 物体的六个自由度:xyz轴坐标,xyz轴旋转
- UIView三个重要属性:frame、bounds、center(仅仅是存取方法)
-
将元素加到不同的属性上,对应的位置不同
-
CALayer中对应为:frame、bounds、position(实际属性)——改变UIView之后,一定会改变CALayer
-
- 锚点:移动图形的把柄(围绕该点旋转),可以移动,左上角(0,0),右下角(1,1),可以在图层之外
- 图形变换(坐标系):一个图层的position依赖于它的父图层,如果父图层移动,那么所有的子图层都会移动
- iOS上,position从父图层左上角开始,macOS上则为左下角,CALayer提供坐标转换的方法
- 图形变换(zPosition):默认后声明的图层显示在前声明的上面
- 可以通过设置图层的.layer.zPosition来调整呈现的上下顺序:但是这样只是调整了绘制顺序(CALayer),View层顺序不改变,这样如果出现点击事件,则点击不到对应图层,所以还要用.layer.zPosition再次调整View的顺序
- 图形变换(仿射变换):transform属性,CGAffineTransform类型,进行二维空间基址变换。
视图布局
- 手动布局:绝对位置
- 自动布局:关注的是约束(相对位置,一个控件的某个量与另一个控件的某个量之间的线性关系)
- 原生自动布局AutoLayout:基于Cassowary算法进行位置计算。但是当元素增加时,代码膨胀很快,代码冗余难以维护。
- 第三方自动布局框架Masonry:对AutoLayout进行封装,常用API(在接口层可以查看):
- mas_makeConstraints():添加约束
- mas_remakeConstraints():移出旧的,添加新的
- mas_updateConstraints():更新约束,只更新重写的部分
- equalTo():赋值,参数是对象类型,视图对象(xxView)或者mas_width等坐标系对象(@90)
- mas_equalTo():可以传递基础数据类型
视觉效果
-
圆角:.layer.cornerRadius
-
边框:.layer.borderWidth、 .layer.borderColor
-
阴影:.layer.shadowRadius、 .layer.shadowColor、 .layer.shadowOpacity、 .layer.shadowOffset
-
设置之后,由底层图形引擎绘制
-
阴影会扩散到子视图,边框不会自动扩散
常用的UI控件
UIButton
UILabel
UIColletionView
- Layout布局
- 最常用:UICollectionViewFlowLayout,指定大小、行距、间距、排布顺序(N字、Z字等)等
- 设置好之后交给UICollectionView
- DataSource数据代理
- 实现UICollectionViewDataSource协议,当UICollectionView显示时则会调用指定对象的代理方法来获取数据、渲染Cell
- 同时注册不同类/不同Identifier的cell,在使用时,从缓存池中根据Identifier取用对应的cell
- 缓存池:只显示屏幕放得下的cell的数据,滑动后再加载新的数据(cell的重用)
- 每当有一个cell从屏幕消失则放入缓存池,每当有一个cell出现则从缓存池中取——缓存池中没有再创建新的
- cell重用机制
- UICollectionView必须先注册再使用
- !!UITableView可以不事先注册,而是在要用的时候手动判断是否存在,再主动加入缓存池(init方法差异)
- Delegate行为代理
- 实现UICollectionViewDelegate协议,当不同cell收到用户点击等事件后,将调用指定代理对应的方法执行业务行为
UITableView:与UICollectionView一样有三层
总结
了解了iOS App的生命周期和代码流转逻辑,认识了常用的各种页面布局方法和UI控件。
待办:后续有时间时,实现一下课程作业: