iOS绘制网格视图,用于拖放捕捉到该网格的对象

时间:2013-08-07 21:16:00

标签: iphone ios objective-c ipad

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

我意识到这是一个普遍的问题,但我只是在寻找可能已经存在以供参考的起点,类或框架的任何方向。任何方向都将非常感激。感谢。

2 个答案:

答案 0 :(得分:2)

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

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

这看起来像这样(假设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;
}

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

答案 1 :(得分:0)

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

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

下面有一些handwaving伪代码:

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