美文网首页收藏ios
iOS画板(签字版)

iOS画板(签字版)

作者: OrrHsiao | 来源:发表于2018-10-29 11:19 被阅读0次

    话不多说,直接上代码

    .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功能都已暴露接口,直接调用即可

    相关文章

      网友评论

        本文标题:iOS画板(签字版)

        本文链接:https://www.haomeiwen.com/subject/sifbtqtx.html