タイトルまんまですw
まずは次の映像をご覧ください。(最初の数秒だけ見ていただければ大丈夫です)
この動きは、iOS 7から追加されたUI Dynamicsと、Core Motionを組み合わせて実現しています。
ちょっと詳しく解説してみます。
UI Dynamicsでまりもを「落とす」
まりもの落下は、UI Dynamicsの UIGravityBehavior と UICollisionBehavior を使って実現しています。
UIDynamicAnimator* animator =
[[UIDynamicAnimator alloc] initWithReferenceView:self.view];
UIGravityBehavior* gravityBeahvior =
[[UIGravityBehavior alloc] initWithItems:@[self.marimo]];
UICollisionBehavior* collisionBehavior =
[[UICollisionBehavior alloc] initWithItems:@[self.marimo]];
collisionBehavior.translatesReferenceBoundsIntoBoundary = YES;
[animator addBehavior:gravityBeahvior];
[animator addBehavior:collisionBehavior];
collisionBehavior.collisionDelegate = self;
self.animator = animator;
これだけでまりもが上から落下して、画面の下に衝突すると跳ね返る動きが実装できます。
重力がかかる方向は、UIGravityBehaviorの gravityDirection プロパティで指定できます。値は
gravityBeahvior.gravityDirection = CGVectorMake(1.0, -1.0);
のように指定します。デフォルトでは (0.0, 1.0) =下方向が設定されています。
Core Motionで重力をコントロール
このままだとただまりもが落下するだけなので、iPhoneの傾きによって重力をコントロールしてみます。
Core Motionを使うことによって、iPhoneの傾きが取得できます。

(iOSイベント処理ガイドより)
詳しい使い方は次のエントリをご覧ください。
この内のx, y座標を、先ほど説明したUIGravityBehaviorの gravityDirection プロパティにセットすることで、iPhoneの傾きとまりもの重力を連携させるわけです。
[self.motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMAccelerometerData *data, NSError *error) { // まりもの重力をセット _gravityBeahvior.gravityDirection = CGVectorMake(accelerationData.acceleration.x, -accelerationData.acceleration.y); }];
この結果、iPhoneを傾けた方向にまりもが転がるようになります。
注意しないといけないのは、Core Motionで取得できる y の値と gravityDirection にセットする値の正負が逆になるということです。この例ではマイナスを付けて正負を逆転させています。
宣伝
今回紹介したまりもアプリはこちらからダウンロードできます!
