我正在开发一个需要将自定义视图分割成方块的项目。您需要能够在其上拖动另一个视图,当您放下该对象时,它将捕捉到网格方块。我还需要能够迭代网格中的每个方块,并确定对象是否在特定网格方块内。
我意识到这是一个普遍的问题,但我只是在寻找可能已经存在以供参考的起点,类或框架的任何方向。任何方向都将非常感激。感谢。
答案 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];
}];