iOS畫板(簽字版)

話不多說,直接上代碼

.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];
    //創(chuàng)建路徑
    _path = CGPathCreateMutable();
    NSArray *attributeArry = @[(__bridge id)(_path),_color,[NSNumber numberWithFloat:_lineWidth]];
    //路徑及屬性數(shù)組數(shù)組
    [_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

直接引用調(diào)用即可

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

撤銷功能、清除功能、獲取生成的image功能都已暴露接口,直接調(diào)用即可

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明AI閱讀 16,172評論 3 119
  • dandandandandd閱讀 121評論 0 0
  • --應舊時光讀書會之約 他摩挲著老收音機的皮套 童年的節(jié)目已卡在生銹的電路板 無法復制 他打開一本老書 兩隻前世的...
    墨語堂書法閱讀 217評論 0 1
  • 曾清脆嘹亮彼伏此起 迎送分享陽光的夏季 那連綿不斷絲絲縷縷 催紅滿園飄香的荔枝 處處音畫時尚 年年赴約如期 鳴就鳴...
    珠江潮平閱讀 1,661評論 35 52

友情鏈接更多精彩內(nèi)容