一个简单的绘图应用,模仿苹果自带软件备忘录里的涂鸦功能

核心代码

  1. #import "DrawView.h"
  2.  
  3. #import "DrawPath.h"
  4.  
  5. @interface DrawView ()
  6.  
  7. @property (nonatomic, strong) NSMutableArray *paths;
  8.  
  9. @property (nonatomic, strong) UIBezierPath *path;
  10.  
  11. @end
  12.  
  13. @implementation DrawView
  14.  
  15. - (void)setImage:(UIImage *)image
  16. {
  17. _image = image;
  18.  
  19. [self.paths addObject:image];
  20.  
  21. [self setNeedsDisplay];
  22. }
  23.  
  24. // 撤销
  25. - (void)undo
  26. {
  27. [self.paths removeLastObject];
  28.  
  29. [self setNeedsDisplay];
  30. }
  31. - (void)clear
  32. {
  33. // 清除画板view所有的路径,并且重绘
  34. [self.paths removeAllObjects];
  35.  
  36. [self setNeedsDisplay];
  37. }
  38.  
  39. - (void)awakeFromNib
  40. {
  41. _lineWidth = ;
  42. _lineColor = [UIColor blackColor];
  43. }
  44.  
  45. - (NSMutableArray *)paths
  46. {
  47. if (_paths == nil) {
  48. _paths = [NSMutableArray array];
  49. }
  50. return _paths;
  51. }
  52.  
  53. // 当手指点击view,就需要记录下起始点
  54. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
  55. {
  56. // 获取UITouch
  57. UITouch *touch = [touches anyObject];
  58.  
  59. // 获取起始点
  60. CGPoint curP = [touch locationInView:self];
  61.  
  62. // 只要一开始触摸控件,设置起始点
  63. DrawPath *path = [DrawPath path];
  64.  
  65. path.lineColor = _lineColor;
  66.  
  67. [path moveToPoint:curP];
  68.  
  69. path.lineWidth = _lineWidth;
  70.  
  71. // 记录当前正在描述的路径
  72. _path = path;
  73.  
  74. // 保存当前的路径
  75. [self.paths addObject:path];
  76. }
  77.  
  78. // 每次手指移动的时候调用
  79. - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
  80. {
  81.  
  82. // 获取UITouch
  83. UITouch *touch = [touches anyObject];
  84.  
  85. // 获取当前触摸点
  86. CGPoint curP = [touch locationInView:self];
  87.  
  88. [_path addLineToPoint:curP];
  89.  
  90. // 重绘
  91. [self setNeedsDisplay];
  92.  
  93. }
  94.  
  95. // 绘制东西
  96. - (void)drawRect:(CGRect)rect
  97. {
  98. for (DrawPath *path in self.paths) {
  99.  
  100. if ([path isKindOfClass:[UIImage class]]) { // 图片
  101. UIImage *image = (UIImage *)path;
  102.  
  103. [image drawAtPoint:CGPointZero];
  104. }else{
  105.  
  106. [path.lineColor set];
  107.  
  108. [path stroke];
  109. }
  110. }
  111. }
  112.  
  113. @end

用法很简单,导入DrawView.h  DrawView.m 文件创建该控件即可

清屏:  [_drawView clear];
撤销:  [_drawView undo];
橡皮擦:  _drawView.lineColor = [UIColor whiteColor];

github地址:https://github.com/chglog/scrawl

iOS开发——高级篇——iOS涂鸦画板效果实现的更多相关文章

  1. iOS开发——高级篇——iOS开发之网络安全密码学

    一.非对称加密 - RSA : + 公钥加密,私钥解密: + 私钥加密,公钥解密: + 只能通过因式分解来破解 二.对称加密 - DES - 3DES - AES (高级密码标准,美国国家安全局使用, ...

  2. iOS开发——高级篇——iOS 项目的目录结构

    最近闲来无事去面试一下iOS开发,让我感到吃惊的,面试官竟然问怎么分目录结构,还具体问每个子目录的文件名. 目录结构确实非常重要,面试官这么问,无疑是想窥探开发经验.清晰的目录结构,可让人一眼明白相应 ...

  3. iOS开发——高级篇——iOS抽屉效果实现原理

    实现一个简单的抽屉效果: 核心思想:KVO实现监听mainV的frame值的变化 核心代码: #import "ViewController.h" // @"frame& ...

  4. iOS开发——高级篇——iOS 强制退出程序APP代码

    1.先po代码 UIAlertView* alert = [[UIAlertView alloc] initWithTitle:self.exitapplication message:@" ...

  5. iOS开发——高级篇——iOS中如何选择delegate、通知、KVO(以及三者的区别)

      在开发IOS应用的时候,我们会经常遇到一个常见的问题:在不过分耦合的前提下,controllers[B]怎么进行通信.在IOS应用不断的出现三种模式来实现这种通信:1委托delegation2通知 ...

  6. iOS开发——高级篇——iOS中常见的设计模式(MVC/单例/委托/观察者)

    关于设计模式这个问题,在网上也找过一些资料,下面是我自己总结的,分享给大家 如果你刚接触设计模式,我们有好消息告诉你!首先,多亏了Cocoa的构建方式,你已经使用了许多的设计模式以及被鼓励的最佳实践. ...

  7. iOS开发——高级篇——iOS中为什么block用copy属性

    1. Block的声明和线程安全Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非ARC ...

  8. iOS开发——高级篇——iOS键盘的相关设置(UITextfield)

    一.键盘风格 UIKit框架支持8种风格键盘. typedef enum { UIKeyboardTypeDefault, // 默认键盘:支持所有字符 UIKeyboardTypeASCIICapa ...

  9. iOS开发——高级篇——iOS 中的 NSTimer

    以前的老代码在使用 NSTimer 时出现了内存泄露 NSTimer fire 我们先用 NSTimer 来做个简单的计时器,每隔5秒钟在控制台输出 Fire .比较想当然的做法是这样的: 1 2 3 ...

随机推荐

  1. 基于 NodeJs 打造 Web 在线聊天室

    Socket.IO 简介与基础环境搭建 任务时间:10min ~ 20min 关于 Socket.IO Socket.IO 可以实现在浏览器和服务器之间实时双向通信,本节课程将详细介绍 Socket. ...

  2. centos7 ftp 500 OOPS: cannot change directory:/var/ftp/xutong/

    在设置多用户登录的时候 该指定的用户xutong对于上级目录/var/ftp 没有访问权限 修改一下上级目录的权限 chmod /var/ftp 对于ftp多用户访问的配置修改也做一个记录 以是设置F ...

  3. 杭电 4907 Task schedule ·

    Description 有一台机器,并且给你这台机器的工作表,工作表上有n个任务,机器在ti时间执行第i个任务,1秒即可完成1个任务. 有m个询问,每个询问有一个数字q,表示如果在q时间有一个工作表之 ...

  4. C++实现链队类——合肥工业大学数据结构实验5:链式队列

    实验5 5.1 实验目的 熟练掌握队列的顺序链式存储结构. 熟练掌握队列的有关算法设计,并在链队列上实现. 根据具体给定的需求,合理设计并实现相关结构和算法. 5.2 实验要求 5.2.1链队列实验要 ...

  5. laravel groupby分组问题。

    laravel 5.7使用groupBy分组查询时会提示一个错误,但是sql可以执行. 因为:mysql从5.7以后,默认开启了严格模式. 解决方法:将/config/database.php 中:关 ...

  6. 《TC训练赛一》题解!

    以下题目标题就是此题题目链接,题目内容为了节省篇幅就不粘上去了.整套题的链接:https://acm.bnu.edu.cn/v3/contest_show.php?cid=8679#info 密码:7 ...

  7. bzoj 1702 贪心,前缀和

    [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 807  Solved: ...

  8. 【POJ2774&Ural1517】Long Long Message(后缀数组)

    题意:求两个字符串的最长公共子串 n<=1000 思路:这是一道论文题 ..]of longint; n,l1,l2,i,ans,m,l,r:longint; ch:ansistring; pr ...

  9. msp430项目编程05

    msp430中项目---TFT彩屏显示(续) 1.TFT彩屏工作原理 2.电路原理说明 3.代码(静态显示) 4.代码(动态显示) 5.项目总结 msp430项目编程 msp430入门学习

  10. Wooden Sticks---hdu1051(最长上升子序列)

    http://acm.hdu.edu.cn/showproblem.php?pid=1051 Problem Description There is a pile of n wooden stick ...