简单的绘图签名,可以擦除和截屏

首先思路是连点成线,用平移手势获取触摸点,并用线把他们连起来。具体步骤如下:

第一步:创建继承自UIVIew的类,在init方法中创建path和手势

- (instancetype)initWithFrame:(CGRect)frame

{

    self = [superinitWithFrame:frame];

    if (self) {

        self.backgroundColor = [UIColoryellowColor];

        path = [UIBezierPathbezierPath];

        // 平移手势

        UIPanGestureRecognizer *pan = [[UIPanGestureRecognizeralloc] initWithTarget:selfaction:@selector(pan:)];

        [selfaddGestureRecognizer:pan];

  

    }

    return self;

}

第二步:在平移手势的方法实现中,我们把捕捉到的CGPoint类型坐标点加入到贝塞尔path中,连点成线,为了避免出现连接直线的不自然的感觉,只需要计算捕捉到的点之间的中点并把他们连起来。(即二次贝塞尔曲线)

 为了计算各捕捉点的中点,我们写一个返回值是CGPoint的方法

 CGPoint midpoint(CGPoint p0,CGPoint p1) {

    return (CGPoint) {

        (p0.x + p1.x) /2.0,

        (p0.y + p1.y) /2.0

    };

}


//平移手势方法实现如下:

//更新手势用二次贝塞尔曲线连接处理

- (void)pan:(UIPanGestureRecognizer *)pan {

    CGPoint currentPoint = [pan locationInView:self];

//计算上一次捕捉到的点和当次捕捉到的点之间的中点坐标

    CGPoint midPoint = midpoint(previousPoint, currentPoint);

    

    if (pan.state ==UIGestureRecognizerStateBegan) {

        [path moveToPoint:currentPoint];

    } elseif (pan.state ==UIGestureRecognizerStateChanged) {

        [pathaddQuadCurveToPoint:midPoint controlPoint:previousPoint];

    }

    previousPoint = currentPoint;

    [selfsetNeedsDisplay];

}

第三步:画出轨迹

- (void)drawRect:(CGRect)rect

{ [[UIColor redColor] setStroke];

  [path stroke];

}

(PS:黑色框框里面的是截屏得到的图)


最后一步:加上擦除 和截屏的方法,这边不重要了,根据需要自行添加!

//擦除签名

- (void)erase {

    path = [UIBezierPathbezierPath];

    [selfsetNeedsDisplay];

}

//UIIamge存储到相册中的代码

//UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);

//屏幕截图功能,这里不重要,为的是绘图完成后生产UIImage并存储下来

- (UIImage *)signatureImage

{  UIImage *screenshot = [selfscreenshotWithQuality:1.f];

    return screenshot;

}

- (UIImage *)screenshotWithQuality:(CGFloat)imageQuality {

    // 创建一个基于位图的上下文(context,并将其设置为当前上下文(context)

    UIGraphicsBeginImageContext(self.bounds.size);

    // 呈现的快照视图层次到当前上下文

    if([selfrespondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]){

        [selfdrawViewHierarchyInRect:self.boundsafterScreenUpdates:NO];

    }else{

        [self.layerrenderInContext:UIGraphicsGetCurrentContext()];

    }

    UIImage *image =UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    // 压缩比例计算

    NSData *imageData = UIImageJPEGRepresentation(image, imageQuality>0?imageQuality:0.75f);

    image = [UIImage imageWithData:imageData];

    return image;

}













  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值