仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1254|回复: 19
打印 上一主题 下一主题

[学习教程] IOS编程之在iOS上绘制天然的署名仓酷云

[复制链接]
小女巫 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:37:05 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
对应sql里的tableNSPredicate谓语类似select语句中的条件上面这三个类就可以用来请求数据了这里有一篇很棒的文章写怎样在Android上猎取流利的署名:SmootherSignatures,可是我没有找到一篇是写在iOS上怎样完成。那末,事实怎样做才干在iOS设备上猎取用户的署名呢?
固然我没有找就任何干于猎取署名的文章,可是在Appstore上已有了完成得很好的app。Paperby53是一个画画的iPad使用程序,它具有大度而且敏捷的画笔,这也是我所要寻求的用户体验。
代码能够从这里失掉:SignatureDemo
连点成线

<br>
最复杂得举措是,顺次猎取触摸点而且用直线把它们连起来。
在UIView子类的初始化办法中创立path和用于捕捉触摸事务的gesturerecongnizer.
  1. //Createapathtoconnectlinespath=[UIBezierPathbezierPath];//CapturetouchesUIPanGestureRecognizer*pan=[[UIPanGestureRecognizeralloc]initWithTarget:selfaction:@selector(pan:)];pan.maximumNumberOfTouches=pan.minimumNumberOfTouches=1;[selfaddGestureRecognizer:pan];
复制代码
将捕捉到的pan事务location数据顺次到场到贝塞尔path中,连点成线。
  1. -(void)pan:(UIPanGestureRecognizer*)pan{CGPointcurrentPoint=[panlocationInView:self];if(pan.state==UIGestureRecognizerStateBegan){[pathmoveToPoint:currentPoint];}elseif(pan.state==UIGestureRecognizerStateChanged)[pathaddLineToPoint:currentPoint];[selfsetNeedsDisplay];}
复制代码
画出轨迹
  1. -(void)drawRect:(CGRect)rect{[[UIColorblackColor]setStroke];[pathstroke];}
复制代码

<br>
用这类办法画个字母J就表露出一些成绩了。
当署名速率较慢时,iOS能够捕捉到充足的touch地位信息,让毗连起来的直线看起来不那末分明。可是当手指挪动速率很快时就有贫苦了。
在2012苹果开辟者年夜会中先容的BuildingAdvancedGestureRecognizers提到,能够用数学来办理这个成绩。
二次贝塞尔曲线

<br>
我们必要用二次贝塞尔曲线往毗连那些触摸点,而并不是用直线,能够参考下面给出的苹果开辟者年夜会视频(约莫在42:15处)。毗连二次贝塞尔曲线时,应把触摸点看成把持点,而取中点为对应的出发点和尽头。
增加二次贝塞尔曲线到之前的代码中,必要用到上一次的touch信息,以是我们增添一个实例变量来存储它。
  1. CGPointpreviousPoint;
复制代码
写一个盘算2点中点的办法
  1. staticCGPointmidpoint(CGPointp0,CGPointp1){return(CGPoint){(p0.x+p1.x)/2.0,(p0.y+p1.y)/2.0};}
复制代码
更老手势处置,用二次贝塞尔曲线交换失落之前的间接毗连处置
  1. -(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];}
复制代码

<br>
没有写良多代码,我们就看到了很年夜的变动。棱角不见了,可是作为署名仿佛有点有趣。每处曲线都是等宽的,和用一只真实的钢笔签出来的署名效果相违反。
可变的笔刷宽度
笔刷的宽度应当基于署名的速率而变更,如许的署名看起来才天然。UIPanGestureRecognizer有一个velocityInView办法能够前往以后触摸点的速率。
为了画出变更的宽度,我改用OpenGLES曲面细分将笔刷转换成三角序列(OpenGL撑持画线,可是iOS不撑持绘制光滑的可变宽度的线条)。二次贝塞尔曲线点必要从头盘算,可是这超越了这篇文章的会商范围,详细能够检察代码:github

我当时刚学iOS开发的时候一样的感觉总想知道原理内部怎么回事感觉在像在雾里但是iOS开发就是这样他是封闭的本身就是在雾里...
小女巫 该用户已被删除
沙发
 楼主| 发表于 2015-3-26 15:44:34 | 显示全部楼层
边吃零食边看Stanford的视频教程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-15 16:13

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表