如何在iOS中使用拖动项目

时间:2012-02-24 15:40:57

标签: ios

我不太确定如何开始解释这个,但我会尝试。

前一段时间我开始阅读iOS书籍,我正试图掌握Objective-C。我想我对它有一个很好的理解。

我在iOS中正在做的是制作一个简单的游戏,其中包括将数字拖入框中,然后应用程序会抓取拖入框中的数字。但是,我不知道我是怎么做到的。

我想知道你们是否有类似这样的链接/文章,如果我应该使用某个框架,或者甚至是一些示例代码。

感谢您的回答。

4 个答案:

答案 0 :(得分:2)

搜索'cocos2d drag'...此外,here是一篇可能有助于您入门的文章。

答案 1 :(得分:2)

这是一个非常普遍的问题,范围很广,但一个简单的方法可能是为每个处理绘图的可拖动数字创建一个自定义UIView子类。在视图控制器中,您可以创建所有这些自定义UIView,并为每个自定义UIView创建UILongPressGestureRecognizerallowableMovement属性设置为CGFLOAT_MAX或一些大数字。使用操作方法将识别器附加到每个可拖动视图,并在视图控制器中进行一些回调。

然后,在视图控制器手势识别器操作方法中,您只需将视图中心属性更新为视图控制器视图中的手势识别器位置即可。类似的东西:

- (void)handleLongPressGesture:(UIGestureRecognizer *)recognizer
{
    if ([recognizer state] == UIGestureRecognizerStateChanged)
    {
         [[recognizer view] setCenter:[recognizer locationInView:self.view]];
    }
}

答案 2 :(得分:1)

我实际上会指出你使用Cocos2d。这是一个很好的框架在opengl之上,并且非常快。创建对象非常容易(就Cocos2d而言,它是CCSprite)并将它们放在您的视图(CCLayer)上并与它们进行交互。

拖放实际上包含三个阶段(伪代码)使用触摸处理程序方法(类似于UIKit的触摸方法):

  1. 在ccTouchesBegan中选取一个号码
  2. 移动ccTouchesMoves中的数字:使用触摸位置更新数字位置
  3. 使用ccTouchesEnded删除号码

    • 存储库中的 TouchesTest 目标在拖放时显示了一个不错的示例。它实现了一个简单的Pong游戏:

    enter image description here

答案 3 :(得分:1)

Cocos2D很好,我喜欢它,但你真的不需要去那个级别只是为了做一些基本的UITouch处理。如果你想做的就是处理一些接触,这里有一个例子:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [[event allTouches] anyObject];
    // Only move the placard view if the touch was in the placard view
    if ([touch view] != placardView) {
        // On double tap outside placard view, update placard's display string
        if ([touch tapCount] == 2) {
            [placardView setupNextDisplayString];
        }
        return;
    }
    // "Pulse" the placard view by scaling up then down
    // Use UIView's built-in animation
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    CGAffineTransform transform = CGAffineTransformMakeScale(1.2, 1.2);
    placardView.transform = transform;
    [UIView commitAnimations];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    transform = CGAffineTransformMakeScale(1.1, 1.1);
    placardView.transform = transform;
    [UIView commitAnimations];

    // Move the placardView to under the touch
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.25];
    placardView.center = [self convertPoint:[touch locationInView:self] fromView:placardView];
    [UIView commitAnimations];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [[event allTouches] anyObject];
    // If the touch was in the placardView, move the placardView to its location
    if ([touch view] == placardView) {
        CGPoint location = [touch locationInView:self];
        location = [self convertPoint:location fromView:placardView];
        placardView.center = location;
        return;
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [[event allTouches] anyObject];
    // If the touch was in the placardView, bounce it back to the center
    if ([touch view] == placardView) {

        CGPoint location = [touch locationInView:self];
        location = [self convertPoint:location fromView:placardView];

        UIView* dropZone; // assume this exists
        CGRect dz = [dropZone frame];
        if (CGRectContainsPoint(dz,location)) {
          [self doDropMagic];
        }
    }
}

有关详细信息,请查看event handling guide,这是我从中获取此代码的地方。