iOS开发之UIKit Dynamics学习心得

  反正已偷偷喜欢了您一年,再思念一年又何妨?

在iOS7上新增添了UIKitDynamic,它能够让UIView模拟逼真的大体成效。如动力,碰撞,弹簧,吸附等职能,有了那个效应能自在的增长利用的用户体验。想要完成这一个力学动画效果,首先要开创一个力学动画生成器(UIDynamicAnimator),然后利用各个表现开展定制,可用以定制UIDynamicAnimator的行事的类有:UIAttachmentBehaviorUICollisionBehaviorUIGravityBehaviorUIDynamicItemBehaviorUIPushBehaviorUISnapBehavior。他们可以给予UIView逼真的作为和卡通片。

  

NOTE:每种力学动画生成器都以独立的,几个动画力学生成才可同时运行。要让力学动画生成器持续运行,必须要有指向它的实惠采纳。一旦动画处于平稳状态(如弹簧效果苏醒原状)之后,力学动画生成器将中断,不在执行其余计算了。但是对于未用的力学动画生成器,最好把它删除掉。

  ——安七七

变更一个力学动画生成器

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

  ②懵懂十七岁

重力(UIGravityBehavior)

动力的听从如图所示:

对此动力行为,须要专注的有角度(angle)和量级(magnitude,小编也叫它引力加快度),完毕代码如下:

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

  

碰撞(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];

  

连接(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];
}

  于扬,于扬,于扬……

弹簧

弹簧效果应该都懂,先看看效果:

弹簧效果其实是在一而再效果上完成的,恰当设置连接效果的Frequency,Damping那二个天性后就可以达标弹簧的作用了,在上头的代码加上:

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

  

吸附(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];
}

  遇见你以往,小编的脑子里唯有那三个字。

推力

推力指得是足以对实体施加推力,效果:

作者用了一个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];
}

  

实体属性

物体都有过多的特性,通过对其配备,可以高达不相同的机能,上边是局地常用的品质:

属性 描述
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表示一旦其他作用力消失,物体就会停止

  

总结

小说代码Demo点这里
UIDynamicAnimator还有代理方法和任何的小方法,真正发挥它的功效力的是您的新意,有好的ideal就出手撸啊!

  于扬他好帅,

  于扬他好棒,

  于扬他篮球打的专门棒,

  于扬是学校最受欢迎的男子,

  不言而喻,于扬他很可观……

  那是大家班所有女孩子对他的相同评价。

  坏的她一样都不曾,好的他全占。

  他就是这么完美。

  

  可惜完美的人连续期待不可及,他如同璀璨的繁星,那么强烈,却永远触及不到。

  

  走路不小心撞到了你,作者会低下头迅速说着对不起,因为自个儿不敢正视你,作者怕本身会脸红,因为我悄悄的敬重着你。

  

  吃饭不小心洒在您身上作者会迅速给你擦干净,然后立刻掉头离开,因为笔者怕您会看到小编的慌张。

  

  上课偷偷瞄你,你看过来时,小编会快速转头假装望着窗外看,作者怕您会意识我跳动的灵魂。

  

  我得以和您的好男生称兄道弟,打成一片,却根本不曾和您体贴过,没有说过一句话,因为,看到您自作者整个神经都会混杂。

  

  

图片 1

  小编羡慕这么些三秒和您闹成一团的女孩子,小编羡慕他们能够毫无顾忌的和你玩,和您疯,和您闹,和您安心乐意的闲话,小编好羡慕。小编每每想,为何他们得以,可小编却连站在您面前看你一眼的胆气都尚未。

  

  小编直接找原因,找化解的点子,不过,一向没找到……

  

  听大人说,拿到四叶草的人会赢得幸福,于是小编便寻遍了高校,找到了两颗,以为这样幸福就会光顾。

  

  

  作者骨子里的将它交给一个小编觉得无话不谈的好爱人,让他帮作者转交给您。

  

  可是……

  

  安七七好丑,

  安七七好不要脸,

  安七七好以卵击石,

  安七七是或不是脑部坏了,

  安七七当成异想天开……

  那是人家对七七和对此扬截然相反的褒贬。

  

  对呀,灰姑娘怎么去配特出的皇子。

  你受万人敬仰,而作者只是默默小丑。

  

  不过,四叶草依然送到了您手中,小编傻傻的想,可能你也是喜欢自身的。

  对吧?于扬!

  那是本人懵懵懂懂的十七岁。

  体会到了在暗恋的乌黑和不堪中寻到了一丝期待与光线的幸福感。

  因为本身有四叶草。

  

  

图片 2

  不过,于扬,为啥,你突然不见了,是转学了呢?转到哪儿去了?大家还会再相会吗?

  

  自此,作者对您的暗恋变成了对你的悬念,一贯从未忘记您。

  

  这一年十分长,很短,不长……

  就如一个世纪,作者迟迟没有你的别的联系形式,也绝非听到过有关您的其他新闻。

  没有你的QQ,没有您的对讲机,没有您的地方。

  

  你好似人间蒸发了平等,消失的彻彻底底。

  

  可自我依然抱着一丝期待,等着您的出现。

  

  别忘了,作者有四叶草呢!

  有朝一日,作者会再度相见你……

图片 3