码迷,mamicode.com
首页 > 移动开发 > 详细

iOS --制作画板 --2

时间:2015-09-18 19:00:48      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:

定义一个继承于NSObject的model对象,用于存储

线的颜色,路径及线宽

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>//一定导入UIKit框架
@interface PathModel : NSObject

@property(nonatomic,assign)CGMutablePathRef path;//路径(需要调用set方法retain)
@property(nonatomic,strong)UIColor *color;//颜色
@property(nonatomic,assign)CGFloat lineWidth;//线宽

@end


//记得要将路径计数值加一,复写set方法
#import "PathModel.h"

@implementation PathModel

-(void)dealloc
{
    CGPathRelease(_path);
}

- (void)setPath:(CGMutablePathRef)path
{
    //使路径的计数值加一,这样在DrawView中释放路径后,model中仍然存在,不会出现野指针
    CGPathRetain(path);
     _path = path;
}
@end



DrawView中的实现代码

#import "DrawView.h"
#import "PathModel.h"
@implementation DrawView

-(instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        //设置默认值
        _lineWidth = 1;
        _color = [UIColor blackColor];

    }
    return self;
}


- (void)drawRect:(CGRect)rect {

    //如果可变数组不是空的,则需要重新绘制之前的路径
    if (_pathArray.count>0)
    {
        for (int i = 0; i<_pathArray.count; i++)
        {
            //遍历数组中的所有元素 取出model中的属性并绘制之前的线条
            PathModel *model = _pathArray[i];
            CGContextRef context = UIGraphicsGetCurrentContext();
            CGMutablePathRef path = model.path;
            UIColor *color = model.color;
            CGFloat width = model.lineWidth;
            //绘制
            CGContextAddPath(context, path);
           //设置填充颜色
            [color set];
            //设置线宽
            CGContextSetLineWidth(context, width);

            //设置头尾及连接点的类型为圆的,
            CGContextSetLineJoin(context, kCGLineJoinRound);
            CGContextSetLineCap(context, kCGLineCapRound);
            CGContextDrawPath(context, kCGPathStroke);
        }
    }
    //当_LinePath不为空的时候,说明开始绘制新的线条,颜色和线宽就是在视图控制器中通过block块传递过来的参数
    if (_LinePath != nil)
    {
        CGContextRef context = UIGraphicsGetCurrentContext();
        
        [_color set];
        CGContextSetLineWidth(context, _lineWidth);
        
        CGContextAddPath(context, _LinePath);

        CGContextDrawPath(context, kCGPathStroke);
    }
    
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    //取得手指开始触摸的点的坐标
    CGPoint p = [[touches anyObject] locationInView:self];
    //创建路径
    _LinePath  = CGPathCreateMutable();
    //获得路径开始的点的坐标
    CGPathMoveToPoint(_LinePath, NULL, p.x, p.y);
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
     //获得手指一动过程中经过的点的坐标
    CGPoint p = [[touches anyObject]locationInView:self];
    //将这些点添加到路径中
    CGPathAddLineToPoint(_LinePath, NULL, p.x,p.y);
    //重新绘制
    [self setNeedsDisplay];
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    //创建一个可变数组,存放model对象,(model中有颜色,线宽,路径三个属性)
    if (_pathArray==nil)
    {
        _pathArray = [[NSMutableArray alloc]init];

    }
    //创建model对象,并且给model中的属性赋值
    PathModel *model = [[PathModel alloc]init];
    model.path = _LinePath;
    model.lineWidth = _lineWidth;
    model.color = _color;
    //将model存放到可变数组中
    [_pathArray addObject:model];
    //手指结束触摸时将路径释放掉
    CGPathRelease(_LinePath);
    _LinePath = nil;
    
}

- (void)undo
{
    if (_pathArray.count>0)
    {
        [_pathArray removeLastObject];
        [self setNeedsDisplay];
    }
}
- (void)clear
{
    if (_pathArray.count>0)
    {
        [_pathArray removeAllObjects];
        [self setNeedsDisplay];
    }
}



@end

效果图

技术分享


iOS --制作画板 --2

标签:

原文地址:http://my.oschina.net/zhangqy/blog/508222

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!