iOS App入门和UIKit简介|青训营笔记

222 阅读5分钟

这是我参与「第四届青训营」笔记创作活动的第3天,记录了8月3日下午iOS青训营课程的主要内容

课堂重点

本次课程主要讲解了iOS App的生命周期,视图、视图层级及其效果,介绍了常用的UI控件,为进行iOS App开发奠定基础。

iOS App的生命周期

iOS App的入口

  • main函数:一般情况下开发者不修改它的实现
    • UIApplicationMain方法:创建UIApplication对象,指定代理对象AppDelegate,开启应用程序的生命周期
      • UIApplication:单例模式,iOS的应用实例,监听应用级事件(点击等事件首先发给它,后续分配处理)
      • AppDelegate:应用级事件代理,管理应用程序的生命周期、通知事件、外部调用等

iOS App的生命周期

  • 包含五种状态
    • Not Running:未运行
    • Inactive:前台非活动状态,处于前台,不接受事件处理
    • Active:前台活动状态,处于前台,接受事件处理
    • Background:后台状态,进入后台,如果有可执行代码则执行,执行完毕之后进入挂起状态(Suspended)
    • Suspended:挂起状态,进入后台,不能执行代码,如果内存不足则杀死(进入Not Running)

image.png 点击抖音(Active) —— 点击home(Active -> Inactive -> Suspended) —— 内存不足(-> Not Running)

  • App的生命周期,就是根据这些状态之间进行变化而在UIApplicationDelegate中响应的回调方法

    image.png

视图与视图层级

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

      image.png

  • 锚点:移动图形的把柄(围绕该点旋转),可以移动,左上角(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

  • 设置之后,由底层图形引擎绘制

  • 阴影会扩散到子视图,边框不会自动扩散

    image.png

常用的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控件。

待办:后续有时间时,实现一下课程作业:

image.png