我正在构建一个 iphone 应用程序,该应用程序在一个 UIViewController 内具有 3x3 矩阵中的多个 UIViews(总共 9 个 UIViews)。我试图找到一种方法让用户将一个视图移动到矩阵中的某个位置,然后相应地重新排列其余视图。想想当您将跳板上的应用程序拖到另一个地方时,所有其他图标都会相应地自行排列。
完成这样的事情的最佳方法是什么?
我正在构建一个 iphone 应用程序,该应用程序在一个 UIViewController 内具有 3x3 矩阵中的多个 UIViews(总共 9 个 UIViews)。我试图找到一种方法让用户将一个视图移动到矩阵中的某个位置,然后相应地重新排列其余视图。想想当您将跳板上的应用程序拖到另一个地方时,所有其他图标都会相应地自行排列。
完成这样的事情的最佳方法是什么?
使用UIPanGestureRecognizer
, 使用translationInView
来调整您正在拖动的项目的坐标。有关手势识别器的讨论,请参阅iOS 事件处理指南。
当您放手时(即手势结束),您可以使用UIView
类方法animateWithDuration
动画各种项目移动到它们的最终位置。
因此,在 中viewDidLoad
,您可能会执行以下操作(假设您在名为 的数组中有九个控件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类。如果你之前处理过表格视图,学习曲线应该不会太陡峭。您可以免费获得重新排列以及所有动画。