自己学习绘图过程中写的一个小demo,记录一下:
总结了两种方法来实现demo功能:
第1种方法:先用小数组存放所有的移动手指获取到的点,每个小数组都是一条线,然后创建一个大数组存放小数组,将所有的线段放到大数组中,然后遍历绘制出线段
先自定义一个view,继承自UIView
#import "YJ_View.h"
@interface YJ_View ()
/**
* 定义一个大数组(大数组中保存小数组, 每一个小数组保存一条直线所有的点)
*/
@property (nonatomic, strong) NSMutableArray *totalPoints;
@end
@implementation YJ_View
- (NSMutableArray *)totalPoints
{
if (_totalPoints == nil) {
_totalPoints = [NSMutableArray array];
}
return _totalPoints;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// NSLog(@"touchesBegan");
// 1.获取手指对应UITouch对象
UITouch *touch = [touches anyObject];
// 2.通过UITouch对象获取手指触摸的位置
CGPoint startPoint = [touch locationInView:touch.view];
// 3.创建一个小数组,用于保存当前路径所有的点
NSMutableArray *subPoints = [NSMutableArray array];
// 4.将手指触摸的起点存储到小数组中
[subPoints addObject:[NSValue valueWithCGPoint:startPoint]];
// 5.将小数组存储到大数组中
[self.totalPoints addObject:subPoints];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
// 1.获取手指对应UITouch对象
UITouch *touch = [touches anyObject];
// 2.通过UITouch对象获取手指触摸的位置
CGPoint movePoint = [touch locationInView:touch.view];
// 3.从大数组中取出当前路径对应的小数组
NSMutableArray *subPoints = [self.totalPoints lastObject];
// 4.将手指移动时触摸的点存储到小数组中
[subPoints addObject:[NSValue valueWithCGPoint:movePoint]];
// 5.调用drawRect方法重回视图
[self setNeedsDisplay];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
// 1.获取手指对应UITouch对象
UITouch *touch = [touches anyObject];
// 2.通过UITouch对象获取手指触摸的位置
CGPoint endPoint = [touch locationInView:touch.view];
// 3.从大数组中取出当前路径对应的小数组
NSMutableArray *subPoints = [self.totalPoints lastObject];
// 4.将手指移动时触摸的点存储到小数组中
[subPoints addObject:[NSValue valueWithCGPoint:endPoint]];
// 5.调用drawRect方法重绘视图
[self setNeedsDisplay];
}
// 画线
- (void)drawRect:(CGRect)rect
{
// 1.获取上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
// 遍历大数组,取出所有的小数组(每一个小数组代表一条线段)
for (NSMutableArray *subPointArray in self.totalPoints) {
// 遍历小数组, 取出小数组中所有的点
for (int index = 0; index < subPointArray.count; index++) {
// 1.取出小数组中的每一个点
CGPoint point = [subPointArray[index] CGPointValue];
// 2.绘制线段
if (0 == index) {
// 2.1. 设置线段的起点
CGContextMoveToPoint(ctx, point.x, point.y);
}else
{
// 2.2.设置线段的终点
CGContextAddLineToPoint(ctx, point.x, point.y);
}
}
}
CGContextSetLineCap(ctx, kCGLineCapRound);
CGContextSetLineJoin(ctx, kCGLineJoinRound);
CGContextSetLineWidth(ctx, 10);
// 3.渲染
CGContextStrokePath(ctx);
}
- (void)clearView
{
[self.totalPoints removeAllObjects];
[self setNeedsDisplay];
}
- (void)backView
{
[self.totalPoints removeLastObject];
[self setNeedsDisplay];
}
@end
第2种方法:用path来绘制线段,每个path都是一个线段,然后创建一个数组存放所有的path,最终遍历绘制出所有线段(这才是主要的方法)
#import "YJ_View2.h"
@interface YJ_View2 ()
@property (nonatomic, strong) NSMutableArray *paths;
@end
@implementation YJ_View2
- (NSMutableArray *)paths
{
if (_paths == nil) {
_paths = [NSMutableArray array];
}
return _paths;
}
// 开始触摸
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// 1.获取手指对应UITouch对象
UITouch *touch = [touches anyObject];
// 2.通过UITouch对象获取手指触摸的位置
CGPoint startPoint = [touch locationInView:touch.view];
// 3.当用户手指按下的时候创建一条路径
UIBezierPath *path = [UIBezierPath bezierPath];
// 3.1设置路径的相关属性
[path setLineJoinStyle:kCGLineJoinRound];
[path setLineCapStyle:kCGLineCapRound];
[path setLineWidth:10];
// 4.设置当前路径的起点
[path moveToPoint:startPoint];
// 5.将路径添加到数组中
[self.paths addObject:path];
}
// 移动
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
// 1.获取手指对应UITouch对象
UITouch *touch = [touches anyObject];
// 2.通过UITouch对象获取手指触摸的位置
CGPoint movePoint = [touch locationInView:touch.view];
// 3.取出当前的path
UIBezierPath *currentPaht = [self.paths lastObject];
// 4.设置当前路径的终点
[currentPaht addLineToPoint:movePoint];
// 6.调用drawRect方法重回视图
[self setNeedsDisplay];
}
// 离开view(停止触摸)
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
[self touchesMoved:touches withEvent:event];
/*
// 1.获取手指对应UITouch对象
UITouch *touch = [touches anyObject];
// 2.通过UITouch对象获取手指触摸的位置
CGPoint endPoint = [touch locationInView:touch.view];
// 3.取出当前的path
UIBezierPath *currentPaht = [self.paths lastObject];
// 4.设置当前路径的终点
[currentPaht addLineToPoint:endPoint];
// 6.调用drawRect方法重回视图
[self setNeedsDisplay];
*/
}
// 画线
- (void)drawRect:(CGRect)rect
{
[[UIColor redColor] set];
// 边路数组绘制所有的线段
for (UIBezierPath *path in self.paths) {
[path stroke];
}
}
- (void)clearView
{
[self.paths removeAllObjects];
[self setNeedsDisplay];
}
- (void)backView
{
[self.paths removeLastObject];
[self setNeedsDisplay];
}
@end
为图片实现打马赛克功能,博文地址:
http://mp.blog.csdn.net/mdeditor/79461592