首先是搭建框架
![](http://images2015.cnblogs.com/blog/784420/201512/784420-20151212034825934-1176464688.png?x-oss-process=image/resize,w_1400/format,webp)
![](http://images2015.cnblogs.com/blog/784420/201512/784420-20151212034853559-761027285.png?x-oss-process=image/resize,w_1400/format,webp)
其他的略过,直接展示效果:
![](http://images2015.cnblogs.com/blog/784420/201512/784420-20151212035154934-1107731714.gif?x-oss-process=image/resize,w_1400/format,webp)
然后接下来上传搭建好两个控制器框架的源码百度云下载链接: http://pan.baidu.com/s/1skjpDox 密码: ardx ,工程里面还有我花了好长时间弄好的图标素材哦。
然后在自定义继承UIView的CanvasView中:
![](http://images2015.cnblogs.com/blog/784420/201512/784420-20151212040955278-24985946.png?x-oss-process=image/resize,w_1400/format,webp)
然后效果是:
![](http://images2015.cnblogs.com/blog/784420/201512/784420-20151212041113262-923001480.gif?x-oss-process=image/resize,w_1400/format,webp)
因为上面逻辑上的缘故,所以每重新绘制一次就会清除前一次的痕迹。那么解决方案就是,通过一个强引用的可变数组索引来存储每一次创建的路径,然后绘制出就遍历这个数组,全部绘出路径即可。
![](http://images2015.cnblogs.com/blog/784420/201512/784420-20151212042416278-1353279639.png?x-oss-process=image/resize,w_1400/format,webp)
效果:
![](http://images2015.cnblogs.com/blog/784420/201512/784420-20151212042435575-1823819179.gif?x-oss-process=image/resize,w_1400/format,webp)
现在,需要将PatteleViewController的设置画笔属性起作用,所以需要在两个控制器传递数据,接下来就使用备忘录模式以及封装好的框架(http://www.cnblogs.com/goodboy-heyang/p/5041523.html),因为时间缘故,就不整理细节笔记了,真的太花时间了,这里我就偷懒一下了,直接上传动态效果图:
https://github.com/nicklockwood/FastCoding>
![](http://images2015.cnblogs.com/blog/784420/201512/784420-20151213114836934-1645881131.gif?x-oss-process=image/resize,w_1400/format,webp)
源代码百度云下载链接: http://pan.baidu.com/s/1kUdwtDl 密码: p81d
因为想体验一下直接用之前自己封装好的沙盒存取和操作的自定义SandBoxManager,看看加载速度快不快。
并且我还设置了toolBar的背景颜色:
![](http://images2015.cnblogs.com/blog/784420/201512/784420-20151213130540731-1604628882.gif?x-oss-process=image/resize,w_1400/format,webp)
这里提供使用封装好的SandBoxManager的源代码百度云链接: http://pan.baidu.com/s/1qWTcKEC 密码: z8qd
这里就上加载本地数据恢复对象状态的关键代码吧:
存储对象的状态:
![](http://images2015.cnblogs.com/blog/784420/201512/784420-20151213132642294-1805432200.png?x-oss-process=image/resize,w_1400/format,webp)
恢复对象的状态:
![](http://images2015.cnblogs.com/blog/784420/201512/784420-20151213132256137-290183783.png?x-oss-process=image/resize,w_1400/format,webp)
其实以上的方法就是瞎折腾,也不能算是瞎折腾,可以为以后开发遇到的新的需求提供新的可选择的方案,
那么接着就改为最优的方法,既然有Modal直接用Modal所有的方法和属性即可,
关键代码:
![](http://images2015.cnblogs.com/blog/784420/201512/784420-20151213160829294-8424903.png?x-oss-process=image/resize,w_1400/format,webp)
链接: http://pan.baidu.com/s/1sk2S8mp 密码: vtun 此源代码代码优化之后很整洁,优雅。
接下来就是要为toolBar的其他item添加功能了
![](http://images2015.cnblogs.com/blog/784420/201512/784420-20151213163310419-1702777537.png?x-oss-process=image/resize,w_1400/format,webp)
撤销功能:
![](http://images2015.cnblogs.com/blog/784420/201512/784420-20151213163354372-1389870644.png?x-oss-process=image/resize,w_1400/format,webp)
![](http://images2015.cnblogs.com/blog/784420/201512/784420-20151213172827059-2099254040.png?x-oss-process=image/resize,w_1400/format,webp)
这里需要添加一个业务逻辑:为了手绘之后要清楚存储撤销操作的数组:
![](http://images2015.cnblogs.com/blog/784420/201512/784420-20151213190954309-1352495656.png?x-oss-process=image/resize,w_1400/format,webp)
设置垃圾桶删除图标的事件监听:
![](http://images2015.cnblogs.com/blog/784420/201512/784420-20151213200019919-1143710056.png?x-oss-process=image/resize,w_1400/format,webp)
保存到系统相册的方法:
![](http://images2015.cnblogs.com/blog/784420/201512/784420-20151213200533762-1456442423.png?x-oss-process=image/resize,w_1400/format,webp)
这部分源码,可以直接复制利用:
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif?x-oss-process=image/resize,w_1400/format,webp)
接着,我突发奇想,想把特炫的苹果封装的好的转场动画用进去。当我点击垃圾桶图标删除当前这个画板,根据前面的代码我们也知道,会有弹出UIActionSheet提示框,点击确定当然会触发清空的功能,但是我希望是在清空之前有个翻页的功能,就好像前面不要的一页翻过去了。
![](http://images2015.cnblogs.com/blog/784420/201512/784420-20151214011532115-1108772055.png?x-oss-process=image/resize,w_1400/format,webp)
关于转场动画这里就不累述了,可以自行百度谷歌,或者参考我的博文笔记:http://www.cnblogs.com/goodboy-heyang/p/5044018.html
再看看运行效果
![](http://images2015.cnblogs.com/blog/784420/201512/784420-20151214011824302-226236257.gif?x-oss-process=image/resize,w_1400/format,webp)