1 つの UIViewController 内に 3x3 マトリックス (合計 9 つの UIView) に複数の UIView を持つ iPhone アプリを構築しています。ユーザーが1つのビューをマトリックス内の場所に移動できるようにする方法を見つけようとしています。これにより、残りのビューがそれに応じて再配置されます。スプリングボード上のアプリを別の場所にドラッグすると、他のすべてのアイコンがそれに応じて配置されます。
そのようなことを達成するための最良の方法は何ですか?
1 つの UIViewController 内に 3x3 マトリックス (合計 9 つの UIView) に複数の UIView を持つ iPhone アプリを構築しています。ユーザーが1つのビューをマトリックス内の場所に移動できるようにする方法を見つけようとしています。これにより、残りのビューがそれに応じて再配置されます。スプリングボード上のアプリを別の場所にドラッグすると、他のすべてのアイコンがそれに応じて配置されます。
そのようなことを達成するための最良の方法は何ですか?
を使用UIPanGestureRecognizer
して、translationInView
ドラッグしているアイテムの座標を調整します。ジェスチャ レコグナイザーの説明については、「iOS のイベント処理ガイド」を参照してください。
手放すと (つまり、ジェスチャが終了すると)、UIView
クラス メソッドを使用animateWithDuration
して、さまざまなアイテムが最終的な場所に移動する様子をアニメーション化できます。
したがって、 ではviewDidLoad
、次のようなことを行うことができます ( という配列に 9 つのコントロールがあると仮定しますarrayOfViews
)。
for (UIView *subview in self.arrayOfViews)
{
UIPanGestureRecognizer *gesture = [[UIPanGestureRecognizer alloc] initWithTarget:self
action:@selector(movePiece:)];
[subview addGestureRecognizer:gesture];
}
そして、ジェスチャー認識ハンドラーは次のようになります。
- (void)movePiece:(UIPanGestureRecognizer *)gesture
{
static CGPoint originalCenter;
if (gesture.state == UIGestureRecognizerStateBegan)
{
originalCenter = gesture.view.center;
}
else if (gesture.state == UIGestureRecognizerStateChanged)
{
CGPoint translation = [gesture translationInView:self.view];
gesture.view.center = CGPointMake(originalCenter.x + translation.x, originalCenter.y + translation.y);
}
else if (gesture.state == UIGestureRecognizerStateEnded)
{
[UIView animateWithDuration:0.25
animations:^{
// move your views to their final resting places here
}];
}
}
これは、コントロールのドラッグがどのように見えるかの要点です。
iOS 6 向けに開発している場合は、必ずUICollectionViewクラスを確認してください。テーブル ビューを扱ったことがある場合は、学習曲線が急勾配になることはありません。再配置とすべてのアニメーションを無料で入手できます。