如何将用户触摸从一个对象传递到另一个对象?

时间:2011-09-12 10:56:43

标签: objective-c drag-and-drop

我正在开发一个应用程序,允许用户在某个点上拖放10个图像。所以有10个图像,如果他/她将一个图像拖到另一个图像上,这两个图像就会被交换。

截图如下:

Screenshot of application

因此,当用户拖动一张照片时,我希望它减少其不透明度,并为用户提供一个可拖动的图像,如果他将图像放在任何图像之外,它会再次消失。

我开发的方式如下。我为这些UIPanGesture设置了UIImageView

for (UIImageView *imgView in editPhotosView.subviews) {
        UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(photoDragged:)];
        [imgView addGestureRecognizer:panGesture];

        imgView.userInteractionEnabled = YES;

        [panGesture release];
}

然后我的photoDragged:方法:

- (void)photoDragged:(UIPanGestureRecognizer *)gesture {

    UIView *view = gesture.view;
    if ([view isKindOfClass:[UIImageView class]]) {
        UIImageView *imgView = (UIImageView *)view;
        if (gesture.state == UIGestureRecognizerStateBegan) {
            imgView.alpha = 0.5;

            UIImageView *newView = [[UIImageView alloc] initWithFrame:imgView.frame];
            newView.image = imgView.image;            
            newView.tag = imgView.tag;
            newView.backgroundColor = imgView.backgroundColor;
            newView.gestureRecognizers = imgView.gestureRecognizers;

            [editPhotosView addSubview:newView];            
            [newView release];
        }
        else if (gesture.state == UIGestureRecognizerStateChanged) {
            CGPoint translation = [gesture translationInView:view.superview];
            [view setCenter:CGPointMake(view.center.x + translation.x, view.center.y + translation.y)];
            [gesture setTranslation:CGPointZero inView:view.superview];
        }
        else { ... }
    }
}

因此,当您看到我在用户开始拖动它时,在与原始图像相同的位置添加一个具有0.5不透明度的新UIImageView。因此,用户正在拖动原始图像。但我想要做的是在用户拖动图像时复制原始图像并创建“可拖动”图像并将其传递给用户进行拖动。

但要做到这一点,我必须将用户触摸传递给新创建的“draggable”UIImageView。虽然它实际上设置为原始图像(用户在开始拖动时触摸的图像)。

所以我的问题是:如何将用户的触摸传递给另一个元素?

我希望这是有道理的。谢谢你的帮助!

3 个答案:

答案 0 :(得分:0)

好吧,您可以通过在其他对象中创建一个将手势识别器作为参数的方法,将UIPanGestureRecognizer对象传递给另一个对象。

- (void)myMethod:(UIPanGestureRecognizer *)gesture
{
    // Do stuff
}

使用....从你当前的手势识别器调用....

[myOtherObject myMethod:gesture];

不完全确定我在这里完全理解你的问题。 : - /

答案 1 :(得分:0)

也许:

[otherObject sendActionsForControlEvents:UIControlEventTouchUpInside];

或任何其他UIControlEvent

答案 2 :(得分:0)

最后我决定拖动原始图像并在原始位置留下副本。

我通过重新创建手势识别器并将它们分配给“副本”解决了问题,就像PragmaOnce建议的那样。