iOS手写签批

 

 

废话不说,直接上代码

 

封装.h

//
//  SignatureView.h
//  Copyright © 2019 dev. All rights reserved.
//

#import <UIKit/UIKit.h>
@interface SignatureView : UIView
/**
 * 获取签名图片
 */
- (UIImage *)getSignatureImage;
/**
 * 清除签名
 */
- (void)clearSignature;
@end

 

封装.m

//
//  SignatureView.m
//  Copyright © 2019 dev. All rights reserved.
//

#import "SignatureView.h"
@interface SignatureView (){
    CGPoint points[5];
}
@property(nonatomic,assign) NSInteger control;
@property(nonatomic,strong) UIBezierPath *beizerPath;

@end

@implementation SignatureView
- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor clearColor];
        [self setMultipleTouchEnabled:NO];
        self.beizerPath = [UIBezierPath bezierPath];
        [self.beizerPath setLineWidth:2];
    }
    return self;
}

#pragma mark - 绘图操作
- (void)drawRect:(CGRect)rect{
    //设置签名的颜色
    UIColor *strokeColor = [UIColor blackColor];
    [strokeColor setStroke];
    
    //签名的路径绘制
    [self.beizerPath stroke];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    self.control = 0;
    UITouch *touch = [touches anyObject];
    points[0] = [touch locationInView:self];
    CGPoint startPoint = points[0];
    CGPoint endPoint = CGPointMake(startPoint.x + 1.5, startPoint.y + 2);
    [self.beizerPath moveToPoint:startPoint];
    [self.beizerPath addLineToPoint:endPoint];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    CGPoint touchPoint = [touch locationInView:self];
    _control++;
    points[_control] = touchPoint;
    
    if (_control == 4){
        points[3] = CGPointMake((points[2].x + points[4].x)/2.0, (points[2].y + points[4].y)/2.0);
        
        //设置画笔起始点
        [self.beizerPath moveToPoint:points[0]];
        
        //endPoint终点 controlPoint1、controlPoint2控制点
        [self.beizerPath addCurveToPoint:points[3] controlPoint1:points[1] controlPoint2:points[2]];
        
        //setNeedsDisplay会自动调用drawRect方法,这样可以拿到UIGraphicsGetCurrentContext,就可以画画了
        [self setNeedsDisplay];
        
        points[0] = points[3];
        points[1] = points[4];
        _control = 1;
    }
}

#pragma mark - 清除签名
- (void)clearSignature{
    [self.beizerPath removeAllPoints];
    [self setNeedsDisplay];
}

#pragma mark - 获取图片
- (UIImage *)getSignatureImage {
    //设置为NO,UIView是透明这里的图片就是透明的
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, [UIScreen mainScreen].scale);
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    
    UIImage *signatureImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    NSString* docDir = [NSString stringWithFormat:@"%@/Documents/Image", NSHomeDirectory()];
    [[NSFileManager defaultManager] createDirectoryAtPath:docDir withIntermediateDirectories:YES attributes:nil error:nil];
    NSString *path = [NSString stringWithFormat:@"%@/Documents/Image/IMAGE.png", NSHomeDirectory()];
    
    //用png是透明的
    [UIImagePNGRepresentation(signatureImage) writeToFile: path atomically:YES];
//    [UIImageJPEGRepresentation(signatureImage,0.0001) writeToFile: path atomically:YES];//jpeg用这个
return signatureImage;
}



@end

 

 

在vc里面使用

例如:

//
//  SignatureViewController.h
//  Copyright © 2019 dev. All rights reserved.
//

#import <UIKit/UIKit.h>



@interface SignatureViewController : UIViewController

@property(nonatomic,strong)CommenModel *contentModel;

@end

 

 

//
//  SignatureViewController.m
//  Copyright © 2019 dev. All rights reserved.
//

#import "SignatureViewController.h"
#import "SignatureView.h"

#define kScreenHeight [UIScreen mainScreen].bounds.size.height
#define kScreenWidth [UIScreen mainScreen].bounds.size.width
#define YYEncode(str) [str dataUsingEncoding:NSUTF8StringEncoding]
#define kBOUNDARY @"abc"

@interface SignatureViewController ()
@property(nonatomic,strong) SignatureView *signView;
@property(nonatomic,strong) UIImageView *imageView;

@end

@implementation SignatureViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.view.backgroundColor = [UIColor whiteColor];
    
    [self addTopNaviBarWithTitle:@"签名"];
    //画布
    UIView *backView = [[UIView alloc] initWithFrame:CGRectMake(0, SafeAreaTopHeight, kScreenWidth, 200)];
    backView.layer.borderWidth = 2;
    backView.layer.borderColor = [[UIColor redColor] CGColor];
    [self.view addSubview:backView];
    self.signView = [[SignatureView alloc] initWithFrame:backView.bounds];
    [backView addSubview:self.signView];
    
    
    
    UIButton *reSignBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    reSignBtn.backgroundColor = NAVIBAR_COLOR_DEFAULT;
    [reSignBtn setTitle:@"重签" forState:UIControlStateNormal];
    [reSignBtn setFrame:CGRectMake(20, SafeAreaTopHeight+200+10, (self.view.width - 20*3)*0.5, 40)];
    reSignBtn.layer.cornerRadius = 5.0;
    reSignBtn.clipsToBounds = YES;
    reSignBtn.titleLabel.font = [UIFont systemFontOfSize:17];
    [reSignBtn addTarget:self action:@selector(clearBtnClick) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:reSignBtn];
    
    
    UIButton *confirmBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    [confirmBtn setTitle:@"确认" forState:UIControlStateNormal];
    confirmBtn.backgroundColor = NAVIBAR_COLOR_DEFAULT;
    confirmBtn.titleLabel.font = [UIFont systemFontOfSize:17.0];
    confirmBtn.frame = CGRectMake(CGRectGetMaxX(reSignBtn.frame)+20, reSignBtn.origin.y, reSignBtn.width, reSignBtn.height);
    confirmBtn.layer.cornerRadius = 5.0;
    confirmBtn.clipsToBounds = YES;
    [confirmBtn addTarget:self action:@selector(imageBtnClick) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:confirmBtn];
    
    
}
#pragma mark----导航栏
-(void)addTopNaviBarWithTitle:(NSString *)title
{
    UIView *naviBar = [[UIView alloc]initWithFrame:CGRectMake(0, 0, JX_SCREEN_WIDTH, SafeAreaTopHeight)];
    UIColor *naviColor = NAVIBAR_COLOR_DEFAULT;
    naviBar.backgroundColor = naviColor;
    

    if(title.length)
    {
        
        UILabel *titleLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, JX_SCREEN_WIDTH-40-40, 132.0 / SCALE)];
        
        titleLabel.font = TITLE_FONT_SIZE;
        titleLabel.textColor = [UIColor whiteColor];
        titleLabel.textAlignment =  IFLY_ALIGN_CENTER;
        [titleLabel setCenter:CGPointMake(naviBar.center.x, naviBar.center.y + SCREEN_Y / 2.0)];
        [naviBar addSubview:titleLabel];
        titleLabel.hidden = NO;
        titleLabel.text = title;
    }else{
        
    }
    UIButton *backBottomBtn = [[UIButton alloc]initWithFrame:CGRectMake(0, SCREEN_Y, 60, 44)];
    backBottomBtn.backgroundColor = [UIColor clearColor];
    [backBottomBtn addTarget:self action:@selector(goBack) forControlEvents:UIControlEventTouchUpInside];
    [naviBar addSubview:backBottomBtn];
    UIButton *backButton = [[UIButton alloc]initWithFrame:CGRectMake(36.0 / SCALE,SCREEN_Y+ (44-66.0 / SCALE)/2, 66.0 / SCALE, 66.0 / SCALE)];
    [backButton setImage:[UIImage imageNamed:@"Right"] forState:UIControlStateNormal];
    [backButton addTarget:self action:@selector(goBack) forControlEvents:UIControlEventTouchUpInside];
    [naviBar addSubview:backButton];
    [self.view addSubview:naviBar];
}
-(void)goBack
{
    [self.navigationController popViewControllerAnimated:YES];
}
#pragma mark - 清楚图片
- (void)clearBtnClick{
    [self.signView clearSignature];
}

#pragma mark - 生成图片
- (void)imageBtnClick{
    UIImage *image  =  [self.signView getSignatureImage];

//拿到图片做你想做的吧
/********************/ }
@end

 

posted @ 2019-09-18 11:11  OIMMZC  阅读(281)  评论(0编辑  收藏  举报