摘要

IOS下使用CAShapeLayer+UIBezierPath实现互动画板时橡皮擦的实现方式。

背景

要在IOS端做一个在线教育DEMO,集成音视频互动、PPT白板互动、聊天等功能。

画板实现

IOS画板有很多实现,主要有

  • DrawRect+UIBezierPath:实现比较简单,橡皮擦也好实现,但是CPU较高,内存消耗大。
  • CAShapeLayer+UIBezierPath:性能较好,使用GPU绘制,内存占用也小,但是橡皮擦比较难实现。
  • GLES:比较底层,开发要求较高。

综合以上各个方式的特点,产品中比较合适的方案是CAShapeLayer+UIBezierPath,绘制办法很简单:

  • 为了支持多方不同的线色、线宽,每一笔都创建一个新的CAShapeLayer,每一笔都是覆盖绘制;
  • 使用UIBezierPath描述路径,并将path传递给CAShapeLayer;
  • 调用UIView.layer的addSublayer,将CAShapeLayer绘制到当前View上;
  • 缓存CAShapeLayer,在需要撤销一笔的时候只需要调用CAShapeLayer的removeFromSuperlayer,在需要重画一笔的时候重新调用UIView.layer的addSublayer。

橡皮擦实现

橡皮擦本质上跟画线是一样的动作,只是线色是背景色,如果没有背景图片,只需要把线色设置成背景色就可以实现橡皮功能。但是在有背景图片的场景下会比较麻烦,单一背景色会覆盖背景图片。这个时候需要把背景色设置成背景图片,但是需要进行一定的变换,否则橡皮擦的背景图片会发生翻转,以下是核心代码:

                        //创建一个新的ContextUIGraphicsBeginImageContext(self.frame.size);//获得当前ContextCGContextRef context = UIGraphicsGetCurrentContext();//CTM变换,调整坐标系,*重要*,否则橡皮擦使用的背景图片会发生翻转。CGContextScaleCTM(context, 1, -1);CGContextTranslateCTM(context, 0, -self.bounds.size.height);//图片适配到当前View的矩形区域,会有拉伸[image drawInRect:self.bounds];//获取拉伸并翻转后的图片UIImage *stretchedImg = UIGraphicsGetImageFromCurrentImageContext();//将变换后的图片设置为背景色[self setBackgroundColor:[[UIColor alloc] initWithPatternImage:stretchedImg]];//View的图层设置为原始图片,这里会自动翻转,经过这步后图层显示和橡皮背景都设置为正确的图片。self.layer.contents = (_Nullable id)image.CGImage;UIGraphicsEndImageContext();

代码和注释已经说明一切,CAShapeLayer+UIBezierPath的橡皮擦实现实际上也比较简单,只要知道原理。

另外有人的实现方式是把所有的CAShapeLayer图层合并成一张图片,然后在合并后的图片里使用UIBeizerPath的strokeWithBlendMode:kCGBlendModeClear进行混色,这也是一种办法,但是混色占用的CPU也会很高,相对来说,使用背景图片来当橡皮擦的画刷,性能是较好的。

IOS下实现高性能画板橡皮擦的办法相关推荐

  1. Mac下python3配置opencv3 3和Mac下单独opencv的配置以及iOS下配置opencv

    #1.Mac下python3配置opencv3.3 新手受任开发一个功能,需要用到opencv.但python和opencv连接出现问题,看了大概有上百份博客的解决办法,都没有解决,快要放弃了,解决了 ...

  2. 解决ios下的微信页面背景音乐无法自动播放问题

    前言 在做各种HTML5场景页面的时候,插入背景音乐是一个很普遍的需求.我们都知道,iOS下的safari是无法自动播放音乐的,以至一直以来形成了一种认知,iOS是无法自动播放媒体资源的.直到微信火爆 ...

  3. 解决Web移动端Fixed布局的方案(防止页面露底、overflow-scrolling、iOS下的 Fixed + Input BUG现象、isScroll.js)

    一些细节处理 在细节处理上,其实还有很多要注意的,挑几个实际遇到比较大的问题来说一下: 有时候输入框 focus 以后,会出现软键盘遮挡输入框的情况,这时候可以尝试 input 元素的 scrollI ...

  4. AIR 3实现iOS下对H.264视频硬件解码

    本帖最后由 nextria 于 2011-10-9 11:27 编辑 在此之前,AIR开发的应用程序在iOS下是不可能实现对H.264视频硬解码的, 也许是以一个多比特率的方式传送. 我知道,是吧? ...

  5. 仿Ios下拉菜单,android Spinner效果(美团下拉效果)

    先上效果图: 直接上代码: Ios spinner文件 package com.choe.iosspinner;import android.app.Activity; import android. ...

  6. app嵌套h5,ios下去掉上下橡皮筋的效果(上下回弹)

    app嵌套h5,ios下去掉上下橡皮筋的效果(上下回弹) 如果是前端自己解决的话会非常的费劲,我今天跟app开发的沟通了一下,他们很快的就解决了,所以直接用原生解决就行,不要下功夫找各种解决方法,到最 ...

  7. x5内核在android 4.4卡顿,css,javascript_安卓手机X5内核浏览器下动画超级卡的解决办法?,css,javascript,html5 - phpStudy...

    安卓手机X5内核浏览器下动画超级卡的解决办法? 碰到一个问题,我写了一个H5页面,里面有的动画在ios手机上运行十分流畅,一点都不卡,唯独在部分安卓手机下打开十分卡,卡顿到怀疑人生,我进行了一些优化, ...

  8. h5 iframe嵌套页面_汇总IOS下奇葩BUG以及iframe嵌套页面带来的一些困扰

    做H5开发,安卓和IOS的兼容问题经常会困扰我们,尤其是跟第三方平台合作,用到iframe嵌入式应用,令很多Web前端开发的童鞋脑壳疼,相信大家也入了不少坑,且踩且珍惜吧,呵呵^_^.今天抽时间整理一 ...

  9. iOS下OpenCV开发用OC还是Swift

    本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 其实标题中这个问题并不准确,准确的说法应该是iOS下的OpenCV开发是使用OC还是Swift ...

最新文章

  1. 环信联合创始人: Saas敏捷开发实践!
  2. Machine Learning | (2) sklearn数据集与机器学习组成
  3. VS调试技巧之附加进程
  4. python下载百度网盘文件-python通过百度云api的方式上传或下载文件
  5. ASP.NETMVC View页面 序列化 c# Model 为 Json字符串
  6. JQuery 文本框高亮显示插件
  7. 车联网 python_利用百度车联网提供的天气查询接口用python查询天气信息
  8. python elif可以单独使用_Celery在python中的单独使用
  9. 泛型的基本用法和代码演示
  10. (45)Xilinx Counter IP核配置(六)(第9天)
  11. 导入别的项目到我的eclipse上出现红色感叹号问题
  12. c语言除去字符串多余的空格,从一个字符串中去除多余的空格(用指针描述)...
  13. knn算法python代码识别手写数字_python使用KNN算法识别手写数字
  14. linux安装qt_Ubuntu Qt 安装教程--快速下载连接(网盘)
  15. 加密狗破解原理和破解方法介绍
  16. 如何用Java解压缩WAR文件
  17. 8255A的控制字和C口状态字
  18. 条形码EAN-13码和EAN-8码的原理
  19. 计算机科学与技术qs排名,全球QS专业排名(计算机科学与信息技术)
  20. vue.nextTick()方法的使用详解(简单明了)

热门文章

  1. php中引号,PHP中引号的用法
  2. linux系统dmesg日志,Linux系统日志
  3. 解决win2008下系统补丁无法安装的问题
  4. Jmeter监控服务器性能
  5. android 镜像文件制作
  6. 提升活动现场互动氛围,微会动平台上线5款微信互动小游戏产品
  7. kali linux安装nvidia显卡驱动
  8. C# 中SqlTransaction--启动事务 先删除从表,再删除主表
  9. 【PlatON三大银河战役之合约抢滩登陆战开战!】
  10. OleDbDataReader、OleDbDataAdapter、DataSet 的使用方法