Iphone 基于手势重新排列UIIviews

Iphone 基于手势重新排列UIIviews,iphone,objective-c,ios,xcode,uiview,Iphone,Objective C,Ios,Xcode,Uiview,我正在构建一个iphone应用程序,它在一个UIViewController中的3x3矩阵中有多个UIView(总共9个UIView)。我试图找到一种方法,让用户将一个视图移动到矩阵中的某个位置,然后再相应地重新排列其余视图。想象一下,当你将跳板上的一个应用程序拖到另一个地方时,所有其他图标都会相应地排列 完成类似任务的最佳方法是什么?如果您是为iOS 6开发的,一定要看看这个课程。如果在学习曲线之前处理过表视图,则不应太陡。您可以免费获得重新排列以及所有动画。使用,使用translationV

我正在构建一个iphone应用程序,它在一个UIViewController中的3x3矩阵中有多个UIView(总共9个UIView)。我试图找到一种方法,让用户将一个视图移动到矩阵中的某个位置,然后再相应地重新排列其余视图。想象一下,当你将跳板上的一个应用程序拖到另一个地方时,所有其他图标都会相应地排列


完成类似任务的最佳方法是什么?

如果您是为iOS 6开发的,一定要看看这个课程。如果在学习曲线之前处理过表视图,则不应太陡。您可以免费获得重新排列以及所有动画。

使用,使用
translationView
调整您正在拖动的项目的坐标。有关手势识别器的讨论,请参阅

当您放开(即手势结束)时,您可以使用
UIView
class方法
animateWithDuration
设置各种项目移动到其最终位置的动画

因此,在
viewDidLoad
中,您可以执行如下操作(假设在名为
ArrayOfView
的数组中有九个控件):

然后,您的手势识别器处理程序可能如下所示:

- (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
        }];
    }
}

这是拖动控件的基本情况。

使用
uipangestureerecognizer
,使用
translationview
调整拖动项的坐标。当你放手时,你可以使用
UIView
class方法
animateWithDuration
来设置各种项目移动到其最终位置的动画。+1…你知道当我将UIView拖动到某个地方时,我如何知道它的位置吗?你可以查看视图的
中心
属性。接下来的问题是如何知道移动了九个视图中的哪一个,我认为最简单的方法是在创建它们时为九个视图中的每一个设置
tag
integer属性(或在Interface Builder中设置它们),给每个视图一个唯一的
tag
值。然后你可以看一下
手势.视图.标签
,你就会知道你移动了哪一个。
- (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
        }];
    }
}