iOS7から物理シュミレーションがOSから提供されるようになりました。
Viewに重力を設定したりViewとViewを連結する という設定をしておくことが出来ます。
こういう条件だけ設定しておけば、あとはこの設定した条件に従って勝手にViewが動きます。それがiOS7から追加されたDynamicBehaviorです。
iOS7.0の段階で使えるDynamicBehaviorは
- UIAttachmentBehavior View同士の連結
- UICollisionBehavior View同士が重ならない
- UIGravityBehavior Viewに重力がかかる
- UIPushBehavior ViewとViewに斥力(反発する力)がかかる
- UISnapBehavior ViewとViewに引力がかかる
の6つです。これらは全てこういう名前のClassでDynamicBehaviorの子クラスです。
これをViewに設定すればViewはそれに合わせて動きます。
実際にやってみましょう。とりあえず重力から。
重力をViewに設定します。
UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
[redView setBackgroundColor:[UIColor redColor]];
[self.view addSubview:redView];
UIGravityBehavior *gravityBeahvior = [[UIGravityBehavior alloc] initWithItems:@[redView]];
この例では、とりあえず赤いViewを作っています。そしてGravityBehaviorを作り、そのアイテムとしてViewを追加しています。
面白いのがViewにaddBehaviorみたいにするんじゃなくて Behaviorの方にViewを追加する点ですね。
さて、これでは動きません。
Behaviorは条件を示すだけで、この条件を元に動かすのはUIDynaicAnimatorというアニメータークラスです。
こいつを作って「このViewにこういうBehaviorね、任せた!」と渡すと勝手にViewを操ってくれます。
完成したのがこちら。
#import "SimpleGravityViewController.h"
@interface SimpleGravityViewController ()
@property (nonatomic, strong) UIDynamicAnimator *animator;
@end
@implementation SimpleGravityViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
// target
UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
[redView setBackgroundColor:[UIColor redColor]];
[self.view addSubview:redView];
self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
UIGravityBehavior *gravityBeahvior = [[UIGravityBehavior alloc] initWithItems:@[redView]];
[self.animator addBehavior:gravityBeahvior];
}
@end
これをそのままコピペしてViewControllerとして表示させれば、赤いViewが出てきて画面の下に落ちていくと思います。
やっていることとしてはさっきのようにBehaviorをつくり赤いViewをItemとして追加しています。
そして、DynamicAnimatorを作っています。こいつは消えちゃうと困るのでpropertyとしてViewControllerが保持します。
このanimatorにまず、アニメーションが有効なViewを設定します。今回はself.view。
そして、gravityBehaviorをaddBehaviorします。これでself.view上でこのBehaviorが有効になります。
有効になったということは赤いviewには重力がかかったかのような動きをAnimatorが勝手にやってくれるということなので
赤いViewは下に落ちていったわけです。