您的位置:首页 > 移动开发 > IOS开发

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

2016-03-17 15:06 148 查看
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];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: