将imageView拖到另一个

时间:2013-02-27 15:23:29

标签: iphone ios objective-c

我一直在忙着开发游戏,而且我遇到了一个我觉得困难的部分。对于如何做到这一点,我可能完全错了。

我所拥有的是我的主板上的几张图像。它们是我拖入它们(瓦片)的对象的持有者。 (我再次不知道这是否是最佳或正确的方法。)

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

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

enter image description here

我真的被困在这里,我想了解一些关于如何做到这一点或其他方式的信息。

A已经可以拖动了。

2 个答案:

答案 0 :(得分:2)

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

在交叉点之后,您可以检查每个图块的中心与“A”的中心之间的最小距离,以检查哪个图块包含A的大部分。(所有UIView具有center属性)< / p>

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

或者第二个想法,您可以检查中心之间保持最小距离的最小距离,然后完全避开第一步。

CGFloat xDist = (p2.x - p1.x);
CGFloat yDist = (p2.y - p1.y);
CGFloat distance = sqrt((xDist * xDist) + (yDist * yDist));

答案 1 :(得分: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;
        }
    }