zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Python操作Word:常用对象介绍
    Python入门教程 超详细1小时学会Python
    用几何画板画七边形的方法
    用ChemDraw画3D图的方法
    Chem 3D模型的参数值更改方法
    Chem 3D中怎么创建立体模型
    在几何画板中输入绝对值的方法
    怎么给几何画板文字加立体阴影效果
    几何画板放大和缩小的方法
    ChemDraw Pro和ChemBio3D Ultra有什么区别
  • 原文地址:https://www.cnblogs.com/OIMM/p/11540480.html
Copyright © 2011-2022 走看看