ios绘图demo,做一个涂鸦板(上)

来源:互联网 发布:淘宝申请售后时间 编辑:程序博客网 时间:2024/05/29 19:53

ios绘图demo,做一个涂鸦板(上)

之前一篇文字写了ios绘图基础,这篇文章,使用之前写的绘图基础,做一个涂鸦板。并把每一步完成都结果都单独保存一个文件,加上v+版本号

ios绘图基础

ios绘图demo,做一个涂鸦板(上)

  • 1完成一个最基本的涂鸦板
  • 2给涂鸦板加上颜色选择功能,和笔触粗细功能

ios绘图demo,做一个涂鸦板(下)

  • 3画贝塞尔曲线

ios绘图demo,做一个涂鸦板(上) 的效果图:

效果图

代码下载:github库,对应此文章的目录是paint ,点击跳转代码下载地址

1:完成一个最基本的涂鸦板

下载代码后见文件PaintViewV01,看效果请在ViewController中找到PaintView,换成PaintView01

步骤和原理

  • 1:重写uiview的 init、initWithFrame方法,主要是添加一个白色的背景色
  • 2:重写touchesBegan、touchesMoved、touchesEnded,作用是接收屏幕触摸的坐标,手指接触uiview后会依次执行这三个方法。 其中重写touchesBegan和重写touchesEnded只在开始和结束执行一次,而手指在移动的过程中,会多次执行touchesMoved
  • 3:重写drawRect方法,根据用户手指的移动,画出涂鸦

代码(关键步骤都已经注释,应该都能看明白吧)

////  PaintView.m//  Paint////  Created by 刘彦玮 on 15/7/26.//  Copyright (c) 2015年 刘彦玮. All rights reserved.//#import "PaintViewV01.h"@implementation PaintViewV01{    //画的线路径的集合,内部是NSMutableArray类型    NSMutableArray *paths;}-(instancetype)init{    self = [super init];    if (self) {       //初始化uiview的样式        [self paintViewInit];    }    return  self;}-(instancetype)initWithFrame:(CGRect)frame{        self = [super initWithFrame:frame];        if (self) {            //初始化uiview的样式            [self paintViewInit];        }        return  self;}//初始化paintViewInit样式和数据-(void)paintViewInit{    //添加背景色    self.backgroundColor = [UIColor whiteColor];    //初始化路径集合    paths = [[NSMutableArray alloc]init];}-(void)drawRect:(CGRect)rect{    //必须调用父类drawRect方法,否则 UIGraphicsGetCurrentContext()获取不到context    [super drawRect:rect];    //获取ctx    CGContextRef ctx = UIGraphicsGetCurrentContext();    //渲染所有路径    for (int i=0; i<paths.count; i++) {        NSMutableArray *pathPoints = [paths objectAtIndex:i];        CGMutablePathRef path = CGPathCreateMutable();        for (int j=0; j<pathPoints.count; j++) {            CGPoint point = [[pathPoints objectAtIndex:j]CGPointValue] ;            if (j==0) {                CGPathMoveToPoint(path, &CGAffineTransformIdentity, point.x,point.y);            }else{                CGPathAddLineToPoint(path, &CGAffineTransformIdentity, point.x, point.y);            }        }        //路径添加到ct        CGContextAddPath(ctx, path);        //描边        CGContextStrokePath(ctx);    }}-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{    //创建一个路径,放到paths里面    NSMutableArray *path = [[NSMutableArray alloc]init];    [paths addObject:path];}-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{    //获取当前路径    NSMutableArray *path = [paths lastObject];    //获取当前点    CGPoint movePoint = [[touches anyObject]locationInView:self];    NSLog(@"touchesMoved     x:%f,y:%f",movePoint.x,movePoint.y);    //CGPint要通过NSValue封装一次才能放入NSArray    [path addObject:[NSValue valueWithCGPoint:movePoint]];    //通知重新渲染界面,这个方法会重新调用UIView的drawRect:(CGRect)rect方法    [self setNeedsDisplay];}-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{}@end

1完成后,就可以画画了,不过只能画固定粗细的黑色笔画,下面,我我们增加彩色笔画和控制粗细的功能


2:给涂鸦板加上颜色和笔触粗细选择的功能

下载代码后见文件PaintViewV02,看效果请在ViewController中找到PaintView,换成PaintView02

步骤

  • 1增加一个数据对象,封装笔触pathPoint、笔触颜色、笔触粗细
  • 2修改变量名称,增加变量
  • 3修改界面,添加色板,和笔触粗细选择器
  • 4修改原来的touchesBegan,touchesMoved方法,将选择的颜色数据和粗细数据封装
  • 5修改drawRect方法

1增加一个数据对象,封装笔触pathPoint、笔触颜色、笔触粗细

////  PaintStep.h//  Paint////  Created by 刘彦玮 on 15/7/26.//  Copyright (c) 2015年 刘彦玮. All rights reserved.//#import <Foundation/Foundation.h>#import <UIKit/UIKit.h>@interface PaintStep : NSObject{@public    //路径    NSMutableArray *pathPoints;    //颜色    CGColorRef color;    //笔画粗细    float strokeWidth;}@end////  PaintStep.m//  Paint////  Created by 刘彦玮 on 15/7/26.//  Copyright (c) 2015年 刘彦玮. All rights reserved.//#import "PaintStep.h"@implementation PaintStep@end

2修改变量名称,增加变量,

paths 改名为 paintSteps,并增加currColor和slider两个变量

//屏幕的宽高,做自适应用的#define width  [UIScreen mainScreen].bounds.size.width#define height [UIScreen mainScreen].bounds.size.height@implementation PaintViewV02{    //画的线路径的集合,内部是NSMutableArray类型    NSMutableArray *paintSteps;    //当前选中的颜色    UIColor *currColor;    //当前笔触粗细选择器    UISlider *slider;}

3修改界面,添加色板,和笔触粗细选择器

(void)paintViewInit 方法增加对两个方法的调用

-(void)paintViewInit 方法增加    ....    //创建色板    [self createColorBord];    //创建笔触粗细选择器    [self createStrokeWidthSlider];}
创建色板和创建笔触粗细选择器的实现
//创建色板-(void)createColorBord{    //默认当前笔触颜色是黑色    currColor = [UIColor blackColor];    //色板的view    UIView *colorBoardView = [[UIView alloc]initWithFrame:CGRectMake(0, 20, width, 20)];    [self addSubview:colorBoardView];    //色板样式    colorBoardView.layer.borderWidth = 1;    colorBoardView.layer.borderColor = [UIColor blackColor].CGColor;    //创建每个色块    NSArray *colors = [NSArray arrayWithObjects:                       [UIColor blackColor],[UIColor redColor],[UIColor blueColor],                       [UIColor greenColor],[UIColor yellowColor],[UIColor brownColor],                       [UIColor orangeColor],[UIColor whiteColor],[UIColor orangeColor],                       [UIColor purpleColor],[UIColor cyanColor],[UIColor lightGrayColor], nil];    for (int i =0; i<colors.count; i++) {        UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake((width/colors.count)*i, 0, width/colors.count, 20)];        [colorBoardView addSubview:btn];        [btn setBackgroundColor:colors[i]];        [btn addTarget:self action:@selector(changeColor:) forControlEvents:UIControlEventTouchUpInside];    }}//切换颜色-(void)changeColor:(id)target{    UIButton *btn = (UIButton *)target;    currColor = [btn backgroundColor];}//创建笔触粗细选择器-(void)createStrokeWidthSlider{    slider = [[UISlider alloc]initWithFrame:CGRectMake(0, 50, width, 20)];    slider.maximumValue = 20;    slider.minimumValue = 1;    [self addSubview:slider];}

4修改原来的touchesBegan,touchesMoved方法,将选择的颜色数据和粗细数据封装


-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{    PaintStep *paintStep = [[PaintStep alloc]init];    paintStep->color = currColor.CGColor;    paintStep->pathPoints =  [[NSMutableArray alloc]init];    paintStep->strokeWidth = slider.value;    [paintSteps addObject:paintStep];}-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{    //获取当前路径    PaintStep *step = [paintSteps lastObject];    NSMutableArray *pathPoints = step->pathPoints;    ....}

5:修改drawRect方法

-(void)drawRect:(CGRect)rect{    ....    //渲染所有路径    for (int i=0; i<paintSteps.count; i++) {        ....        //设置path 样式        CGContextSetStrokeColorWithColor(ctx, step->color);        CGContextSetLineWidth(ctx, step->strokeWidth);        //路径添加到ct        CGContextAddPath(ctx, path);        ....    }}
完成后,我们的画板就可以画出彩色的笔画,控制粗细了。之后,我会继续给画板增加一些功能,并把方法写出来。
| ios绘图demo,做一个涂鸦板(上) | 完成后的效果图:

效果图

0 0
原创粉丝点击