收藏ios

iOS画板(签字版)

2018-10-29  本文已影响0人  OrrHsiao

话不多说,直接上代码

.h文件

#import <UIKit/UIKit.h>

@interface XASignatureView : UIView

/**
 *  画布
 */
{
    CGPoint _start;
    CGPoint _move;
    CGMutablePathRef _path;
    NSMutableArray *_pathArray;
    CGFloat _lineWidth;
    UIColor *_color;
}

@property (nonatomic,assign)CGFloat lineWidth;/**< 线宽 */

@property (nonatomic,strong)UIColor *color;/**< 线的颜色 */

@property (nonatomic,strong)NSMutableArray *pathArray;

/**
 获取绘制的图片

 @return 绘制的图片
 */
-(UIImage*)getDrawingImg;

/**
 撤销
 */
-(void)undo;

/**
 清空
 */
-(void)clear;

@end

.m文件

#import "XASignatureView.h"

@implementation XASignatureView

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
}
*/

- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        _move = CGPointMake(0, 0);
        _start = CGPointMake(0, 0);
        _lineWidth = 2;
        _color = [UIColor redColor];
        _pathArray = [NSMutableArray array];
    }
    return self;
}

- (void)drawRect:(CGRect)rect {
    // 获取图形上下文
    CGContextRef context = UIGraphicsGetCurrentContext();
    [self drawPicture:context]; //画图
}

- (void)drawPicture:(CGContextRef)context {
    for (NSArray * attribute in _pathArray) {
        //将路径添加到上下文中
        CGPathRef pathRef = (__bridge CGPathRef)(attribute[0]);
        CGContextAddPath(context, pathRef);
        //设置上下文属性
        [attribute[1] setStroke];
        CGContextSetLineWidth(context, [attribute[2] floatValue]);
        //绘制线条
        CGContextDrawPath(context, kCGPathStroke);
    }
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    //创建路径
    _path = CGPathCreateMutable();
    NSArray *attributeArry = @[(__bridge id)(_path),_color,[NSNumber numberWithFloat:_lineWidth]];
    //路径及属性数组数组
    [_pathArray addObject:attributeArry];
    //起始点
    _start = [touch locationInView:self];
    CGPathMoveToPoint(_path, NULL,_start.x, _start.y);
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    //释放路径
    CGPathRelease(_path);
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    _move = [touch locationInView:self];
    //将点添加到路径上
    CGPathAddLineToPoint(_path, NULL, _move.x, _move.y);
    [self setNeedsDisplay];
}

/**
 获取签名图片

 @return image
 */
-(UIImage *)getDrawingImg{
    
    if (_pathArray.count) {
        UIGraphicsBeginImageContext(self.frame.size);
        CGContextRef context = UIGraphicsGetCurrentContext();
        UIRectClip(CGRectMake(0, 0, self.frame.size.width, self.frame.size.height));
        [self.layer renderInContext:context];
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        return image;
    }
    return nil;
}

/**
 撤销
 */
-(void)undo
{
    [_pathArray removeLastObject];
    [self setNeedsDisplay];
}

/**
 清空
 */
-(void)clear
{
    [_pathArray removeAllObjects];
    [self setNeedsDisplay];
}

@end

直接引用调用即可

XASignatureView *signatureView = [[XASignatureView alloc] init];
[self.view addSubview:signatureView];
signatureView.frame = CGRectMake(0, 100, 200, 200);
image.png

撤销功能、清除功能、获取生成的image功能都已暴露接口,直接调用即可

上一篇下一篇

猜你喜欢

热点阅读