UIKit Dynamics框架

前言:

UIKit Dynamics是iOS7.0新增的一组类和方法,可以赋予UIView逼真的行为和特征,从而改善用户体验。

要实现动态行为,需要先创建一个UIDynamicAnimator(力学动画生成器)的实例对象。对于每个力学动画生成器都可以使用各种属性和行为进行定制,如重力、碰撞检测、密度、摩擦力等。

有6个用于定制UIDynamicAnimator的类:UIAttachmentBehavior、UICollisionBehavior、UIDynamicItemBehavior、UIGravityBehavior、UIPushBehavior和UISnapBehavior。

1.重力

UIDynamicAnimator *animation = [[ UIDynamicAnimator alloc ]initWithReferenceView: self.view]; // 创建力学动画生成器

UIGravityBehavior * gravityBehavior = [[[UIGravityBehavior alloc] initWithItems:@[frogImageView]] autorelease];//创建重力行为对象,其中frogImageView是需要实现动画的视图,是self.view的子视图

[gravityBehavior setXComponent:0.0 yComponent:0.1];//设置方向和作用力(1.0为地球的重力加速度)

[animator addBehavior:gravityBehavior];//添加行为

注:动态物体必须是参考视图的子视图,否则力学动画生成器不会生成任何动态效果!

在UIKit Dynamics中,重力的方向可以不向下,如果将参数yComponent设置为负数,重力方向就会向上;同样可以改变xComponent。

2.碰撞

UICollisionBehavior是创建碰撞行为,和重力行为创建方式一样,使用受影响的视图进行初始化。除了受影响的视图外,还需要设置碰撞对象:UICollisionBehaviorModeItems导致物体相互碰撞;UICollisionBehaviorModeBoundaries导致物体不相互碰撞,只与边界发生碰撞;UICollisionBehaviorModeEverything导致物体既相互碰撞,又与边界碰撞。

要是物体与边界碰撞,必须要自定义边界。边界可以是NSBezierPath,也可以是两点之间,分别用addBoundaryWithIdentifier:forPath和addBoundaryWithIdentifier:fromPoint:toPoint进行设置;将UICollisionBehavior对象的translatesReferenceBoundsIntoBoundary设置为YES就是默认手机屏幕为边界。

UIDynamicAnimator *animation = [[ UIDynamicAnimator alloc ]initWithReferenceView: self.view]; // 创建力学动画生成器

UIGravityBehavior * gravityBehavior = [[[UIGravityBehavior alloc] initWithItems:@[frogImageView]] autorelease];//创建重力行为对象

[gravityBehavior setXComponent:0.0 yComponent:0.1];

UICollisionBehavior *collisionBehavior = [[[UICollisionBehavior alloc] initWithItems:@[frogImageView] ]autorelease];//创建碰撞行为对象

collisionBehavior.translateReferenceBoundsIntoBoundary = YES;//设置边界

[collisionBehavior setCollisionMode:UICollisionBehaviorModeBoundaries]; //设置碰撞对象

[animator addBehavior:gravityBehavior];//添加行为

[animator addBehavior:collisionBehavior];//添加行为

UICollisionBehavior对象还可以设置代理。有4个代理方法,其中两个是碰撞开始时调用,两个是碰撞结束时调用。所有方法都指向碰撞对象,碰撞开始的方法中还指出了接触点,一个CGPoint。

3.连接

UIAttachmentBehaviors可以指定两个物体之间动态连接,让一个物体的行为和移动受制于另一个。默认情况下,UIAttachmentBehaviors是将两个物体的中心点作为连接点,但是可以修改为任何一点。

UIDynamicAnimator *animation = [[ UIDynamicAnimator alloc ]initWithReferenceView: self.view]; // 创建力学动画生成器

UICollisionBehavior *collisionBehavior = [[[UICollisionBehavior alloc] initWithItems:@[frogImageView,secondImageView ] ]autorelease];//创建碰撞行为对象

collisionBehavior.translateReferenceBoundsIntoBoundary = YES;//设置边界

[collisionBehavior setCollisionMode:UICollisionBehaviorModeBoundaries]; //设置碰撞对象

CGPoint frogImageViewCenter = frogImageView.center;//获取中心点

self.attachmentBehavior = [[[UIAttachmentBehavior alloc] initWithItem:secondImageView attachedToAnchor:frogImageViewCenter] autorelease];

[animator addBehavior:collisionBehavior];

[animator addBehavior:self.attachmentBehavior];

这样两个视图就连接在了一起,连接物的长度是两个视图的初始距离。但此时frogImageView还不会移动,所以可以添加一个简单的手势。在frogImageView移动时更新中心点并且重新设置锚点:

- (viod)handleAttachmentGesture:(UIPanGestureRecognizer *)gesture {

CGPoint gesturePoint = [gesture locationInView:self.view];

frogImageView.center = gesturePoint;

[self.attachmentBehavior setAnchorPoint:gesture];

}

UIAttachmentBehavior还可以修改其他属性,如振动频率和阻尼。

[self.attachmentBehavior setFrequency:1.0];//设置振动频率

[self.attachmentBehavior setDamping:0.1f]; //设置震动峰值

[self.attachmentBehavior setLength:100.0f]; //设置运动后的距离

4.吸附

UISnapBehavior只能关联一个视图,初始化时必须指定运动的终点。这种行为是由请按手势触发的。

CGPoint point = [gesture locationInView:self.view];

UIDynamicAnimator *animation = [[ UIDynamicAnimator alloc ]initWithReferenceView: self.view]; // 创建力学动画生成器

UISnapBehavior *snapBehavior = [[[UISnapBehavior alloc] initWithItem:frogImageView snapToPoint:point] autorelease];

snapBehavior .damping = 0.75;//设置物体吸附时的弹跳力度

[animator addBehavior : snapBehavior];

5.推力

UIPushBehavior的使用比其他行为稍复杂。主要属性有力度(magnitude)和角度(angle)。

UIPushBehavior *pushBehavior = [[[UIPushBehavior alloc] initWithItems:@[frogImageView] mode: UIPushBehaviorModeInstantaneous] autorelease];//mode属性有两种,一种是瞬时里,一种是持续力

以屏幕中心为参考点,添加手势作为施加的力,里中心点越远,作用力越大。

计算距离和角度,使用self.pushBehavior setMagnitude:和self.PushBehavior setAngle:设置。最后[self.pushBehavior setActive:TRUE];

6.物体属性

UIDynamicItemBehavior可以用来修改物体的属性。初始化方法和其他行为大同小异,主要是设置UIDynamicItemBehavior对象的属性。 

allowsRotation:一个Boolean值,指定物体在受力时是否会旋转,默认为YES。

angularResistance:一个CGFloat值,取值范围为0.0~CGFLOAT_MAX;指定旋转阻力,其值越大,旋转速度下降越快。

density:物体密度。默认情况下100X100点的物体质量为1.0,100X200的物体质量为2.0。调整密度会影响重力和碰撞效果。

elasticity:取值范围为0.0~1.0,表示与其他物体碰撞时的弹性。0.0表示没有弹性,1.0表示反弹作用力和碰撞作用力相等。

friction:物体之间的滑动阻力。0.0表示没有阻力,1.0表示阻力很大,但可将该值设置大于1的某个值继续增加阻力。

resistance:空气阻力,取值范围为0.0~CGFLOAT_MAX。0.0表示没有空气阻力,1.0表示一旦其他力消失物体就会停下来。

7.其他属性和代理方法

UIDynamicAnimator都是使用addBehavior:添加行为,也可以使用removeBehavior:和removeAllBehavior删除行为,还可以通过behavior属性查看关联的行为,将会返回一个数组。还可以查询动画生成器是否在运行(running属性),更可以使用elapsedTime属性查询运行时长。UIDynamicAnimator还有一个代理(UIDynamicAnimatorDelegate),他包含两个代理方法,分别是处理暂停和继续的方法。开发人员不能主动暂停UIDynamicAnimator。

-(viod)dynamicAnimatorDidPause:(UIDynamicAnimator *)animator {

        NSLog(@"Animator did pause");

}

-(viod)dynamicAnimatorWillResume:(UIDynamicAnimator *)animator {

NSLog(@"Animator will resume");

}

总结:以上是UIKit Dynamics的基本知识和组成部分,主要还是依赖于开发人员的创意。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容