在iOS中实现一个简单的画板App
在这个随笔中,我们要为iPhone实现一个简单的画板App。
1 // 2 // TouchDrawView.m 3 // CaplessCoderPaint 4 // 5 // Created by backslash112 on 14/10/29. 6 // Copyright (c) 2014年 backslash112. All rights reserved. 7 // 8 9 #import "TouchDrawView.h" 10 #import "Common.h" 11 12 @implementation TouchDrawView 13 { 14 } 15 @synthesize currentLine; 16 @synthesize linesCompleted; 17 @synthesize drawColor; 18 19 - (id)initWithCoder:(NSCoder *)c 20 { 21 self = [super initWithCoder:c]; 22 if (self) { 23 linesCompleted = [[NSMutableArray alloc] init]; 24 [self setMultipleTouchEnabled:YES]; 25 26 drawColor = [UIColor blackColor]; 27 [self becomeFirstResponder]; 28 } 29 return self; 30 } 31 32 // It is a method of UIView called every time the screen needs a redisplay or refresh. 33 - (void)drawRect:(CGRect)rect 34 { 35 CGContextRef context = UIGraphicsGetCurrentContext(); 36 CGContextSetLineWidth(context, 5.0); 37 CGContextSetLineCap(context, kCGLineCapRound); 38 [drawColor set]; 39 for (Line *line in linesCompleted) { 40 [[line color] set]; 41 CGContextMoveToPoint(context, [line begin].x, [line begin].y); 42 CGContextAddLineToPoint(context, [line end].x, [line end].y); 43 CGContextStrokePath(context); 44 } 45 } 46 47 - (void)undo 48 { 49 if ([self.undoManager canUndo]) { 50 [self.undoManager undo]; 51 [self setNeedsDisplay]; 52 } 53 } 54 55 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 56 { 57 [self.undoManager beginUndoGrouping]; 58 for (UITouch *t in touches) { 59 // Create a line for the value 60 CGPoint loc = [t locationInView:self]; 61 Line *newLine = [[Line alloc] init]; 62 [newLine setBegin:loc]; 63 [newLine setEnd:loc]; 64 [newLine setColor:drawColor]; 65 currentLine = newLine; 66 } 67 } 68 69 - (void)addLine:(Line*)line 70 { 71 [[self.undoManager prepareWithInvocationTarget:self] removeLine:line]; 72 [linesCompleted addObject:line]; 73 } 74 75 - (void)removeLine:(Line*)line 76 { 77 if ([linesCompleted containsObject:line]) 78 [linesCompleted removeObject:line]; 79 } 80 81 - (void)removeLineByEndPoint:(CGPoint)point 82 { 83 NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { 84 Line *evaluatedLine = (Line*)evaluatedObject; 85 return evaluatedLine.end.x == point.x && 86 evaluatedLine.end.y == point.y; 87 }]; 88 NSArray *result = [linesCompleted filteredArrayUsingPredicate:predicate]; 89 if (result && result.count > 0) { 90 [linesCompleted removeObject:result[0]]; 91 } 92 } 93 94 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 95 { 96 for (UITouch *t in touches) { 97 [currentLine setColor:drawColor]; 98 CGPoint loc = [t locationInView:self]; 99 [currentLine setEnd:loc]; 100 101 if (currentLine) { 102 [self addLine:currentLine]; 103 } 104 Line *newLine = [[Line alloc] init]; 105 [newLine setBegin:loc]; 106 [newLine setEnd:loc]; 107 [newLine setColor:drawColor]; 108 currentLine = newLine; 109 } 110 [self setNeedsDisplay]; 111 } 112 113 - (void)endTouches:(NSSet *)touches 114 { 115 [self setNeedsDisplay]; 116 } 117 118 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 119 { 120 [self endTouches:touches]; 121 [self.undoManager endUndoGrouping]; 122 } 123 124 - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event 125 { 126 [self endTouches:touches]; 127 } 128 129 - (BOOL)canBecomeFirstResponder 130 { 131 return YES; 132 } 133 134 - (void)didMoveToWindow 135 { 136 [self becomeFirstResponder]; 137 } 138 139 - (id)initWithFrame:(CGRect)frame 140 { 141 self = [super initWithFrame:frame]; 142 if (self) { 143 // Initialization code 144 } 145 return self; 146 } 147 148 @end
这个文件包含了主要的逻辑,说明下主要方法的作用:
-(id)initWithCoder:当此view被创建的时候这个方法自动调用,所以你不一定必须要实现它;当时当你想在初始化的时候做一些别的工作的时候你就需要实现它。
-(void)drawRect:每次当屏幕需要重新显示或者刷新的时候这个方法会被调用。
-(void)touchBegan:当你的手指点击到屏幕的时候这个方法会被调用。
-(void)touchMove:当你的手指点击屏幕后开始在屏幕移动,它会被调用。随着手指的移动,相关的对象会秩序发送该消息。
-(void)touchEnd:当你的手指点击屏幕之后离开的时候,它会被调用。
相关源代码:github
转载于:https://www.cnblogs.com/sirkevin/p/4067176.html
在iOS中实现一个简单的画板App相关推荐
- 用java的事件监听机制实现一个简单的画板应用:通过选择图形按钮和颜色按钮来画出自己想画的图形:直线、空心矩形、圆形、折线、多边形、圆角矩形、弧线、曲线、喷枪
今天做一个简单的画板,完整代码附在文章末尾处. - 功能:通过选择图形按钮和颜色按钮来画出自己想画的图形. - 界面展示: - 思路: 1.做一个可视化界面:创建JFrame对象,并设置Title.S ...
- Flutter For App——一个简单的豆瓣APP
一个简单的豆瓣APP 效果视频 功能简述 功能 第三方库 接口简述 底部导航栏 效果图 实现 初始化BottomNavigationBarItem bottomNavigationBar 切换页面导致 ...
- Android——一个简单的音乐APP(二)
一个简单的音乐APP 效果视频 前言 音乐下载 音乐下载效果图 实习步骤&思想 添加到下载队列 单任务下载 多任务下载 音乐下载 获取音乐下载源 创建本地路径 创建目录 开始音乐下载 下载进度 ...
- 用Android Studio设计的一个简单的闹钟APP
该闹钟是用Android Studio为安卓手机设计的一个简单的闹钟APP 一.介绍系统的设计界面 闹钟的布局文件代码如下 <?xml version="1.0" encod ...
- 编写一个简单的生日快乐APP
编写一个简单的生日快乐APP 一.关闭之前的helloworld程序 点击file,然后close project,就完成关闭了. 二.创建一个新的happybirthday程序 三.下面开始整个AP ...
- 一个html写的app首页,如何快速开发一个简单好看的APP控制页面
原标题:如何快速开发一个简单好看的APP控制页面 导读 机智云开源框架为了让开发者快速开发APP,已将用户登录,设备发现,设备配网等功能做成了各个标准模块,仅保留控制页面让开发者自行开发设计,节省了开 ...
- Android——一个简单的天气APP
一个简单的天气APP 效果演示视频 简述 天气JSON数据 实况天气 逐24小时天气预报 未来七天天气预报 天气详情页 效果图 获取JSON数据 URL请求 实况天气URL 逐24小时天气预报URL ...
- 『牛角书』HarmonyOS鸿蒙实战 开发一个简单聊天助手APP
前言 我是通过b站上面老师的讲解,跟着老师编写了一个简单聊天助手app,简答实用,对于刚开始接触鸿蒙的我们来说很有帮助. 创建项目 所用软件为DevEco Studio,点击Create Harmon ...
- 使用Android studio做一个简单的网站APP
1.首先创建一个空白Android项目 2.然后打开项目,切换为Android视图,这时候会看到三个文件夹,分别是manifests.java.res.首先修改res/layout下的activity ...
最新文章
- ICLR 2020 九篇满分论文!!!
- 最重要的事情只有一件
- Activemq -- Spring 整合
- Spring Web Flow 入门demo(三)嵌套流程与业务结合 附源码
- android官方文档中文版_最全实至名归,NumPy 官方早有中文教程,结合深度学习,还有防脱发指南...
- VMware8 8.0.1 安装Lion正式版 原版镜像 直接DMG安装 非整合版 免引导 完美解决iCloud...
- RedisCrawlSpider
- poj 3177 Redundant Paths(tarjan边双连通)
- 【转】Tomcat总体结构(Tomcat源代码阅读系列之二)
- 在应用中集成科大讯飞的语音识别技术
- 【论文解读】Sort、Deep-Sort多目标跟踪算法
- 机智云与汇桔网达成战略合作,进一步完善物联网生态系统
- 【luminate primordial】苏州之行
- xheditor编辑器的使用
- AdSense 使用教程: 通过让 Google 在您的网站上投放广告,帮助您从中获利
- php-java-net-python-爱心公益网站()计算机毕业设计程序
- 计算机英语期末试题,计算机英语期末考试试题
- Chrome 浏览器
- 开始尝试贝茨视觉训练法
- 繁体中文和简体中文编码