iOS开发——高级篇——iOS涂鸦画板效果实现
一个简单的绘图应用,模仿苹果自带软件备忘录里的涂鸦功能
核心代码
- #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涂鸦画板效果实现的更多相关文章
- iOS开发——高级篇——iOS开发之网络安全密码学
一.非对称加密 - RSA : + 公钥加密,私钥解密: + 私钥加密,公钥解密: + 只能通过因式分解来破解 二.对称加密 - DES - 3DES - AES (高级密码标准,美国国家安全局使用, ...
- iOS开发——高级篇——iOS 项目的目录结构
最近闲来无事去面试一下iOS开发,让我感到吃惊的,面试官竟然问怎么分目录结构,还具体问每个子目录的文件名. 目录结构确实非常重要,面试官这么问,无疑是想窥探开发经验.清晰的目录结构,可让人一眼明白相应 ...
- iOS开发——高级篇——iOS抽屉效果实现原理
实现一个简单的抽屉效果: 核心思想:KVO实现监听mainV的frame值的变化 核心代码: #import "ViewController.h" // @"frame& ...
- iOS开发——高级篇——iOS 强制退出程序APP代码
1.先po代码 UIAlertView* alert = [[UIAlertView alloc] initWithTitle:self.exitapplication message:@" ...
- iOS开发——高级篇——iOS中如何选择delegate、通知、KVO(以及三者的区别)
在开发IOS应用的时候,我们会经常遇到一个常见的问题:在不过分耦合的前提下,controllers[B]怎么进行通信.在IOS应用不断的出现三种模式来实现这种通信:1委托delegation2通知 ...
- iOS开发——高级篇——iOS中常见的设计模式(MVC/单例/委托/观察者)
关于设计模式这个问题,在网上也找过一些资料,下面是我自己总结的,分享给大家 如果你刚接触设计模式,我们有好消息告诉你!首先,多亏了Cocoa的构建方式,你已经使用了许多的设计模式以及被鼓励的最佳实践. ...
- iOS开发——高级篇——iOS中为什么block用copy属性
1. Block的声明和线程安全Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非ARC ...
- iOS开发——高级篇——iOS键盘的相关设置(UITextfield)
一.键盘风格 UIKit框架支持8种风格键盘. typedef enum { UIKeyboardTypeDefault, // 默认键盘:支持所有字符 UIKeyboardTypeASCIICapa ...
- iOS开发——高级篇——iOS 中的 NSTimer
以前的老代码在使用 NSTimer 时出现了内存泄露 NSTimer fire 我们先用 NSTimer 来做个简单的计时器,每隔5秒钟在控制台输出 Fire .比较想当然的做法是这样的: 1 2 3 ...
随机推荐
- 基于 NodeJs 打造 Web 在线聊天室
Socket.IO 简介与基础环境搭建 任务时间:10min ~ 20min 关于 Socket.IO Socket.IO 可以实现在浏览器和服务器之间实时双向通信,本节课程将详细介绍 Socket. ...
- centos7 ftp 500 OOPS: cannot change directory:/var/ftp/xutong/
在设置多用户登录的时候 该指定的用户xutong对于上级目录/var/ftp 没有访问权限 修改一下上级目录的权限 chmod /var/ftp 对于ftp多用户访问的配置修改也做一个记录 以是设置F ...
- 杭电 4907 Task schedule ·
Description 有一台机器,并且给你这台机器的工作表,工作表上有n个任务,机器在ti时间执行第i个任务,1秒即可完成1个任务. 有m个询问,每个询问有一个数字q,表示如果在q时间有一个工作表之 ...
- C++实现链队类——合肥工业大学数据结构实验5:链式队列
实验5 5.1 实验目的 熟练掌握队列的顺序链式存储结构. 熟练掌握队列的有关算法设计,并在链队列上实现. 根据具体给定的需求,合理设计并实现相关结构和算法. 5.2 实验要求 5.2.1链队列实验要 ...
- laravel groupby分组问题。
laravel 5.7使用groupBy分组查询时会提示一个错误,但是sql可以执行. 因为:mysql从5.7以后,默认开启了严格模式. 解决方法:将/config/database.php 中:关 ...
- 《TC训练赛一》题解!
以下题目标题就是此题题目链接,题目内容为了节省篇幅就不粘上去了.整套题的链接:https://acm.bnu.edu.cn/v3/contest_show.php?cid=8679#info 密码:7 ...
- bzoj 1702 贪心,前缀和
[Usaco2007 Mar]Gold Balanced Lineup 平衡的队列 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 807 Solved: ...
- 【POJ2774&Ural1517】Long Long Message(后缀数组)
题意:求两个字符串的最长公共子串 n<=1000 思路:这是一道论文题 ..]of longint; n,l1,l2,i,ans,m,l,r:longint; ch:ansistring; pr ...
- msp430项目编程05
msp430中项目---TFT彩屏显示(续) 1.TFT彩屏工作原理 2.电路原理说明 3.代码(静态显示) 4.代码(动态显示) 5.项目总结 msp430项目编程 msp430入门学习
- Wooden Sticks---hdu1051(最长上升子序列)
http://acm.hdu.edu.cn/showproblem.php?pid=1051 Problem Description There is a pile of n wooden stick ...