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

核心代码

#import "DrawView.h"

#import "DrawPath.h"

@interface DrawView ()

@property (nonatomic, strong) NSMutableArray *paths;

@property (nonatomic, strong) UIBezierPath *path;

@end

@implementation DrawView

- (void)setImage:(UIImage *)image
{
_image = image; [self.paths addObject:image]; [self setNeedsDisplay];
} // 撤销
- (void)undo
{
[self.paths removeLastObject]; [self setNeedsDisplay];
}
- (void)clear
{
// 清除画板view所有的路径,并且重绘
[self.paths removeAllObjects]; [self setNeedsDisplay];
} - (void)awakeFromNib
{
_lineWidth = ;
_lineColor = [UIColor blackColor];
} - (NSMutableArray *)paths
{
if (_paths == nil) {
_paths = [NSMutableArray array];
}
return _paths;
} // 当手指点击view,就需要记录下起始点
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// 获取UITouch
UITouch *touch = [touches anyObject]; // 获取起始点
CGPoint curP = [touch locationInView:self]; // 只要一开始触摸控件,设置起始点
DrawPath *path = [DrawPath path]; path.lineColor = _lineColor; [path moveToPoint:curP]; path.lineWidth = _lineWidth; // 记录当前正在描述的路径
_path = path; // 保存当前的路径
[self.paths addObject:path];
} // 每次手指移动的时候调用
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{ // 获取UITouch
UITouch *touch = [touches anyObject]; // 获取当前触摸点
CGPoint curP = [touch locationInView:self]; [_path addLineToPoint:curP]; // 重绘
[self setNeedsDisplay]; } // 绘制东西
- (void)drawRect:(CGRect)rect
{
for (DrawPath *path in self.paths) { if ([path isKindOfClass:[UIImage class]]) { // 图片
UIImage *image = (UIImage *)path; [image drawAtPoint:CGPointZero];
}else{ [path.lineColor set]; [path stroke];
}
}
} @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. Linux查看配置文件中未被注释的有效配置行

    grep 命令示例——去掉注释 $ grep -v "^#" /path/to/config/file $ grep -v "^#" /etc/apache2/ ...

  2. web即时通信技术

    ajax jsonp polling setInterval定期发送ajax请求.服务器压力大,浪费流量,大部分是无效请求 ajax long polling ajax发起请求,服务器对于这个请求一直 ...

  3. Python 2 和 Python 3 主要区别有哪些(1)

    Guido(Python之父,仁慈的独裁者)在设计 Python3 的过程中,受一篇文章 “Python warts” 的影响,决定不向后兼容,否则无法修复大多数缺陷.---摘录自<流畅的Pyt ...

  4. Android开发——短信电话拦截/接听电话

    1.短信拦截 首先需要声明的是,Android4.4版本以上,如果想做到短信拦截,必须成为default sms,把所有短信相关的功能都包揽了,然后再做短信拦截.但这种做法,适配性和兼容性的工作是非常 ...

  5. XTUOJ 15503 - C

    15503 - C Accepted: 6    Submissions: 27    Time Limit: 3000 ms    Memory Limit: 1048576 KB 在解决了小女孩的 ...

  6. Leetcode 319.灯泡开关

    灯泡开关 初始时有 n 个灯泡关闭.第 1 轮,你打开所有的灯泡.第 2 轮,每两个灯泡你关闭一次.第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭).第 i 轮,每 i 个灯泡切换 ...

  7. POJ3037 Skiing

    Skiing 题目大意: 给定一个M*N的网格,已知在每个网格中的点可以向上下左右四个方向移动一个单位,每个点都有一个高度值. 从每个点开始移动时存在一个速度值,从A点移动到B点,则此时B点的速度为& ...

  8. java 字节码 指令集

    有时候为了能理解JVM对程序所做的优化等,需要查看程序的字节码,因此知道了解一些常见的指令集很重要! 指令码 助记符 说明 0x00 nop 什么都不做 0x01 aconst_null 将null推 ...

  9. Java线程的5种状态及切换(透彻讲解)

    http://blog.csdn.net/pange1991/article/details/53860651

  10. mysql查询今天,昨天,近7天,近30天,本月,上一月数据的SQL

    原文:http://www.open-open.com/code/view/1423207309170 select * from ad_proTrack_t where to_days(crt_ti ...