iOS开发之UIKit Dynamics学习心得

碰撞(UICollisionBehavior)

说到打,一个凡体之间的撞击,一个是暨境界的磕碰,在方的重力作用演示图中,足球从达沾下,一直获得到屏幕外,这是由我们从未叫他安装边界。我们看碰撞的功用图:

自我受图备受之篮球足球安了重力作用和碰撞效果,代码如下:

UIGravityBehavior *gravityBehavior = [[UIGravityBehavior alloc] initWithItems:@[self.footballView,self.basketballView]];
[gravityBehavior setAngle:3.14/2 magnitude:0.1f];   
//碰撞效果
UICollisionBehavior *collisionBehavior = [[UICollisionBehavior alloc] initWithItems:@[self.footballView,self.basketballView]];
[collisionBehavior setCollisionMode:UICollisionBehaviorModeEverything];//碰撞效果,必须指定的
/**
 *  UICollisionBehaviorModeEverything:物体既相互碰撞又与边界碰撞
 *  UICollisionBehaviorModeBoundaries:物体不相互碰撞,只与边界碰撞
 *  UICollisionBehaviorModeItems:物体相互碰撞,不与边界碰撞
 */
//设置边界为动画器参考view的视图范围
collisionBehavior.translatesReferenceBoundsIntoBoundary = YES;
//代理可以监听碰撞
collisionBehavior.collisionDelegate = self;
[self.animator addBehavior:gravityBehavior];
[self.animator addBehavior:collisionBehavior];

自己无比知心的:
无意,我去本乡马来西亚暨中国与比赛一度发生一个星期了。在这段时间里,我训练得深辛苦,而且要是练身体。教练用自制的宏大沙袋狠狠撞击我们的浑身,犹其是满头,每天训练下来,我们还被遇上得晕头转向,辩不到底东南西北。而教练却说这样的强度还低中国球员在场上轻微的人接触。老天,想起这些当成让人咋舌。
  你了解,对于足球,我结完全都是单门外汉。原来在爱妻的时候,我整天忙于在渔村里吃家补渔网或者虽到海边去捡点小鱼小虾来维持一家口的生涯。虽然生活了得杀贫穷,但也从发生乐趣。可恨的是您父亲听说国奥队于当众征招高个子后卫就推荐了我,让我不得不抛妻别子,去到什么足球赛。现在测算,这也坏不得别人,谁叫自己长得那高呢,虽然只是出1米65,但总归是我国之首先高度啊。我看见他们便情不自禁地全身发抖。偷偷观看了他们的训练后自己越来越吓得打屁都非化个数。可能而无法想像,假如到了场上怎样顶头球,我之所以一味吃奶的力跳起来无比多只能齐及他们的肚脐!
  但是,奇迹出现了。这个震惊世界的福音你明白了啊,我们盖1:1战平了盛气凌人的中国队!
  比赛刚结束,我来不及去洗澡就径直奔回宾馆提笔给你写信--实际上也用不着去洗澡,说来你可能还未信赖,虽然踢满全场但自我浑身毛毛汗都没有发生同样珠子,中国队之莽汉们踢得极度斯文太儒雅了,仿佛就是于球场上上演我们都当平总理老影片里看了之她们国家古代之宫庭舞!
  说实话,刚上的早晚咱们好得生。我们是暨中国队的球员破成稀实践一起进场的,用不着记者的弹射,我们好尚且打卑得使杀,全场的3万差不多球迷热情之也罢主队欢呼,希望他们国奥队能很强我们。我之队友黑娃儿,就是咱们镇上那个在农贸市场收地摊费的枪炮,当时即使哼得尿了裤子,被抬来了会。我顾也引起下腰装从阑尾炎发了,想溜下场。但训练威胁自己,如果是的确的马上就是下手到诊所失去剖腹。没有辙,我只有刚起头皮上。
  我之天职是瞄对方个子高的开路先锋。当他俩上过来的下自己跟他粘了过去,我抬头向上同一瞧,天什么,他是何其大啊,就如传说被能够掀起翻几条战船的海神。我只能打即他的心坎,我们绕于同,就像一个婴儿以母亲的怀中找奶吃。
  但叫我吃惊的凡,我凝视的这大个子完全没有一点脾气,在场上软绵绵慢吞吞,不但跳起来没有自己站方高,反而是自家不怎么用某些马力,他就算轰的一声倒在非法将绿地砸出一个大坑。特别是他俩的中场球员,拿到球后未是回传过我们,就是起高球往禁区里挂,但是若或不知道,有你女婿是“彪形大汉”在后防线上的袭扰,他们的头球都交歪了。后来还是乘自己飞至场边喝矿泉水的早晚(忘了告知你,下场的当儿自己背后揣了几瓶子,准备为你带回家。但你莫能够让你娘家的人数说,到时怕分不够)他们的前卫才幸运撞了平等粒球上。
  下半场,他们还要重新换了阵容。他们像猴子一样在自我之先头跳来窜去,但本身从未理睬他们,他们白跳了阵阵继好就是泄了欺凌,然后于接入下的竞赛中我们决定了场上局面,并防守反击偷袭进了一个圆球。
  比赛就是这么让人怀疑地收了。由于这会较量表现出色,我取了500马币的奖金(100马币=0•05长人民币),下来后自抢把钱藏于了内裤包里。
  亲爱的,有了这笔钱,我们不仅可拿咱的茅草屋变成瓦房,而且还足以去置办同一部车子,全家人搭在去赶集。
  好好在家等正在吧,我快即见面回来了!愿真主保佑我们全家人!
公的哈曼
2004年3月20日

NOTE:每个力学动画生成器都是独立的,多单动画力学生成才可同时运转。要叫力学动画生成器持续运行,必须要出仗于它们的管事采取。一旦动画处于平稳状态(如弹簧效果恢复原状)之后,力学动画生成器将刹车,不在履外计算了。但是对于不用之力学动画生成器,最好拿她去掉。

转变一个力学动画生成器

UIDynamicAnimator *animator =[ [UIDynamicAnimator alloc] initWithReferenceView:self.view];//行为视图的父视图必须是动画生成器的参考视图
[animator addBehavior:aDynamicBeahvior];//aDynamicBeahvior是一个行为

吸附(UISnapBehavior)

抽功能小像磁铁吸铁块一样,只要我们指定一个沾,具有吸附功能的物体即使时有发生矣深受磁铁吸过去的效果了。

咱俩在屏幕及指定一个tap手势,讲tap晚的触及作为磁铁,代码:

self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
self.tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handTapGesture:)];
[self.view addGestureRecognizer:self.tapGesture];

- (void)handTapGesture:(UITapGestureRecognizer *)gesture{
    CGPoint point = [gesture locationInView:self.view];
    if (self.snapBehavior == nil) {
        self.snapBehavior = [[UISnapBehavior alloc] initWithItem:self.footballView snapToPoint:point];
        self.snapBehavior.damping = 0.75;
    }
    [self.animator addBehavior:self.snapBehavior];
}

在iOS7达到新加了UIKit
Dynamic,它亦可让UIView模拟逼真的大体功能。如重力,碰撞,弹簧,吸附等功效,有了这些效应能自在的滋长运用之用户体验。想如果兑现这些力学动画效果,首先要创造一个力学动画生成器(UIDynamicAnimator),然后下各种表现开展定制,可用来定制UIDynamicAnimator的所作所为之好像有:UIAttachmentBehaviorUICollisionBehaviorUIGravityBehaviorUIDynamicItemBehaviorUIPushBehaviorUISnapBehavior。他们会给UIView逼真的行为同卡通片。

体属性

物体都来诸多之性能,通过对其配置,可以达标不同之效用,下面是部分常用之习性:

属性 描述
elasticity 表示与其他物体碰撞时的弹性,取值0-1,0表示没有弹性,1表示反弹作用力与碰撞作用力相等
allowsRotation 指定物体在受力时是否会旋转,默认YES
angularResistance 旋转助力,值越大旋转下降得越快,取值为0-CGFLOAT_MAX
density 物体的密度,调整密度会影响重力和碰撞的效果。默认情况下,100×100的物体质量为1,100×200为2
friction 物体之间的滑动阻力,0表示没有摩擦力,1表示摩擦力很大
resistance 空气阻力,取值为0-CGFLOAT_MAX,0表示没有空气阻力,1表示一旦其他作用力消失,物体就会停止

连接(UIAttachmentBehavior)

接连就是为一个体的作为及走于另外一个物体的走。使用连接效果使指定连接点。效果大概如下:

在上头的效力演示图中,我加加了一个pan手势,然后取pan的坐标点让其化篮球center,在连年效果的打算下,足球会由于篮球的走如果动,具体代码如下:

self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];

UICollisionBehavior *collisionBehavior = [[UICollisionBehavior alloc] initWithItems:@[self.footballView,self.basketballView]];
[collisionBehavior setCollisionMode:UICollisionBehaviorModeEverything];
collisionBehavior.translatesReferenceBoundsIntoBoundary = YES;

CGPoint basketballCenter = CGPointMake(self.basketballView.center.x, self.basketballView.center.y);
self.attachmentBehavior = [[UIAttachmentBehavior alloc] initWithItem:self.basketballView attachedToAnchor:basketballCenter];

[self.animator addBehavior:collisionBehavior];
[self.animator addBehavior:self.attachmentBehavior];

self.panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handAttachmentesture:)];
[self.view addGestureRecognizer:self.panGesture];

- (void)handAttachmentesture:(UIPanGestureRecognizer *)gesture{
    CGPoint gesturePoint = [gesture locationInView:self.view];
    self.basketballView.center = gesturePoint;
    [self.attachmentBehavior setAnchorPoint:gesturePoint];
}

总结

章代码Demo点这里
UIDynamicAnimator足球还有代理方与其它的略微方法,真正发挥它的作用力的是你的新意,有好之ideal就着手撸吧!

弹簧

弹簧效果应都知道,先看看效果:

弹簧效果实在是于接连效果及落实的,恰当设置连接效果的Frequency,Damping旋即第二单特性后就得直达弹簧的效益了,在上面的代码加上:

[self.attachmentBehavior setFrequency:1.0f];//振动频率
[self.attachmentBehavior setDamping:0.1f];//熨平动画的峰值

重力(UIGravityBehavior)

重力的法力如图所示:

对重力行为,需要小心的出角度(angle)和量级(magnitude,我啊被它重力加速度),实现代码如下:

UIGravityBehavior *gravityBehavior = [[UIGravityBehavior alloc] initWithItems:@[footballView]];
 //angle:角度(弧度)  magnitude:量级(重力系数)
[gravityBehavior setAngle:3.14/2 magnitude:0.1f];
[self.animator addBehavior:gravityBehavior];

推力

推力指得是足以本着体施加推力,效果:

自于是了一个tap手势作为施加推力的源于,代码如下:

self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];

UICollisionBehavior * collisionBehavior = [[UICollisionBehavior alloc] initWithItems:@[self.footballView]];
[self.animator addBehavior:collisionBehavior];

UIPushBehavior *pushBehavior = [[UIPushBehavior alloc] initWithItems:@[self.footballView] mode:UIPushBehaviorModeInstantaneous];
pushBehavior.angle = 0.0;
pushBehavior.magnitude = 0.;

self.pushBehavior = pushBehavior;
[self.animator addBehavior:self.pushBehavior];

self.tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handTapGesture:)];
[self.view addGestureRecognizer:self.tapGesture];

- (void)handTapGesture:(UITapGestureRecognizer *)gesture{
    CGPoint point = [gesture locationInView:self.view];
    CGPoint origin = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds));
    CGFloat distance = sqrtf(powf(point.x-origin.x, 2.0) + powf(point.y-origin.y, 2.0));
    CGFloat angle = atan2(point.y-origin.y, point.x-origin.x);
    distance = MIN(distance, 100.0);
    [self.pushBehavior setMagnitude:distance/100.0];
    [self.pushBehavior setAngle:angle];
    [self.pushBehavior setActive:true];
}