说明:
iOS
实战项目
2.1 汤姆猫小游戏(投诉下线)
2.2 加法计算器
说明:本课时讲解
storyboard
中利用UITextField
、UILabel
、UIButton
快速搭建器计算器UI界面,并在viewController
中用代码完成计算的业务逻辑以及排除部分隐含的 bug,让大家学会自制计算器。
- 设置
Text Field
使用数字键盘- 点击“计算”后,使
Text Field
失去焦点- 处理
Text Field
没有输入的情况
ViewController.swift
1 | import UIKit |
2.3 制作图片浏览器
说明:本课时讲解通过
UILable
、UIButton
、UIImageView
搭建一个图片浏览器的结构,并通过字典数组完成它的业务逻辑,实现浏览趣味图片的功能。
- 切换按钮的不同
State Config
要分别进行设置- 通过设置按钮控件的
enabled
属性设置按钮是否可点击- 图片资源通过
plist
存储
ViewController.m
1 |
|
2.4 LOL英雄展示
说明:通过
UITableView
和plist
数据文件,搭建一个LOL英雄展示界面。
UITableView
需要通过右键菜单设置dataSource
和delegate
ViewController
要采纳相应的协议(UITableViewDataSource
,UITableViewDelegate
):通过采纳相应的协议实现对TableView
的中的cell
的创建工作- 通过使用
JKHero
类封装plist
数据
2.4.1 数据模版
JKHero.h
1 |
|
JKHero.m
1 |
|
2.4.2 采纳协议
说明:通过扩展采纳协议。
ViewController.m
1 |
|
2.5 Face++人脸识别技术入门
注意:课程中的演示程项目是
Android
项目!
2.5.1 本课概要
2.5.1.1 Face++公司简介
- 北京旷视科技有限公司(Face++)创立于2011年,是一家专注于机器视觉和深度学习的科技创业公司。
- 北京旷视科技旗下的Face++人脸识别云平台,是世界最大的人脸识别技术云平台。服务超过2万的开发者,日调用超过2百万次,积累人脸数据超过10亿张。
- 北京旷世科技先后获得联想创投的天使投资,和创新工场李开复博士的A轮投资。并获得2012年黑马创业大赛全国总冠军。
2.5.1.2 Face++核心技术简介
- 旷视科技旗下Face++平台是世界最大的人脸识别技术云平台,提供包括人脸检测、人脸分析、人脸识别、人脸搜索等全套核心技术。
- Face++的人脸技术居世界领先地位。其中,人脸检测技术获
FDDB
评测世界第一,人脸关键点技术获300-W评测世界第一,人脸识别技术获LFW评测世界第一。 - Face++已搭建起世界领先的大数据深度学习(deep learning)技术引擎,可以提供人脸技术以外先进的视觉技术。其深度学习引擎可以和
Google
、Facebook
形成强有力竞争。 - 旷视科技拥有自己独立的知识产权,有多项国内国外专利在申。
人脸检测和追踪
- Face++人脸检测技术在世界权威
FDDB
测试集上排名世界第一 - Face++人脸检测技术针对移动和嵌入式设备做过多项性能优化,检测率高、内存消耗小、模型小,最小可稳定检测16x16大小的人脸
Face++人脸关键点定位
- Face++人脸关键点定位技术在世界权威300-W测试集上排名世界第一
- Face++人脸关键点定位提供5点,23点,83点等多个版本,对移动和嵌入式设备做过多项性能优化
Face++人脸属性分析
- Face++ 人脸属性分析可以分析出性别、年龄、种族、情绪,是否佩戴眼镜
- Face++性别、种族、情绪、眼镜分析精确度均在95%以上,年龄准确度平均误差在5岁范围内
Face++人脸1:1识别技术
- Face++人脸1:1验证技术已被广泛应用于帐号登录、身份验证等服务中,被联想、神州智联等大客户使用。在千分之一的误检率情况下,通过率超过70%
Face++人脸1:N识别技术
- Face++人脸识别技术在世界最著名
LFW
评测中排名世界第一,取到97.72%的准确度,力压Facebook
Face++人脸大规模搜索
- Face++人脸大规模搜索技术被奇虎360、世纪佳缘等大客户使用,可以用不超过4字节表示一张人脸,千万级别图片搜索可达0.1ms响应速度
2.5.1.3 Face++技术使用场景介绍
- 相机和相册类应用
- 电子商务和广告营销类
- 游戏类应用
- 人脸搜索
相机和广告
- Face++ 已经为美图秀秀、相机360等移动应用广告厂商提供了人脸检测、人脸追踪以及人脸关键点定位技术,通过这些技术移动应用可以在相机和相册中快速得定为人脸的位置以及五官的位置,为下一步的美化做提前准备。
- 通过Face++所能提供的人脸属性分析,包括年龄、性别、种族以及微笑程度的判断,可以更好地评估电子商务、广告营销类的用户群体和这些群体所带有的属性。
游戏
- 现有的移动设备大多都带有前置摄像头,那我们可以通过这些前置摄像头以及Face++ 所能提供的人脸检测和追踪技术,快速定位人脸以及人脸位置的变化。通过具体实际人脸的位置变化来操控游戏中的人物的位置变化。
人脸搜索和人脸登录
- Face++已经为360搜索和世纪佳缘提供了此项技术,可以在千万级的会员库中快速准确地定位到具体的某个人以及与他相似的人
- Face++已经为联想视频通话软件--友约和神州智联提供了此项技术,可以瞬间验证使用者的身份是否属实。
2.5.2 Face++介绍
2.5.3 线上API分析
术语 | 说明 | 用途 | 依赖的数据 |
---|---|---|---|
face | 基本属性 | ||
faceset | face集合 | 搜索集合中的face | faceid 、faceset_name 、face 、set_id |
person | 人 | 验证 | faceid 、 person_name(person_id) |
group | 人群 | 匹配 | identity 、 url(ing) 、 group_name(group_id) |
2.5.4 离线API的下载和配置
说明:离线API主要用于在客户端提取图片的信息,从而与线上服务器配合完成一些处理。
注意:在Face++
官网创建自己的应用后才能下载到相应的离线SDK
我的学习应用:http://www.faceplusplus.com.cn/uc/app/home?app_id=42841
2.5.5 Face++实例编写
2.5.6 Face++人脸识别总结语
2.6 应用管理
2.6.1 项目讲解和模型搭建
- 创建项目
- 设置
Storyboard
(设置Size
为iPhone 3.5-inch
,取消Use Auto Layout
和Use Size Classes
) - 导入素材(图片和
plist
文件) - 为
plist
文件创建数据模型
数据模型
JKAppInfo.h
1 |
|
JKAppInfo.m
1 |
|
2.6.2 Xib自定义视图
- 创建
JKAppView
(继承UIView
) - 创建
xib
文件(iOS
->User Interface
->Empty
)
Size
:Freeform(然后宽和高就可以设置了)
- 在
xib
中创建需要的展现单个app
信息的控件 - 在
xib
文件和JKAppView
类之间创建关联 - 完善
JKAppView
类
2.6.2.1 xib视图文件
2.6.2.2 绑定的类(UIView
)
JKView.h
1 |
|
JKView.m
1 |
|
2.6.3 创建自定义视图数组
说明:在
ViewController
中初始化JKAppView
数组
ViewController.m
1 |
|
2.6.4 九宫格布局展示
说明:九宫格布局开发
- 宏定义界面布局的相关参数
- 确定间距
- 为确定每个下载项的位置(通过设置中心点坐标)
ViewController.m
1 |
|
2.6.5 点击效果分析与bug排除
说明:点击
下载
时弹出等待画面
ViewController.m
1 |
|
2.6.6 延时操作与块动画
说明:过一段时间以多线程的方式延时处理。
ViewController.m
1 |
|
2.7 超级猜图
2.7.1 效果展示与业务逻辑分析
2.7.2 模型搭建
说明:创建对应
plist
文件的数据模型。
- 视图控制器基本设置
- 导入相关素材(图片和
plist
)- 创建对应
plist
文件的数据模型
JKQuestionInfo.h
1 |
|
JKQuestionInfo.m
1 |
|
2.7.3 Storyboard 布局 UI
技巧:
- 可以在
Storyboard
中为控件设置内边距- 有时候用
Button
替代ImageView
会更方便
2.7.4 拖线与注释
技巧:多个控件可以绑定同一个
action
。方式是
ViewController.m
1 |
|
2.7.5 创建模型数组与遮罩
说明:遮罩用来监听点
击屏幕任何地方
的事件。
ViewController.m
1 |
|
2.7.6 实现图片缩放
说明:
ViewController.m
1 |
|
2.7.7 下一题方法实现
说明:用户点击下一题按钮时界面做出相应的改变
ViewController.m
1 |
|
2.7.8 创建答案按钮
说明:设置基本信息时创建放置答案的一排按钮集合。
ViewController.m
1 |
|
2.7.9 创建备选答案按钮
说明:当
点击下一题
或程序刚启动
时,需要设置备选答案按钮。
技巧:以懒加载的方式创建备选按钮,这样就不用每次都重新创建备选按钮。
ViewController.m
1 |
|
2.7.10 答案按钮点击
说明: 点击组成答案的按钮,该按钮清除其文字,而相应的备选答案按钮会重新出现该文字。
ViewController.m
1 |
|
2.7.11 备选按钮点击
说明:被点击的备选按钮会清除其文字,并将该文字写到答案按钮中。
ViewController.m
1 |
|
2.7.12 提示点击方法的实现
说明:提示按钮每被点击一次,答案按钮就回为答案生成一个字。
ViewController.m
1 |
|
2.8 国家选择
2.8.1 UIPickerView
与数据模型
的创建
说明:要点如下
- 导入素材(
jpg
格式的图片不能放在Assets.xcassets
中管理)- 创建自定义
UIView
类:JKCountryInfo
ViewController
采纳UIPickerView
注意:
gif
格式的图片不能放在Assets.xcassets
。
2.8.1.1 UIPickerView
说明:类似
TableView
,可以通过让普通ViewControll
采纳协议UIPickerViewDelegate
和UIPickerViewDataSource
实现
- 通过拖动建立
PickerView
控件和ViewController
类之间的关联
ViewController.m
1 |
|
2.8.1.2 数据模型的创建
JKContryInfo.h
1 |
|
JKContryInfo.m
1 |
|
2.8.2 自定义视图完善实例
说明:自定义
PickerView
中的每一行采用的视图。
2.8.2.1 创建xib
文件
说明:要点如下
- 创建的
xib
文件和要绑定的UIVIew
的文件名要一致。注意:待对应的
UIView
子类创建完毕后,手动绑定之。
JKCountryFlagView.xib
2.8.2.2 创建JKCountryFlagView
类
说明:该类用来绑定上面创建的
xib
文件。
JKCountryFlagView.h
1 |
|
JKCountryFlagView.m
1 |
|
2.8.2.3 完善ViewController
说明:采纳协议
UIPickerViewDelegate
和UIPickerViewDataSource
ViewController.m
1 |
|
2.9 图片自动播放
2.9.1 创建UIScrollView
和UIPageControl
说明:要点
ViewController
采纳UIScrollViewDelegate
- 创建
UIScrollView
- 创建
UIScrollPageControl
2.9.2 定时器与代理方法调用
说明:要点
- 封装一些相关的方法:清除
timer
、添加timer
等- 遵守协议
UIScrollViewDelegate
:定义滑动前、中、后需要的操作
2.9.3 代码摘要
ViewController.m
1 |
|
2.10 QQ列表展示
说明:该项目使用
MVC
模式。注意:
Xcode
工程中的文件夹有两种:黄色
的为辅助进行代码管理的“伪文件夹”,蓝色
的为真正的文件夹。
2.10.1 模型搭建
说明:需要两个数据模型,
JKGroupModel
(好友所在分组)和JKFriendsModel
(好友)
- 导入
plist
- 创建数据模型
2.10.1.1 JKGroupModel
说明:好友分组的数据模型
JKGroupModel
1 |
|
JKGroupModel.m
1 |
|
2.10.1.2 JKFriendsModel
说明:好友的数据模型。
JKFriendsModel.h
1 |
|
JKFriendsModel.m
1 |
|
2.10.2 创建UITableView
说明:要点
- 在
AppDelegate
中创建二级导航(通过UINavigationController
)- 在
ListTableViewController
完善TableView
Model/AppDelegate.m
1 |
|
Model/ListTableViewController.m
1 |
|
2.10.3 自定义头视图
说明:
MVC
的View
部分
- 不创建
xib
文件- 完全通过代码创建视图
- 继承
UITableViewHeaderFooterView
注意:如果头视图被自定义了,则需要在
viewDidLoad
中重新设置其高度。
2.10.3.1 View
部分
View/HeaderView.h
1 |
|
View/HeadView.m
1 |
|
2.10.3.2 Controller
部分
说明:整个qq列表实际上是一个
UITableView
Controller/ListTableViewController
1 |
|
2.10.4 点击效果的实现
说明:
- 点击群组栏(
HeaderView
,继承自UITableViewHeaderFooterView
)中的按钮
- 展开群组
- 三角按钮变化
- 点击好友(
cell
),push到一个空界面
View/HeaderView.m
1 |
|
Controller/ListTableViewController.m
1 |
|
2.11 三级控制器
说明:项目截图
API:
三级控制器
的实现使用到的UIKit
UITabViewController 相关成员 |
原型 | 说明 |
---|---|---|
viewControllers | @property(nonatomic, copy) NSArray<__kindof UIViewController *> *viewControllers |
存储着tab视图管理的所有二级控制器实例 |
selectedIndex | @property(nonatomic) NSUInteger selectedIndex |
当前被选中的tab item的下标,修改该值会导致视图的切换 |
2.11.1 初始化视图控制器
说明:本课时讲解
三级控制器
的结构,自定义视图控制器并初始化学习用新语法创建数组并赋值。用导航控制器
构建二级控制器
。
AppDelegate.m
说明:使用新的
window
替换掉项目创建时默认的window
。
1 |
|
RootViewController.m
1 |
|
2.11.2 自定义标签工具栏
说明:本课时讲解隐藏系统自带
标签工具栏
样式,并自定义按钮和视图,根据系统的标签工具栏
的属性实现切换。
RootViewController.m
1 |
|
2.11.3 页面跳转的两种方式
说明:本课时讲解页面两种跳转方式。通过
导航控制器
实现push
和通过视图控制器
实现模态视图。并讲解iOS8
中新的方法。
- 从
三级控制器
push
出其它页面需要隐藏标签工具栏
,pop
回来后需要展现标签工具栏
2.11.3.1 RootViewController
说明:在
标签控制器
中定义标签工具栏
的显示/隐藏方法
RootViewController.h
1 |
|
RootViewController.m
1 |
|
2.11.3.2 ProfileViewController
说明:
首页
中通过两种方式跳转。
1 |
|
2.11.3.3 PushViewController
说明:作为
push
跳转方式的目的地视图
1 |
|
2.11.3.4 ModalViewController
说明:作为
dismiss
方式跳转方式的目的地视图
1 |
|
2.12 通讯录
说明:本课实现模拟通讯录的登陆、添加、删除、修改的功能,涉及到第三方类库的使用,数据存储并加深理解代理和
UITableView
。
Storyboard
中设置页面跳转- 第三方类库
MBProgressHUD
- 数据存储
UITableView
的深入理解
2.12.1 Storyboard
实现布局和跳转
说明:本课时讲解创建自定义视图控制器并通过
storyboard
来布局页面,学习手动跳转的方法。
API
UITextField 成员 |
类型 | 描述 |
---|---|---|
becomeFirstResponder |
实例方法 | 使文本输入框自动获取焦点,呼出键盘,类似html 中的autofocus |
UITextField 成员 |
类型 | 描述 |
---|---|---|
`` |
2.12.1.1 布局
1. 建立Navigaton Controller
和LoginViewController
之间的关联
2. LoginViewController
跳转到ContactTableViewController
采用
iOS8
后的新的show
替代push
3. 自定义ContactTableViewController
的导航栏
- 自定义导航栏需要添加
Navigation Item
控件Navigation Item
内的按钮要使用Button Item
控件- 按钮中使用系统图标(
System Icon
)
2.12.1.2 跳转
- 使用
NSNotificationCenter
监控文本的变化- 使用在
Storyboard
中为视图之间建立的连接
的identifier
访问连接
LoginViewController.m
1 |
|
2.12.2 UIAlertController
与添加页面布局
说明:本课时讲解
iOS8
中新控制器UIAlertController
的使用,并通过storyboard
布局添加联系人页面,用第三方类库 MBProgressHUD 实现网络加载进程的效果。
1. 登录过程中使用MBProgressHUD
实现提示窗
LoginViewController.m
1 | ... |
2. 在联系人列表界面
中点击添加按钮
跳转到添加页面
3. 在联系人列表界面
中点击注销按钮,注销登陆
UIAlertController
:iOS8
之后出现的,用来弹出提示窗,取代了UIAcionSheet
和UIAlertView
。
ContactTableViewController.m
1 |
|
4. 为登陆界面
的输入框增加清空按钮
5. 为登陆界面
的密码输入框设置安全输入
6. 初始化联系人列表界面
中的联系人
- 添加属性
contactArr
- 在
Storyboard
中为联系人cell
设置identifier
,并设置其Style
为Right Style
ContactTableViewController.m
1 | @interface ContactTableViewController () |
2.12.3 添加功能与传值
说明:本课时讲解实现添加功能,添加联系人信息后通过代理传递数据到上一层视图控制器。用
storyboard
布局编辑页面。
1. 创建JKContactModel
数据模型
该数据模型能够
序列化
和反序列化
JKContactModel.h
1 |
|
JKContactModel.m
1 |
|
2. 定义具备添加功能(传值)的代理协议,并使用代理对象实现添加功能
- 让姓名文本框自动获取光标,弹出虚拟键盘
AddViewController.m
1 |
|
AddViewController.m
1 |
|
联系人列表视图
中接受数据并增加一条联系人信息- 去掉多余的 table 中多余的线
- 在cell右侧添加箭头
ContactTableViewController.m
1 |
|
4. 设置键盘类型
2.12.4 编辑页面功能完善
说明:本课时讲解实现编辑页面的功能,点击编辑修改响应的按钮和文本框状态,并通过代理方法传值。
1. 在Storyboard
中创建并初始化编辑页面的布局
- 为cell建立
selection segue
- 设置按钮默认隐藏
- 设置
编辑界面
的输入框默认不可点击
2. 完善EditViewController
- 初始化界面数据
- 定义编辑界面的代理协议
- 实现编辑action
- 实现保存action
“Controller/EditViewController.h”
1 |
|
“Controller/EditViewController.m”
1 |
|
联系人列表界面
采纳代理协议,接收编辑页面的数据- 跳转到编辑页面前为
编辑界面
赋值代理对象 - 实现滑动删除功能
ContactTableViewConrtroller.m
- 跳转到编辑页面前为
1 |
|
2.12.5 数据存储
说明:本课时讲解数据存储的四种方式的区别,学习
偏好设置
和归档
的方式存储数据,并解决添加页面不能传值的问题。
数据存储方式 | 说明 |
---|---|
plist | 需要知道文件名,只适合NSArray 、NSString 等基本数据类型 |
偏好设置 | 不需要知道文件名,小型数据NSUserDefaults |
对象归档 | NSKeyedArchiver ,必须采纳NSCoding 协议 |
core Data | 大型数据 |
sqpite3 | 数据库 |
2.12.5.1 便好设置
实战:登录界面载入后采用
便好设置
方式读取配置
- 页面载入时读取
便好设置
- 点击登录时存储
便好设置
LoginViewController.m
1 |
|
2.12.5.2 对象归档
实战:联系人列表界面使用
对象归档方式
存储数据。
JKContactModel
采纳NSCoding
协议- 对
联系人列表界面
中添加、删除和读取数据模型的操作进行归档
ContactTableViewController.m
1 |
|
2.13 绘制小黄人
Quartz 2D
说明:是一个二维绘图引擎。
Quartz 2D
的API
是C
语言,来自于CoreGraphics
框架。该框架可以用来
- 绘制图形:线条/三角形/矩形/圆/弧等
- 绘制文字
- 绘制、生成图片(图像))
- 读取/生成pdf
- 截图、裁剪图片
- 自定义UI控件
技巧:
UIView
就是通过该引擎实现的控件绘制,因此可以通过继承UIView
定义自己的控件。
图形上下文(Graphics Context):是一个CGContextRef
类型的数据,用来
- 保存绘图信息、绘图状态
- 决定绘制的输出目标(绘制到什么地方去,输出目标可以是PDF文件、Bitmap或者显示器的窗口上)
2.13.1 Quartz 2D
基本图形
说明:本课时讲解
Quartz 2D
的概念,drawRect
方法的调用、图形上下文、以及线段、三角形、四边形的绘制方法。
DrawLine.h
1 |
|
DrawLine.m
1 |
|
2.13.2 绘制圆、图片与文字
说明:本课时讲解绘制圆弧、圆形、图片与文字的方法,所用函数及函数参数的含义,并介绍多种不同的函数绘制图形,最后介绍了
Quartz 2D
中的贝塞尔曲线。
DrawCircle.m
1 |
|
2.13.3 绘制小黄人雏形
说明:本课时讲解根据所学习的
Quartz 2D
的绘制图形的知识绘制小黄人雏形,以此加深对绘图的理解。
DrawHuman.m
1 |
|
2.14 手势密码锁
UIGestureRecognizer
说明:所有手势操作相关的操作的类的
基类
UIGestureRecognizer 的子类 |
对应的手势操作 |
---|---|
UITapGestureRecoginizer |
点击 |
UIPinchGestureRecognizer |
捏合 |
UIRotationGestureRecognizer |
旋转 |
UISwipwGestureRecognizer |
轻扫、快速移动,是用于监测欢动方向的 |
UIPanGestureRecognizer |
拖移、慢速移动,是用于监测便宜的量的 |
UILongPressGestureRecognizer |
长按 |
2.14.1 点击、捏合、轻扫
说明:本课时讲解点击手势,单击和双击,手势互斥原则的概念和解决方法,捏合手势缩放视图以及轻扫手势的使用。
ViewController.m
1 | ... |
2.14.2 拖移、旋转、长按
说明:本课时讲解拖移、旋转和长按手势的声明以及响应方法,根据其属性和方法来深入理解手势。
1 | /** |
2.14.3 九宫格布局按钮
说明:本课时讲解通过
storyboard
添加背景视图,并通过代码布局按钮,运用到了九宫格布局算法,对触摸事件和按钮的功能进行代码封装。
- 引入图片资源
- 创建
JKLockView
(UIView
)- 重写
initWithFrame
和initWithCoder
- 布局
JKLockView
并添加按钮
2.14.4 手势连线与代理
说明:本课时讲解将按钮根据手势触摸连线,修改按钮选中状态、手势结束后取消连线、最后设置代理方法来判断密码是否正确。
- 完成连线逻辑
- 在
JKLockView
中定义代理协议ViewController
采纳代理协议- 在
JKLockView
中调用代理对象- 在
ViewController
中使用UIAlertController
注意:
- 数组或字典中添加的对象不能为
nil
,否则程序会崩溃- 当视图发生变化时,调用
setNeedDisplay
更新视图技巧:通过
makeObjectsPerformSelector
向数组中的每一个对象发送信息
2.15 抽奖转盘动画
说明:
QuartzCore
框架是常用的框架,除了绘图还有动画效果,通过这个课程理解常用的CAAnimation
类,并且了解图层与视图的关系,包括CALayer
的自定义方法和属性。
- CALayer
- CAAnimation
- 转场动画与组动画
- 隐性动画
- CGImageCreateWithImageInRect
- CADisplayLink
兼容性:
QuartzCore
与CoreGraphics
是可以跨平台使用的,UIKit
只能在iOS
中使用
2.15.1 CALayer图层介绍
*课程介绍:本课时讲解CALayer
图层的概念,介绍图层的属性和自定义图层的方法。*
CALayer
依赖:使用层之前,需要在项目中引入
QuartzCore.framework
框架
用途:CALayer
(层)是屏幕上的一个矩形区域,在每一个UIView
中都包含一个根CALayer
,在UIView
上的所有视觉效果都是在这个Layer
上进行的。
- 层的大小尺寸
- 背景色
- 内容(可以填充图片或者使用
Core Graphics
绘制的内容)- 矩形是否使用圆角
- 矩形是否有阴影
感性认知:
CALayer
本质上是一块包含一幅位图的缓冲区,由视图创建的层为隐式层
,而手动创建的层称为显示层
。
种类:Layer
有很多种,最常用也是最基本的是CALayer
,当然还包括其他的子类
CAScrollerLayer
简化显示层的一部分CATextLayer
文本层CAGradientLayer
、CAShapeLayer
等等
2.15.1.1 原生控件使用CALayer
说明:在每一个
UIView
中都包含一个根CALayer
,在UIView
上的所有视觉效果都是在这个Layer
上进行的。
ViewController.m
1 |
|
2.15.1.2 自定义CALayer
说明:两种方式
- 建子类继承
CALayer
,实现drawInContext:
方法- 在控制器中设置代理,实现代理方法来画图层
方式一:继承CALayer
MyCALayer.h
说明:继承
CALayer
注意:需要在项目的info.plist
中导入QuartzCore
库
1 |
|
MyCALayer.m
说明:需要重写
drawInContext
方法,该方法在视图变动时通过setNeededDisplay
被自动调用。
1 |
|
ViewController.m
说明:在控制器中使用这个自定义的
MyLayer
,将图层实例添加到视图中。
1 |
|
方式二:实现代理当法
说明:和方式一一样要创建
CALayer
的子类,但不用实现drawInContext
方法,而是设置代理对象(可以是任何类的实例),绘制的过程由代理对象重写drawInContext
方法来实现。
JKLayer.h
1 |
|
JKLayer.m
1 |
|
ViewController.m
1 |
|
2.15.2 CAAnimation 动画
说明:基本动画、关键帧动画、组动画
基本动画类型 | 说明 | 父类 | 用途 |
---|---|---|---|
CABasicAnimation |
基础动画 | 属性动画 | 平移、旋转、缩放 |
CAKeyframeAnimation |
关键帧动画 | 属性动画 | 按照某种自定义路径移动 |
CATransition |
转场动画 | CAAnimation |
不同layer之间的切换 |
CAAnimationGroup |
组动画 | CAAnimation |
将几个不同的动画放在同一个组里 |
ViewController.m
1 |
|
2.15.3 转场动画
说明:本课时讲解核心动画的两个子类即
转场动画
和组动画
,并介绍了转场动画的私有 API ,全面理解CAAnimation
。
ViewController.m
1 | ... |
2.15.4 实例动画按钮布局
说明:本课时讲解转盘动画实例,进行效果展示并完成
UI
布局,介绍了裁剪图片的新方法。
- 导入资源
- 创建轮盘类(
WheelView
,继承UIView
)- 创建轮盘类对应的
xib
文件要点: 使用
CGImageCreateWithImageInRect
裁剪图片
2.15.5 CADisplayLink实现动画效果
说明:本课时讲解通过
CADisplayLink
实现动画效果,完善实例动画功能,复习了CABasicAnimation
的属性和方法。要点:使用
CADisplayLink
通过刷新实现动画,
注意:这里没有使用核心动画,因为它们在动画过程中响应点击的位置并没有真的发生变化。CADisplayLink
就可以做到。