iOS7中的UIKit提供了一项新的功能,UIKit Dynamics,它提供了一个模拟真实世界中力学相关的动画和交互系统。比如重力、碰撞和吸附等。
这里先提供一个最简单的例子来学习它的使用方法:UIGravityBehavior-重力行为。
使用xcode5新建一个Single View Application的工程,在ViewController.h中,添加以下两个变量:
UIDynamicAnimator* _animator;
UIGravityBehavior* _gravity;
在ViewController.m中,viewdidload函数添加以下代码,
UIView *aview = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
aview.backgroundColor = [UIColor greenColor];
[self.view addSubview:aview];
_animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
_gravity = [[UIGravityBehavior alloc] initWithItems:@[aview]];
[_animator addBehavior:_gravity];
运行代码,现在
就可以看到最简单的物体下落的效果了,aview会下落到屏幕外消失不见。
-
UIDynamicAnimator
是 UIKit 物理引擎。这个类会记录你添加到引擎中的各种行为(比如重力),并且提供全局上下文。当你创建动画实例时,需要传入一个参考视图用于定义坐标系。
-
UIGravityBehavior
把重力的行为抽象成模型,并且对一个或多个元素施加作用力,让你可以建立物理交互模型。当你创建一个行为实例的时候,你需要把它关联到一组元素上,一般是一组视图。这样你就能选择受该行为影响的元素,在这个例子中就是指受重力影响的元素。
这里可以通过_gravity.gravityDirection来设置重力加速度的大小和方向,默认为(0,1);可以使用方法
[
_animator
addBehavior
:
_gravity
]来开始动画,同样可以使用
[
_animator
removeBehavior
:
_gravity
]来随时停止动画。
为了不让视图移出屏幕,可以给它添加一个边界。
ViewController,h添加一个变量:
//碰撞行为
UICollisionBehavior* _collision;
ViewController.m的viewdidload添加以下代码:
_collision = [[UICollisionBehavior alloc] initWithItems:@[aview]];
//设置边界为UIDynamicAnimator的ReferenceView的bounds;
[_collision setTranslatesReferenceBoundsIntoBoundary:YES];
[_animator addBehavior:_collision];
再次编译执行,可一看到视图会缓缓落到屏幕最下方然后微微弹起最后停在屏幕最下方。
我们还可以设置物体的物理属性,添加以下代码
//设置物体的物理属性
UIDynamicItemBehavior *_dyitem= [[UIDynamicItemBehavior alloc] initWithItems:@[aview]];
//物体弹性系数
_dyitem.elasticity = 1;
[_animator addBehavior:_dyitem];
这里设置弹性系数为1完全弹性碰撞,运行代码,我们可以看到视图在屏幕内弹起更多次。
UIDynamicItemBehavior有一个action属性,这是一个block类型的属性,可以通过它来纪录动画过程中的物体的位置等属性。添加代码
_collision.action = ^(void){
NSLog(@"center:(%f,%f)",aview.center.x,aview.center.y);
};
可以看到,在动画执行过程中,一直输出aview的坐标位置变化。
添加外力行为:
ViewController.h添加属性:
//外力行为
UIPushBehavior* _push;
ViewController.m里面viewdidload添加代码:
//mode设置持续的力或者瞬间力
_push = [[UIPushBehavior alloc] initWithItems:@[aview] mode:UIPushBehaviorModeInstantaneous];
//力的方向和大小
[_push setAngle:0 magnitude:1];
[_animator addBehavior:_push];
[_push setActive:true];
这是可以看到视图由于有个水平方向的初速度加上重力作用,做出一个抛物线的运动轨迹。
UIKit Dynamics介绍到此,可以为开发者省去很多时间,并且可以作出更漂亮的特效。