【篮球】iOS开发之UI基特(Kit) Dynamics学习心得

每当iOS7上新添了UI基特Dynamic,它可以让UIView模拟逼真的大体功效。如引力,碰撞,弹簧,吸附等功用,有了这些力量会轻轻松松的增进使用之用户体验。想假诺促成这多少个力学动画效果,首先使创建一个力学动画生成器(UIDynamicAnimator),然后下各样行为举办定制,可用来定制UIDynamicAnimator的所作所为的接近有:UIAttachmentBehaviorUICollisionBehaviorUIGravityBehaviorUIDynamicItemBehaviorUIPushBehaviorUISnapBehavior篮球,。他们力所能及与UIView逼真的表现与动画片。

“喏,你看这~”他聚了头,看到它们手里的一定量摆放电影票。“听说那电影可以,我同本身闺蜜说说,看它要无设同本人失去。”“这尔告知我提到嘛?!”“如若它无空,就您陪自己错过呗~”他拉开一段距离斜眼看正在它,说道:“原来自己是一备胎啊!”她扑哧一乐,拿起他的手:“你嘛~是本身交的备胎,爱情之发动机。”

NOTE:每个力学动画生成器都是单身的,多单动画力学生成才可又运行。要于力学动画生成器持续运行,必须使暴发指为它的可行运用。一旦动画处于平稳状态(如弹簧效果苏醒原状)之后,力学动画生成器将中止,不以履其余总计了。可是对于未用之力学动画生成器,最好拿她去掉。

       《他说了》

浮动一个力学动画生成器

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

16岁,他见状操场及其如男孩一样打在篮球,他说了“切”;18春秋,她打趣地游说而考上同一所高等高校就是承诺他,他说了“嗯”;20载,急性化脓性乳腺炎的它们如他背着回家,他说了“好”;25秋,他错过与其底婚礼,另一个夫让她戴上研商戒,她对角落里之异说“你早已休以乎自我了,所以自己也如立即将来。”他沉默不告。这等同次于,他说了异常。

重力(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];

它们三月2号生日。“假设您于自身生日前100龙天天坚贞不屈送自己一样朵玫瑰,送满100棵

连接(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就入手撸吧!