本例完全实现了之前旧版本支付宝手势解锁的功能,部分借鉴CoreLock框架,并优化之:
1、优化了CoreLock框架中只有八个固定方向的缺陷
每个密码盘的指示方向由滑动到的下个密码盘的两点之间水平角度来动态确定,根据Core Graphic框架进行实时绘制。
2、优化了CoreLock框架中异常情况下密码盘错误信息提示不足的缺陷
在验证密码错误或者创建密码时两次输入密码不一致的情况下,不仅提示Label变为警示颜色和晃动,密码盘将显示0.5s的警示颜色,以提示用户。
3、学习使用block代替delegate方式的思路和方法
一直以来使用delegate模式进行回调的实现,阅读完CoreLock框架,开始学习使用block进行回调处理实现代理的方法。
简单传值使用block不错,但是delegate运行成本较低,block出栈需要将使用的数据从栈内存拷贝到堆内存,当然对象的话就是加计数,使用完或者block置nil后才消除。delegate只是保存了一个对象指针,直接回调,没有额外消耗。相对C的函数指针,只多做了一个查表动作。
继续学习和优化中...
项目过程中总结的疑难杂症:
-- 如何使9个圆盘内不出现实时线条?
在绘制上下文内为所有圆盘所在的View绘制圆形区域,添加进上下文之后添加CGContextEOClip则裁剪路径就是9个小圆盘,此时的情况是除了9个小圆盘内部其余的地方都不能绘制。而我们的目的是9个小圆盘内部不能绘制线条。此时则应将裁剪区域反转,即9个小圆盘的补集,可采用
CGContextAddRect(context, CGContextGetClipBoundingBox(context));
这样即将之前的裁剪区域的边框以外的所有绘制区域添加进了裁剪区域,反转完成~!