iOS 自定义签名控件

1. UKAutographView

UKAutographView控件用来实现自定义签名功能,UKAutographView实现UIView

@interface UKAutographView()

// path记录当前绘制路径
@property(nonatomic, strong) UIBezierPath *path;
// paths记录所有绘制路径
@property(nonatomic, strong) NSMutableArray<UIBezierPath *> *paths;
// points记录所有绘制路径上的点
@property(nonatomic, strong) NSMutableArray<NSValue *> *points;

// 宽高比,默认1.25
@property(nonatomic, assign) CGFloat imageRatio;

@end

UKAutographView有两个功能,

  • 记录所有的绘制点,在touchesBegan初始化当前绘制路径,在touchesMoved里面往当前绘制路径里面添加绘制点。
  • drawRect:(CGRect)rect方法里面绘制签名。
@implementation UKAutographView

- (instancetype)init {
    self = [super init];
    if (self) {
        self.paths = [[NSMutableArray alloc] init];
        self.points = [[NSMutableArray alloc] init];
        self.imageRatio = 1.25;
        self.backgroundColor = [UIColor clearColor];
    }
    return self;
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    // 1.获取触摸对象
    UITouch *touch = touches.anyObject;
        
    // 2.获取触摸点
    CGPoint locP = [touch locationInView:touch.view];
        
    //3.创建绘图路径
    self.path = [[UIBezierPath alloc] init];
    self.path.lineWidth = 6;
    self.path.lineCapStyle = kCGLineCapRound;
    self.path.lineJoinStyle = kCGLineJoinRound;
        
    // 4.添加子路径
    [self.path moveToPoint:locP];
    [self.points addObject:[NSValue valueWithCGPoint:locP]];
        
    // 5.把path添加到数组中
    [self.paths addObject:self.path];
}

- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    UITouch *touch = touches.anyObject;
    CGPoint locP = [touch locationInView:touch.view];
    
    [self.path addLineToPoint:locP];
    [self.points addObject:[NSValue valueWithCGPoint:locP]];
    
    [self setNeedsDisplay];
    
    if (self.delegate) {
        [self.delegate autographViewDidBegin:self];
    }
}

- (void)drawRect:(CGRect)rect {
    //设置颜色
    [[UIColor blackColor] set];

    for (UIBezierPath *path in self.paths) {
        [path stroke];
    }
}

@end

UKAutographView其他方法

// 设置生成签名的宽高比
- (void)setImageRatio:(CGFloat)ratio {
    _imageRatio = ratio;
}

// 清空已有签名
- (void)clear {
    [self.paths removeAllObjects];
    [self.points removeAllObjects];
    
    [self setNeedsDisplay];
}

// 获取当前签名
- (UIImage *)save {
    CGPoint point = self.points.firstObject.CGPointValue;
    CGFloat left = point.x;
    CGFloat right = point.x;
    CGFloat top = point.y;
    CGFloat bottom = point.y;
    
    for (NSValue *pointValue in self.points) {
        CGPoint point = pointValue.CGPointValue;
        if (point.x < left) {
            left = point.x;
        } else if (point.x > right) {
            right = point.x;
        }
        
        if (point.y < top) {
            top = point.y;
        } else if (point.y > bottom) {
            bottom = point.y;
        }
    }
    CGFloat height = bottom - top;
    CGFloat width = right - left;
    
    if (width / height > self.imageRatio) {
        CGFloat newHeight = width / self.imageRatio;
        top -= (newHeight - height) / 2;
        bottom = top + newHeight;
    } else {
        CGFloat newWidth = height * self.imageRatio;
        left -= (newWidth - width) / 2;
        right = left + newWidth;
    }
    
    CGRect imageRect = CGRectMake(left - 1, top - 1, right - left + 2, bottom - top + 2);

    // 开启上下文 参数1:CGSize size 尺寸, 参数2:BOOL opaque 透明度, 参数3:CGFloat scale 比例
    UIGraphicsBeginImageContextWithOptions(imageRect.size, NO, [UIScreen mainScreen].scale);

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    CGContextTranslateCTM(context, -imageRect.origin.x, -imageRect.origin.y);
    
    // 获取图像
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    CGContextRestoreGState(context);
    
    UIImage *saveImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
        
    return saveImage;
}

2. 签名界面

为了保持签名的范围,我们会让签名界面保持横屏状态

- (UIView *)contentView {
    if (!_contentView) {
        CGFloat width = kScreenHeight - kStatusBarHeight - 50 - kBottomSafeHeight;
        CGFloat height = kScreenWidth;
        CGPoint center = CGPointMake(height/2, kStatusBarHeight + 50 + width / 2);
        
        _contentView = [[UIView alloc] initWithFrame:CGRectMake(center.x - width/2, center.y - height/2, width, height)];
        [_contentView setTransform:CGAffineTransformMakeRotation(M_PI_2)];
    }
    return _contentView;
}

效果如下

在这里插入图片描述

绘制过程中主要有三个事件,

// 重签按钮,清空签名并显示提示栏,提交按钮置灰
- (void)reSignClick:(UIButton *)sender {
    [self.autographView clear];
    self.confirmButton.enabled = NO;
    self.tipsLabel.hidden = NO;
    self.showImageView.hidden = YES;
}

// 提交按钮,在左上角显示手势签名
- (void)confirmClick:(UIButton *)sender {
    UIImage *autographImage = [self.autographView save];
    self.showImageView.image = autographImage;
    self.showImageView.hidden = NO;
}

#pragma mark - UKAutographViewDelegate -
// 开始绘制,隐藏提示栏,可以提交签名
- (void)autographViewDidBegin:(UKAutographView *)autographView {
    self.confirmButton.enabled = YES;
    self.tipsLabel.hidden = YES;
    self.showImageView.hidden = YES;
}

效果如下

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
控件正支持全部Office菜单,支持Office的打印预览,控件强大的B/S通讯技术, 能够将服务器数据库中的数据或者用户自定义的数据插入当前文档的指定位置,而且 还可以将文档中的指定数据随时保存到服务器数据库或者指定的目录中.控件能够在浏 览器窗口中直接编辑Word文档并保存到Web服务器上。实现文档和数据库的统一管理。 控件同时支持痕迹保留,手写签名,电子印章等办公自动化系统必备的功能。 控件采用标准HTTP协议,支持任意后台Web服务器,任意后台编程语言(Asp, Jsp, Php,VB.NET,C#.NET等) 控件功能: 1.控件采用xml数据格式传输,有良好的扩展性. 2.控件支持多种网络传输协议(Ftp,http). 3.控件支持标准的http协议80端口(自已可定义端口),可以有效地跨过防火墙对控件的影响. 4.控件支持多种存储方式,可以直接存放在指定的目录也可以存储在数据库中方便管理. 5.存储在数据库中或存储在目录中的文档数据是加密处理(需要密钥)大大加强文档的安全性. 6. 数据库支持功能 支持文件保存到服务器数据库中,可以支持多种数据库,如SQL Server,Oracle,Sybase,MySql,Access等。 7.控件支持数据模板拟稿时选择模版套红. 8.强制留痕受到密码保存,文档就算脱离控件也可以继续强制留留痕. 9.手写签名,可支持任意的手写板(不可以鼠标画)签名或签意见. 10.可以准确检测有效的签名,还可以做到对有效签名进行特显,使得更形象展示有效的签名. 11.控件电子盖章功能实现印章或签名资源预保存功能,用户可以通过密码的方式来获得自己的签名或印章,印章和签名与 文档保存在一起,印章或签名可以功过系统的验证来判断真伪。 12.盖章数据是根据标准的加密方式.用户只有通过明钥和密钥的认证后才可以得到用户的盖章数据.大大加强了盖章的安全性. 13.控件的二次开发提供强大的函数库,支持多种系统环境,多种开发语言,多种数据库。 14.控件支持日志功能,文档的每一个修改操作都可以记录以供用户校对. 15.控件完全支持office菜单功能. 16.控件可以做到打印预览. 17、模版套红.控件支持数据模板拟稿或定搞时选择模版套红。 18.插入透明浮动图片.支持从服务器插入透明浮动图片到Word文档支持将服务器图片插入到Word文档的指定位置。 19.版本控制功能.版本控制功能,能够让您对WORD和EXCEL文档有更多的控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值