iOS涂鸦-自由画笔可以用到的代码

  • Post author:
  • Post category:其他


1.线段模用来存储线段信息

//
//  Line.h

//  线段模型

#import <UIKit/UIKit.h>


@interface Line : NSObject
/**
 *  线条所包含的所有点
 */
@property (nonatomic,strong)NSMutableArray <__kindof NSValue *>*linePoints;
/**
 *  线条的颜色
 */
@property (nonatomic,strong)UIColor *lineColor;
/**
 *  线条的粗细
 */
@property (nonatomic,assign)NSInteger lineWidth;
@end
#import "Line.h"

@implementation Line

- (instancetype)init
{
    if (self=[super init]) {
        self.linePoints = [NSMutableArray array];
    }
    
    return self;
}

@end

2.自定义控件

//
//  DrawLine.h
//  创建一个直线

#import <UIKit/UIKit.h>

@interface DrawLine : UIView

/**
 *  线的颜色(用于接收外部传进来的颜色)
 */
@property (nonatomic, strong) UIColor *lineColor;
/**
 *  线宽(用于接收外部传进来)
 */
@property (nonatomic, assign) NSInteger lineWidth;

@end
//
//  DrawLine.m


#import "DrawLine.h"
#import "Line.h"

@interface DrawLine()
/**
 *  存放所有线条的信息(颜色、坐标、宽度)
 */
@property(nonatomic,strong)NSMutableArray *allLineInfos;
@end

@implementation DrawLine

- (NSMutableArray *)lineInfos
{
    if (_allLineInfos == nil) {
        _allLineInfos = [NSMutableArray array];
    }
    return _allLineInfos;
}

/**
 *  从代码创建控件会调用(这个方法里做一次性初始化设置)
 */
- (instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        self.backgroundColor = [UIColor clearColor];
        self.lineWidth = 2;
        self.lineColor = [UIColor redColor];
    }
    return self;
}

#pragma mark - touche
/**
 *  开始触摸
 */
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    // 1.取出UITouch对象
    UITouch *touch=[touches anyObject];
    
    // 2.创建一个线条信息模型
    Line *info = [Line new];
    info.lineColor = self.lineColor;
    info.lineWidth = self.lineWidth;
    [info.linePoints addObject:[NSValue valueWithCGPoint:[touch locationInView:self]]];
    
    // 3.把该线条信息模型添加到数组
    [self.allLineInfos addObject:info];
    
    // 4.重绘
    [self setNeedsDisplay];
}

/**
 *  触摸点一直在移动就会调用
 */
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    // 1.取出所有point
    NSArray* MovePointArray=[touches allObjects];
    
    // 2.取出最新添加的一个线段信息模型
    Line *lastInfo = [self.lineInfos lastObject];
    
    // 3.给这个模型的linePoints属性添加值
    [lastInfo.linePoints addObject:[NSValue valueWithCGPoint:[[MovePointArray objectAtIndex:0] locationInView:self]]];
    
    // 4.重绘
    [self setNeedsDisplay];
}

#pragma mark - 绘制
/**
 *  根据现有的线条绘制相应的图形
 */
- (void)drawRect:(CGRect)rect
{
    CGContextRef context=UIGraphicsGetCurrentContext();
    CGContextSetLineCap(context, kCGLineCapRound);
    CGContextSetLineJoin(context, kCGLineJoinRound);
    
    if (self.allLineInfos.count>0) {
        for (int i=0; i<[self.allLineInfos count]; i++) {
            Line *info = self.allLineInfos[i];
            
            CGContextBeginPath(context);
            CGPoint myStartPoint=[[info.linePoints objectAtIndex:0] CGPointValue];
            CGContextMoveToPoint(context, myStartPoint.x, myStartPoint.y);
            
            if (info.linePoints.count>1) {
                for (int j=0; j<[info.linePoints count]-1; j++) {
                    CGPoint myEndPoint=[[info.linePoints objectAtIndex:j+1] CGPointValue];
                    CGContextAddLineToPoint(context, myEndPoint.x,myEndPoint.y);
                }
            }else {
                CGContextAddLineToPoint(context, myStartPoint.x,myStartPoint.y);
            }
//            CGContextSetStrokeColorWithColor(context, info.lineColor.CGColor);
            CGContextSetLineWidth(context, info.lineWidth);
            
            // 定义阴影
            NSShadow* shadow4 = [[NSShadow alloc] init];
            [shadow4 setShadowColor: info.lineColor];
            [shadow4 setShadowOffset: CGSizeMake(0.0, 0.0)];
            [shadow4 setShadowBlurRadius: info.lineWidth * 1.2];
            
            // 绘制阴影
            CGContextSaveGState(context);
            CGContextSetShadowWithColor(context, shadow4.shadowOffset, shadow4.shadowBlurRadius, [shadow4.shadowColor CGColor]);
            [[UIColor colorWithRed:245/255.0 green:255/255.0 blue:243/255.0 alpha:1.0] setStroke];
            
            CGContextStrokePath(context);
        }
    }

}

@end

3.控制器里如何使用?

 DrawLine *line = [[DrawLine alloc]initWithFrame:CGRectMake(0, 0, screenW, screenH)];
    line.lineWidth = self.currentWidth;
    line.lineColor = self.currentColor;
    [self.bgView addSubview:line];



版权声明:本文为github_26672553原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。