美文网首页
iOS CAShapeLayer/CALayer+UIBezie

iOS CAShapeLayer/CALayer+UIBezie

作者: Accepted_ | 来源:发表于2018-12-09 00:27 被阅读0次

        需求:实现画笔功能和马赛克功能,操作后点击保存,再次进入这个界面需要可以撤销之前的操作。考虑到性能以及内存空间消耗,我选择UIPanGestureRecognizer和CAShapeLayer+UIBezierPath实现。

画笔:

UIGestureRecognizerStateBegan UIGestureRecognizerStateChanged

        其中,圆角处理参考:iOS CAShapeLayer+UIBezierPath设置kCGLineJoinRound无效

马赛克:

UIGestureRecognizerStateBegan UIGestureRecognizerStateChanged

马赛克参考文章:iOS中图片处理之马赛克算法

        保存后的CAShapeLayer数组通过序列化后存储在本地。但是发现马赛克线条反序列化后首尾相连并且填充。

序列化前layer预览 序列化后反序列化layer预览

        这个情况只马赛克的layer出现,画笔的是没问题的,打印马赛克layer的mask的path也是nil。于是就只能找找他们俩不一样的地方。

        首先从实现方法上来看,画笔是CAShapeLayer存储颜色宽度,UIBezierPath是路径,数组存储的是CAShapeLayer,马赛克是CALayer的content为马赛克图片,mask是CAShapeLayer(任意颜色)+UIBezierPath,数组存储的是CALayer,是不是因为CAShapeLayer多了一层导致path不正确。

        于是马赛克我改为存储CAShapeLayer,每次绘制的时候为每一个CAShapeLayer创建一个CALayer,配置好相关属性,并设置mask为CAShapeLayer,但是发现这样还是会出现上述问题。我给CAShapeLayer设置一个颜色,并且不加马赛克的CALayer,直接加在图上,发现纯色的CAShapeLayer也会出现首尾相连的情况。说明问题并不出现在mask上。

        然后我这个时候打印CAShapeLayer的path,发现这个path是moveto(xxx,xxx), lineto(xxx,xxx),lineto(xxx,xxx).....而画笔的path是moveto(xxx,xxx),curveto(xxx,xxx),(xxx,xxx),(xxx,xxx)......

        我在想有没有可能是这里的问题。我把马赛克也改成了有圆角处理的方式,问题解决了。

这样的CGPath序列化后再反序列化没问题

相关文章

网友评论

      本文标题:iOS CAShapeLayer/CALayer+UIBezie

      本文链接:https://www.haomeiwen.com/subject/xndacqtx.html