SquareEngineeringBlog有一篇很棒的文章为Android带来更流畅的签名,但我没有找到任何与iOS相关的报道。那么,在iOS设备上捕获用户签名的最佳方式是什么?虽然我找不到关于签名捕获的文章,但应用商店中已经有一些应用程序可以很好地实现签名捕获。我的目标用户体验是通过53实现与iPad应用程序Paper相同的效果(它是一款具有漂亮且反应灵敏的画笔的绘图应用程序)。本文的所有代码都可以在Github存储库SignatureDemo中找到。连接点的最简单方法是捕获用户的触摸点并用直线将它们连接在一起。在UIView子类的初始化方法中,创建用于捕获触摸事件的路径和手势识别器。//创建连接点的路径path=[UIBezierPathbezierPath];//捕捉触摸UIPanGestureRecognizer*pan=[[UIPanGestureRecognizeralloc]initWithTarget:selfaction:@selector(pan:)];pan.maximumNumberOfTouches=pan.minimumNumberOfTouches=1;[selfaddGestureRecognizer:pan];捕获pan手势的触摸点,通过连接放入贝塞尔路径:-(void)pan:(UIPanGestureRecognizer*)pan{CGPointcurrentPoint=[panlocationInView:self];if(pan.state==UIGestureRecognizerStateBegan){[pathmoveToPoint:currentPoint];}elseif(pan.state==UIGestureRecognizerStateChanged)[pathaddLineToPoint:currentPoint];[selfsetNeedsDisplay];}绘制路径:-(void)drawRect:(CGRect)rect{[[UIColorblackColor]setStroke];[pathstroke];}上图是用这种技巧绘制的字母“J”,同时也暴露了一些问题:在速度较慢的情况下,iOS可以捕捉到足够多的触摸点,所以看起来更平滑,但稍快的移动导致触摸点之间的间距较大,并且签名似乎由直线段连接。2012年Apple开发者大会有一个名为创建高级手势识别器的会议,该会议使用一点数学来解决这个问题。二次贝塞尔曲线我们使用二次贝塞尔曲线连接点,而不是使用线段连接触摸点,使用上述WWDC会议(位于42:15)中讨论的技术。使用二次贝塞尔曲线连接触摸点,使用触摸点作为控制点,中间点作为起点和终点。之前的代码添加二次曲线需要存储之前的触摸点,所以添加一个实例变量:CGPointpreviousPoint;并创建一个函数来计算两点的中点:staticCGPointmidpoint(CGPointp0,CGPointp1){return(CGPoint){(p0.x+p1.x)/2.0,(p0.y+p1.y)/2.0};}更新平移手势处理器并将直线替换为二次曲线:-(void)pan:(UIPanGestureRecognizer*)pan{CGPointcurrentPoint=[panlocationInView:self];CGPointmidPoint=midpoint(previousPoint,currentPoint);if(pan.state==UIGestureRecognizerStateBegan){[pathmoveToPoint:currentPoint];}elseif(pan.state==UIGestureRecognizerStateChanged){[pathaddQuadCurveToPoint:midPointcontrolPoint:previousPoint];}previousPoint=currentPoint;[selfsetNeedsDisplay];}grefbd6a2d7175616472617469632e706e67,但我们没有重写太多代码已经看到了巨大的差异。触摸点不再可见,但捕捉签名仍然有点乏味。每条曲线都是一样的宽度,与实际用笔签名的感觉不符。可变线宽基于触摸速度,可变宽度允许创建更自然的笔触。UIPanGestureRecognizer已经包含一个名为velocityInView:的方法,它接受一个CGPoint并返回当前触摸的速度。为了呈现可变宽度的笔画,我切换到OpenGLES和一种称为曲面细分的技术(OpenGL支持绘制线条,但iOS不支持平滑过渡的可变宽度)。沿曲线的二次点也需要计算,但这超出了本文的范围。另请查看Github上的源代码以了解详细信息。给定两个点,计算一个垂直向量,其大小设置为当前厚度的一半。基于GL_TRIANGLE_STRIP的性质,只需要两个点来创建下一个具有两个三角形的矩形。下面是一个视觉上吸引人且非常自然的签名,使用二次贝塞尔曲线创建并根据速度调整笔触粗细。原文出处:JASONHARWIG翻译出处:nixzhu(@nixzhu)
