补作业 - Dynamic Animator

UIDynamicAnimator :为我们提供了一些基于物理学的动画,让我们更容易的做出一些与现实世界(物理行为)相符的逼真的二维动画。

iOS 7 之后,Apple 给我们提供了一个与物理学相关(physics-related)的 API,与之相关的有两个类和一个协议:

  • UIDynamicAnimator - 动画生成器,我们只需配置好属性并提交给它,其余的由它去做。
  • UIDynamicBehavior - 一些物理学行为。它的子类提供了一些具体的物理学行为。
  • UIDynamicItem - 这是一个协议,只要遵循了这个协议的任何对象, 都可以成为UIDynamicAnimator动画的对象。UICollectionViewLayoutAttributes, UIDynamicItemGroup(iOS 9.0 +), UIView都遵循了这个协议。

一张图更好的理解:


UIDynamicAnimator

Demo

它像一个驱动类,它关联了遵守UIDynamicItem协议的可动画对象Item和行为Behavior,给动画的执行提供了上下文,之后动画的执行由它驱动。它有类似于集合的一些方法:- addBehavior:,- removeBehavior:,- removeAllBehaviors.

其中,需要注意的有几点:

  • 初始化方法:- initWithReferenceView:中传入的是参考view,而不是直接动画的view
  • 动画执行完毕后,可动画对象的一些属性会被改变而不会复原(frame、color、size and so on...)。所以,如果我们需要重复执行一个动画的话,我们需要在合适的时机重新设置这些值。

APIs

UIDynamicAnimatorAPI只有几个,如下:

UIDynamicAnimator

UIDynamicBehavior

提供动画行为的类。使用中我们更多的是直接使用他的子类。子类具体如图1所示。它的子类实现了各种物理学行为。具体可以查看每个子类的头文件。他们有几个通用的属性:

UIAttachmentBehavior

Discussion

UIAttachmentBehavior可以把两个view或者viewanchorPoint 关联起来。

APIs

它有一些自己的属性,其中比较重要的是:

  • damping: 阻尼,要和阻力做区分,当此值设置为1时,达到临界阻尼,到达临界阻尼后我们的动画便不再会有回弹的效果。
  • frequency: 频率,行为的频率,单位Hz,值越大,频率越高,动画过程越快,动画效果越不明显。
  • length: 关联的两个对象(viewview 或者 viewanchorPoint) 动画结束后两者锚点(anchor)之间的距离长度。
  • frictionTorque: 摩擦力矩,作用暂时不详。

demo

基于苹果爸爸强大的封装,我们可以很容易的实现下面的效果:

Attachment

完整的代码为:

UIAttachmentBehavior *attachment = [[UIAttachmentBehavior alloc] initWithItem:self.animationView attachedToItem:self.relyView];
attachment.damping = 0.5;
attachment.frequency = 1.f;
attachment.length = 80;
//    attachment.frictionTorque = 1.f;
attachment.action = ^{
   NSLog(@"%@",NSStringFromCGRect(self.animationView.frame));
};
[self.animator addBehavior:attachment];

你可以自己调整下参数,看看之后的效果。

UIGravityBehavior

Discussion

UIGravityBehavior模拟的是现实生活中的重力特性。

Gravity

APIs

能让我们自定义的API只有几个,其中:

  • gravityDirection: 重力方向。单位向量,默认是(0.0,1.0),即重力向下。重力坐标系和UIKit的一样。y轴向下为正,x 轴向左为正。如下:

UICollisionBehavior

Discussion

UICollisionBehavior模拟的是现实生活中的碰撞特性。在碰撞中,我们需要指定碰撞的边界,碰撞的边界可以是另一个view,可以是一个边界。如果我们没有指定边界的话, 并且也没有将参考视图作为边界,那么碰撞行为就不会发生。

Collision

APIs

  • collisionMode: 指定碰撞的边界类型。
  • translatesReferenceBoundsIntoBoundary: 把参考视图转化为碰撞的边界。
  • - addBoundaryWithIdentifier:forPath::指定一个贝塞尔路径作为碰撞边界,并给这个碰撞边界一个标记。
  • - addBoundaryWithIdentifier:fromPoint:toPoint:指定两个点之间的连线为碰撞边界。如果指定collisionModeUICollisionBehaviorModeItems,则设置这个属性无效。

UIPushBehavior

Discussion

UIPushBehavior可以对一个物体施加一个连续的或者瞬时的力,并改变物体的位置。

Push

APIs

  • UIPushBehaviorMode:推力的类型,枚举值。分为持续(UIPushBehaviorModeContinuous)和瞬时(UIPushBehaviorModeInstantaneous)。
  • angle: 推力的角度。
  • magnitude: 推力的大小。
  • pushDirection: 推力的方向,和UIKit 的坐标系相同。
  • active: 推力当前的状态,分为activeinactive.

SnapViewController

Discussion

UISnapBehavior模拟的是物体吸附的行为,并且伴有弹簧动画。

Snap

APIs

  • damping: 阻尼。
  • snapPoint: 和anchorPoint 的作用类似,代表的是当前Item的锚点位置。

UIDynamicItemBehavior

如果你不满足于上面的属性,那么UIDynamicItemBehavior给你提供了更多的选择。我们可以使用UIDynamicItemBehavior,来设置Item的更多属性。包括:

  • elasticity: 弹力。在0 ~ 1 之间,0代表无弹性,1代表弹性碰撞

  • friction: 摩擦力。

  • charge: 电荷。决定了物体和电场或者磁场之间的相互作用力。

  • density: 密度。决定了动力项的其他属性的表现,比如摩擦、碰撞等。

  • angularResistance: 角度阻力。有效范围在0 ~ CGFlOAT_MAX,值越大,在动力行为中物体越不容易旋转。

  • resistance: 阻力。动力项的线性阻力。有效值范围为0.0 ~ CGFLOAT_MAX

  • anchored: 是否固定锚点。如果这个值为YES,那么,当发生碰撞的时候,物体不会移动,但参与碰撞。效果类似于一个碰撞边界。

  • - addLinearVelocity:forItem:: 给物体增加一个线性速度。

  • - addAngularVelocity:forItem:: 给物体增加一个角速度。

  • allowsRotation: 值为 NO时,强制物体再发生碰撞之后不会旋转。

小结

这是 Apple 在 iOS 7推出的功能,在iOS 9之后增加了一些新的API。算是一个老功能,现在才研究起来算是补作业了。基本都是根据官方文档摸索着写的一个小Demo,实现了一些基本的小效果。更加炫酷的就需要靠强大的 idea 了。

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

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 概念介绍 UIDynamic从ios7才开始有的,其他2D仿真引擎:BOX2D:C语言框架,免费Chipmunk:...
    我是滕先生阅读 2,239评论 5 23
  • iOS 7增加了UIKit Dynamics库,其集成于UIKit框架中,将2D物理引擎引入了UIKit,提供了以...
    pro648阅读 2,785评论 2 14
  • 小马是一个热爱表现的人,各方面都非常积极,刘老板非常高兴,经常让他去做一些小事情。不过小马这个人嘴上说的厉害,但是...
    赵艳伟阅读 192评论 0 0
  • 坐于密密麻麻的人群中 感觉自己 就像是掉在油锅里被炸着的麻球 不能呼吸 不能吐气 感觉脑袋在一点点变大
    格伊阅读 151评论 0 0