iOS 手写签批以及签章

序言

近期搞了一个需求。安卓端给提供了基础代码,然而iOS,和之前一样得自己搞。
siganture.mp4

正文
  1. 整体布局思路:
  • 下面是画板,上面是一个textView,不需要textView的键盘,把他的inputView设置为nil
  • 手写完生成的图片让textview以富文本的形式进行展示,并且对富文本进行拼接删除
  1. 最基本的手写功能使用的是UberSignature,代码开源的,开发完成后研究了一波源码,推荐直接查看手写签名,个人感觉理解的很到位。

  2. 手指接触屏幕后,当手指离开屏幕时需要设置一个时间,让它来识别出生成了一个字。这时用到了一个取消之前操作的方法,不然多次接触离开屏幕会导致方法多次执行。

    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(writeOver) object:nil];
  1. 拖着签章移动,移动时章在字的上面,移动后章在字的下面,这里用到了hitTest方法,首先把章的imageView插入到textView的显示字的view的下面。当点击到章的位置时,调整章的view层级,显示到最前面,移动结束后,再次插入到文字下面。
  2. 签章的移动,这个在之前做悬浮按钮时有过封装,直接改了下拿过来用的TopMoveImageView
  3. 当手写的文字和签章共存于一个界面时,这时要把这些内容生成一张图片,当时有个一直闪说的光标,截取时得想办法去掉,生成图片方法如下:
#pragma mark- 这是一个截取局部图片的方法
- (void)getImv{
    
    UIView *subV = self.contentTextView.subviews[0];
    UIView *selectionView;
    Class cla = NSClassFromString(@"UITextSelectionView");
    for (UIView *subView in subV.subviews) {
        if ([subView isKindOfClass:cla]) {
            [subView removeFromSuperview];
            selectionView = subView;
        }
    }

    CGRect frame1 = subV.frame;
    CGFloat maxY1 = CGRectGetMaxY(frame1);
    CGRect frame2 = self.topView.frame;
    CGFloat maxY2 = CGRectGetMaxY(frame2);
    CGRect tailorFrame = CGRectZero;
    if (maxY1 > maxY2) {
        tailorFrame = CGRectMake(frame1.origin.x, frame1.origin.y, frame1.size.width, frame1.size.height);
    }else{
        tailorFrame = CGRectMake(frame1.origin.x, frame1.origin.y, frame1.size.width, maxY2);
    }
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        //UIGraphicsBeginImageContext(CGSize size) 不清晰
        //下面的清晰 后面写.0
        UIGraphicsBeginImageContextWithOptions(tailorFrame.size, YES, .0);
        [self.bgImageView drawViewHierarchyInRect:tailorFrame afterScreenUpdates:NO];
        //开始没写下面这个方法导致获取的图片有问题
        [[self.bgImageView layer] renderInContext:UIGraphicsGetCurrentContext()];
//        生成的图片
        UIImage * image = UIGraphicsGetImageFromCurrentImageContext();
//        开发测试阶段用于显示生成的图片
//        self.bigImv.image = image;
        UIGraphicsEndImageContext();
        //把获取到的图片上传服务器
//      [self uploadImgWithImage:image];
    });
}

结束语

生活不只有眼前的苟且
还有湿
和床上的狂野

原始 Demo 下载地址

你可能感兴趣的:(iOS 手写签批以及签章)