1

我一直忙于尝试开发一款游戏,并且我发现了其中一个困难的部分。我可能完全不知道如何做到这一点。

我的板上有几个图像视图。它们是我拖入其中的对象(瓷砖)的持有者。(同样,我不知道这是最好的还是正确的方法。)

例如,我制作了一张图片来显示我的意思:

在此图像中,我有一个图像 (A),我想将其拖到顶部的 1 个图块上,我的代码必须自动检测 (A) 位于哪个图像视图上方并将其放置到该视图中。

在此处输入图像描述

我真的被困在这里,我想要一些关于如何以这种方式或另一种方式做这样的事情的信息。

A 已经可以拖动了。

4

2 回答 2

2

您可以使用bool CGRectIntersectsRect (CGRect rectA,CGRect rect1);(rect1 或 rect2 或 3 或 4)检查“A”的框架与四个顶部图块中的任何一个的交叉点。

相交后,您可以检查每个图块的中心与“A”中心之间的最小距离,以检查哪个图块包含的 A 最多。(全部UIView具有center属性)

这是假设所有图块和 A 都是单独的视图。

或者再三考虑,您可以在检查之前检查中心之间的最小距离,保持最小距离,并完全避免第一步。

CGFloat xDist = (p2.x - p1.x);
CGFloat yDist = (p2.y - p1.y);
CGFloat distance = sqrt((xDist * xDist) + (yDist * yDist));
于 2013-02-27T16:21:44.570 回答
1

为您的手势创建属性:

@property (nonatomic, strong) UILongPressGestureRecognizer *longPress;

初始化它:

self.longPress = [UILongPressGestureRecognizer initWithTarget:self action:@selector(gestureRecognizedStateDidChanged:)];
self.longPress.minimumPressDuration = 0.03;

你的视图控制器类应该实现<UIGestureRecognizerDelegate>协议:

self.longPress.delegate = self;

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)sender {
return CGRectContainsPoint(self.targetImage.frame, [sender locationInView:self.view]);
}

- (void)gestureRecognizedStateDidChanged:(UILongPressGestureRecognizer *)sender {
switch (recognizer.state) {
        case UIGestureRecognizerStatePossible:
        case UIGestureRecognizerStateBegan: {
        // did started, you can pick up your view
        self.targerImageView.center = [sender locationInView:self.view];
        break;
    }
    case UIGestureRecognizerStateFailed:
    case UIGestureRecognizerStateCancelled:
    case UIGestureRecognizerStateEnded: {
        // drop callback, bring you view home or to target
        if (CGRectContainsPoint(self.toDropImageViews.frame, [sender locationInView:self.view]) {
            // do you drop code here
        }
        break;
    }
    case UIGestureRecognizerStateChanged: {
        self.targerImageView.center = [sender locationInView:self.view];
        // moving callback
        break;
        }
    }
于 2013-02-27T16:51:38.723 回答