首页 技术 正文
技术 2022年11月13日
0 收藏 948 点赞 4,082 浏览 3241 个字

1 使用触控实现一个简易的画板

1.1 问题

触控(Touch)是一个UITouch类型的对象,当用户触摸了屏幕上的视图时自动被创建,通常使用触控实现绘图、涂鸦、手写等功能。本案例使用触控实现一个简易的画板,可以在画板上勾画出一条线,如图-1所示:

触控(Touch)

1.2 方案

首先在创建好的SingleViewApplication项目中创建一个画板类TRDrawView,继承至UIView,该类有一个NSMutableArray类型的属性points,用于存储手指触摸的轨迹也就是点。

其次在Stroyboard的场景中拖放一个View控件,和屏幕一样大小,然后将View的类型修改为TRDrawView。

然后在TRDrawView类中通过touchesBegan:、touchesMoved:方法获取到手指的触摸点,将点存储到points数组中。

最后在TRDrawView类中重写drawRect方法,该方法中根据手指的触摸轨迹points进行屏幕绘制。切记要在touchesMoved方法中调用setNeedDisplay刷新界面。

1.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:创建项目和画板类

首先在创建好的SingleViewApplication项目中创建一个画板类TRDrawView,继承至UIView,该类有一个NSMutableArray类型的属性points,用于存储手指触摸的轨迹也就是点,代码如下所示:

@interface TRDrawView ()

@property (strong, nonatomic) NSMutableArray *points;

@end

然后从对象库中拖放一个View控件到Storyboard场景中,View控件的大小和屏幕一样。在右边栏的检查器三将View的类型设置为TRDrawView,如图-2所示:

触控(Touch)

步骤二:在TRDawView中获取手指触摸轨迹

在TRDrawView类中首先重写touchesBegan:,在该方法将points属性进行初始化,并获取当前手指的触摸点,存储到points数组中,代码如下所示:

– (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

//初始化数组

self.points = [@[] mutableCopy];

//获取当前触摸点

UITouch *touch = [touches anyObject];

CGPoint point = [touch locationInView:self];

//将点放进数组中

NSValue *value = [NSValue valueWithCGPoint:point];

[self.points addObject:value];

}

然后再重写touchesMove:方法,在该方法中继续获取手指的当前触摸点,并将触摸点存储到points数组中,代码如下所示:

– (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

{

//获取当前触摸点

UITouch *touch = [touches anyObject];

CGPoint point = [touch locationInView:self];

//将点放进数组中

NSValue *value = [NSValue valueWithCGPoint:point];

[self.points addObject:value];

}

步骤三:重写drawRect方法,进行屏幕绘制

在TRDrawView类中重写drawRect方法,该方法中根据手指的触摸轨迹points进行屏幕绘制,代码如下所示:

– (void)drawRect:(CGRect)rect

{

UIBezierPath *path = [UIBezierPath bezierPath];

NSValue *value = [self.points firstObject];

[path moveToPoint:[value CGPointValue]];

for(NSValue *valu in self.points) {

[path addLineToPoint:[valu CGPointValue]];

}

path.lineWidth = 2;

[[UIColor purpleColor]setStroke];

[path stroke];

}

最后要在touchesMoved:和touchesEnded:方法中调用setNeedDisplay刷新界面,代码如下所示:

– (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

{

//获取当前触摸点

UITouch *touch = [touches anyObject];

CGPoint point = [touch locationInView:self];

//将点放进数组中

NSValue *value = [NSValue valueWithCGPoint:point];

[self.points addObject:value];

//刷新界面

[self setNeedsDisplay];

}

– (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

{

[self setNeedsDisplay];

}

1.4 完整代码

本案例中,TRDrawView.m文件中的完整代码如下所示:

#import “TRDrawView.h”

@interface TRDrawView ()

@property (strong, nonatomic) NSMutableArray *points;

@end

@implementation TRDrawView

– (void)drawRect:(CGRect)rect

{

UIBezierPath *path = [UIBezierPath bezierPath];

NSValue *value = [self.points firstObject];

[path moveToPoint:[value CGPointValue]];

for(NSValue *valu in self.points) {

[path addLineToPoint:[valu CGPointValue]];

}

path.lineWidth = 2;

[[UIColor purpleColor]setStroke];

[path stroke];

}

– (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

//初始化数组

self.points = [@[]mutableCopy];

//获取当前触摸点

UITouch *touch = [touches anyObject];

CGPoint point = [touch locationInView:self];

//将点放进数组中

NSValue *value = [NSValue valueWithCGPoint:point];

[self.points addObject:value];

}

– (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

{

//获取当前触摸点

UITouch *touch = [touches anyObject];

CGPoint point = [touch locationInView:self];

//将点放进数组中

NSValue *value = [NSValue valueWithCGPoint:point];

[self.points addObject:value];

//刷新界面

[self setNeedsDisplay];

}

– (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

{

[self setNeedsDisplay];

}

@end

上一篇: pca图像识别
下一篇: ios 面试题 0
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,497
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,910
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,744
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,498
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,136
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,300