首先思路是连点成线,用平移手势获取触摸点,并用线把他们连起来。具体步骤如下:
第一步:创建继承自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;
}