1. 效果图

2. 用一个View来描述画图板,给画图板添加拖动的手势

  1. // 从xib中加载
  2. - (void)awakeFromNib
  3. {
  4. [self setUpGesture];
  5. }
  6. // 代码创建
  7. - (instancetype)initWithFrame:(CGRect)frame
  8. {
  9. if (self = [super initWithFrame:frame]) {
  10. [self setUpGesture];
  11. }
  12. return self;
  13. }
  14. // 初始化添加拖动手势
  15. - (void)setUpGesture
  16. {
  17. UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
  18. [self addGestureRecognizer:pan];
  19. self.color = [UIColor blackColor];
  20. self.width = 1;
  21. }

3. 监听手势方法

1> 判断拖动开始拖动设置为路径的的起始点,添加路径并保存路径,将当前路径添加到数组中

设置路径的相关属性(颜色/宽度/圆角)

2> 拖动过程中的点添加直线重绘

  1. // 监听手势方法
  2. - (void)pan:(UIPanGestureRecognizer *)pan
  3. {
  4. // 获取当前触摸点
  5. CGPoint curP = [pan locationInView:self];
  6. if (pan.state == UIGestureRecognizerStateBegan) { // 开始拖动
  7. // 获取开始点
  8. CGPoint startP = curP;
  9. // 创建路径
  10. LDBezierPath *path = [[LDBezierPath alloc] init];
  11. self.path = path;
  12. [self.pathArray addObject:path];
  13. // 设置宽度
  14. [path setLineWidth:self.width];
  15. // 设置颜色
  16. [path setLineColor:self.color];
  17. // 设置圆角
  18. [path setLineJoinStyle:kCGLineJoinRound];
  19. [path setLineCapStyle:kCGLineCapRound];
  20. // 添加起始点
  21. [path moveToPoint:startP];
  22. } else if (pan.state == UIGestureRecognizerStateChanged) {
  23. // 添加直线
  24. [self.path addLineToPoint:curP];
  25. // 重绘
  26. [self setNeedsDisplay];
  27. }
  28. }

4. 绘制, 遍历数组中的路径,判断是否是图片,如果是图片则将图片绘制上去,反之为路径,直接绘制路径

  1. // 绘制
  2. - (void)drawRect:(CGRect)rect {
  3. // 变量路径数组重绘
  4. for (LDBezierPath *path in self.pathArray) {
  5. if (path.class == [UIImage class]) {
  6. UIImage *image = (UIImage *)path;
  7. [image drawInRect:rect];
  8. NSLog(@"%@", image);
  9. } else {
  10. [path.lineColor set];
  11. [path stroke];
  12. }
  13. }
  14. }

5. 图片保存

  1. // 保存
  2. - (void)save
  3. {
  4. if (self.pathArray.count) {
  5. // 1.开启位图上下文
  6. UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0);
  7. // 2.获取当前上下文
  8. CGContextRef ref = UIGraphicsGetCurrentContext();
  9. // 3.将view的layer渲染到位图上下文总
  10. [self.layer renderInContext:ref];
  11. // 4.获取位图上下文中的image
  12. UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
  13. // 5.关闭位图上下文
  14. UIGraphicsEndImageContext();
  15. // 6.将图片保存到相册
  16. UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
  17. } else {
  18. [MBProgressHUD showError:@"没有图片可保存"];
  19. }
  20. }
  21. - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
  22. {
  23. [MBProgressHUD showSuccess:@"保存成功"];
  24. }

转载于:https://www.cnblogs.com/Xfsrn/p/5000349.html

iOS开发核心动画之画图板相关推荐

  1. iOS开发核心动画之Quartz2D绘图

    一. Quartz2D的绘制不同图形 1. 绘图步骤 1> 自定义一个View 2> 在- (void)drawrectangle方法中进行绘图 获取当前上下文 CGContextRef ...

  2. iOS学习——核心动画之Layer基础

    iOS学习--核心动画之Layer基础 1.CALayer是什么? CALayer我们又称它叫做层.在每个UIView内部都有一个layer这样一个属性,UIView之所以能够显示,就是因为它里面有这 ...

  3. iOS 开发之动画篇 - 从 UIView 动画说起

    毋庸置疑的:在iOS开发中,制作动画效果是最让开发者享受的环节之一.一个设计严谨.精细的动画效果能给用户耳目一新的效果,吸引他们的眼光 -- 这对于app而言是非常重要的. 本文作为动画文集的第一篇, ...

  4. iOS CoreAnimation 核心动画系列博客索引

    学了这些文章能做什么,了解核心动画各个类能做什么,产品有些简单的视图平移.旋转.折叠.抖动的需求,都能搞了 我们写博客的目的是学习研究之后做记录,捎带让别人指教,就是这么简单 博客文章都是对同一个领域 ...

  5. iOS开发-动画总结

    一.简介 IOS 动画主要是指Core Animation框架.官方使用文档地址为:Core Animation Guide. Core Animation是IOS和OS X平台上负责图形渲染与动画的 ...

  6. ios开发学习--动画(Animation)效果源码分享--系列教程1

    Genie View        介绍: 实现所谓的genie effect.即点击最小化或删除按钮,视图会被吸进某个地方.         http://ios.itmdc.com/forum.p ...

  7. iOS 开发之动画篇 - Transform和KeyFrame动画

    原文发布于http://www.jianshu.com/p/a071bba99a1b 序言 追求美好是人的天性,这是猿们无法避免的.我们总是追求更为酷炫的实现,如果足够仔细,我们不难发现一个好的动画通 ...

  8. IOS开发之——动画-转场动画(98)

    一 概述 CATransition转场动画介绍 专场动画属性及过渡效果 示例(动画切换模拟转场动画) 二 CATransition专场动画介绍 nCATransition是CAAnimation的子类 ...

  9. iOS开发中动画之点赞图标放大效果

    大多数手机App的点赞图标在我们点击的时候都会有一个放大的效果,随后还原.之前公司App有点赞功能但却没有这个放大之后还原的效果,于是研究一下准备将该效果添加到项目中. 思路:为点赞图标添加一个动画, ...

最新文章

  1. ERP与EWM集成配置---ERP 端(一)
  2. (原創) 标准的makefile写法 (C/C++)
  3. CG-CTF-Web-层层递进
  4. ICCV2019 | 腾讯优图13篇论文入选,其中3篇被选为Oral
  5. java hibernate回滚_Spring Hibernate 测试事务不能回滚
  6. sgu 101 domino
  7. linux 帐号 配置sftp_Linux 下sftp配置之密钥方式登录详解
  8. 量化研究: Julia还是Matlab?
  9. linux shell编程文本处理命令grep
  10. python库-密码学库pynacl
  11. java实现csdn免积分工具_CSDN免积分下载工具
  12. Spring Boot配置QueryDSL(生成Query查询实体类,查询数据)
  13. Verilog无符号除法器-状态机实现
  14. 关于ppp、PPPoE、PPTP、L2TP、IPSec协议的简单认识
  15. The semaphore timeout period has expired
  16. activiti流程图下发任务报错,不能正常流转到下一个处理步骤
  17. java中boot是什么,Spring boot是什么
  18. 骁龙780G和麒麟990哪个好
  19. 结构化数据和半结构化数据和非结构化数据
  20. matlab里颜色直方图的画法

热门文章

  1. template与图片懒加载
  2. POSIX正则表达式 验证电子邮件地址
  3. 三天打工生活终于结束了
  4. 笔试算法题--汪仔换道具
  5. Osmocom-BB 相关资源、知识分享
  6. docker 与tomcat整合
  7. 华三 交换 IRF V7
  8. android-解决 Android N 上 报错:android.os.FileUriExposedException
  9. Could not load type 'System.Web.Mvc.ViewPagedynamic' in asp.net mvc2 after publishing the website
  10. 精通CSS+DIV基础总结(三)