5

我正在开发一个需要将自定义视图分割成正方形的项目。您需要能够在其上拖动另一个视图,并且当您放下该对象时,它将捕捉到网格方块。我还需要能够遍历网格中的每个正方形并确定对象是否在该特定网格正方形内。

我意识到这是一个普遍的问题,但我只是在寻找关于从哪里开始、可能已经存在的类或框架以供参考的任何方向。任何方向都将不胜感激。谢谢。

4

2 回答 2

2

问题 #1:用户需要能够在其上拖动另一个视图,并且当您放下该对象时,它会捕捉到网格方块。

假设您正在拖动 UIView。在 UIView 的 touchesEnded 上,我将使用 center 属性,该属性包含 UIView 的 x 和 y 坐标中心值,并将其传递给一个函数,以测试它在哪个网格正方形内。

这看起来像这样(假设 UIView 是名称 draggingView):

for (CGRect gridSquare in gridArray) {
    if (CGRectContainsPoint(gridRect, draggingView.center)) {
        // Return the gridSquare that contains the object
    }
}

现在,如果您想知道 gridArray 是什么,它是构成游戏板的所有网格方块的数组。如果您需要帮助创建这个,请告诉我。

问题 #2:用户需要能够遍历网格中的每个正方形,并确定对象是否在该特定网格正方形内。

如果您能够按照上面的步骤进行操作,那么这很容易。在遍历网格正方形时,您可以使用 gridSquare 原点值来查看是否有任何 draggingView 子视图具有相同的原点。使用它,您可以返回特定正方形内的 UIView。见下文:

- (UIView *)findViewInSquare {
    for (CGRect rect in gridArray) {
        for (UIView *view in [self.view subViews]) {
            if (CGPointEqualToPoint(view.frame.origin, rect.origin)) {
                return view;   // Returns the view in the grid square
            }
        }
    }
    return nil;
}

希望这一切都有意义,如果您需要任何澄清,请告诉我。

于 2013-08-07T22:28:32.097 回答
0

我可能会从 UICollectionView 开始,因为它将为布局视图提供很大的灵活性,并支持动画插入/删除视图。

当您的用户释放要插入的视图时,您可能需要 UICollectionViewDataSource 在所需位置提供一个新单元格(使单元格透明)并获取其框架。然后使用动画将视图移动到单元格的位置,并在动画的完成处理程序中将其添加为单元格的子视图。

下面的一些手动伪代码:

UIView * viewToDrop; // your view being dropped
NSIndexPath * indexPathOfInsertedCell; // figure this out... not sure exactly how you would calculate this--you might need to interrogate the UICollectionViewLayout
UICollectionView * collectionView; // your collection view
UICollectionViewCell * dropCell = [collectionView cellForItemAtIndexPath:indexPathOfInsertedCell];
[UIView animateWithDuration:0.25 animations:^{
    CGFloat dx = viewToDrop.frame.origin.x - dropCell.frame.origin.x;
    CGFloat dy = viewToDrop.frame.origin.y - dropCell.frame.origin.y;
    viewToDrop.transform = CGAffineTransformMakeTranslation(dx, dy);
} completion:^(BOOL finished) {
    [dropCell addSubview:viewToDrop];
}];
于 2013-08-07T21:27:47.640 回答