今天看了斯坦福的iOS7第八课时,讲到了这个有关力学的动画,就是模拟力学情况,比如重力和碰撞。这里记录一下今天用到的代码,课上是用一个俄罗斯方块的游戏来做demo,这里简化了一下。
希望大家有过接触这两个类是什么,至于具体是什么就不再展开介绍了。
第一步:做一个会掉下来的方块
- (void)viewDidLoad {
//创建了一个红色的view
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
view.backgroundColor = [UIColor redColor];
[self.view addSubview:view];
//创建了一个animator
_animator = [[UIDynamicAnimator alloc]initWithReferenceView:self.view];
//创建了一个重力项目
UIGravityBehavior *gravity = [[UIGravityBehavior alloc]init];
[gravity setAngle:M_PI_2 magnitude:0.5];
[gravity addItem:view];
//把重力项目添加到animator
[_animator addBehavior:gravity];
}
tips: 注意这里的animator是_animator也就是说是实例变量。你需要在前面声明一下,不然viewdidload方法一结束这个animator就被kill了
UIDynamicAnimator相当于一个舞台,你能在这里表演力学动画,所以最开始就要创建
(当然也可以不这么干,为了方便理解,这里我们选择层层递进)。
舞台(referenceview)具体位置在哪里呢? self.view
ok,有了舞台我们接着需要一个表演项目,表演个啥呢?
UIGravityBehavior-这就是我们表演的项目-重力的模拟。
设置一下表演的一些细节 设置一下角度和速度。这里的M_PI_2是向下的意思,0.5是一个看起来速度不是很快也不是很慢的速度(具体需要的速度自己去文档查阅测试一下),这些东西实践起来更有印象。好了现在有舞台有项目,安排个演员上来吧。
那个view你上来吧
[gravity addItem:view];
这样就建立了表演项目(gravity)和人员(view)的联系现在人员和表演项目的连接已经建立,再把舞台和表演项目的连接建立一下。
[_animator addBehavior:gravity];
建立成功,ok,请开始你的表演!
但很可惜,方块会一直往下掉,不能停在屏幕边框
第二步:添加一个框子()
//创建一个UICollisionBehavior
UICollisionBehavior *collision = [[UICollisionBehavior alloc] init];
//设置边界
[collision setTranslatesReferenceBoundsIntoBoundary:YES];
//添加演员
[collision addItem:view];
//连接舞台,上台表演
[_animator addBehavior:collision];
这个UICollisionBehavior是一个碰撞的行为,setTranslatesReferenceBoundsIntoBoundary这个方法是把animator传来的边界当成自己的碰撞边界,其他的addItem模式类似于重力的设置。
Command+R试试,现在你的红色小方块会掉下来稳稳地落在边界上了(其实还会再弹回来一下),想取消这种反弹?去搜索吧