Austin
Austin

Reputation: 4929

How to use drag items in iOS

I'm not quite sure how to start explaining this, but I'll try.

I started reading iOS books awhile ago, and I'm trying to get a handle on Objective-C. I think I have an ok understanding of it.

What I'm doing in iOS is making a simple game that involves dragging numbers into a box, which the app then grabs the number that was dragged into the box. However, I have no idea how I do this.

I was wondering if you guys have any links/articles on something like this, if I should use a certain framework for this, or maybe even some example code.

Thanks for any answers.

Upvotes: 3

Views: 418

Answers (4)

Nick Weaver
Nick Weaver

Reputation: 47241

I actually would point you to using Cocos2d. It's a nice framework on top of opengl and is pretty fast. It's so easy to create objects(in terms of Cocos2d it's a CCSprite) and put them on your view(CCLayer) and interact with them.

A drag and drop would actually consists of three phase (pseudo-code) using the touch handler methods (similar to UIKit's touch methods):

  1. Pick up a number in ccTouchesBegan
  2. move the number in ccTouchesMoves: update the numbers position with the touch position
  3. Drop the number with ccTouchesEnded

  • The TouchesTest target in the repository shows a decent example on drag and drop. It implements a simple Pong like game:

enter image description here

Upvotes: 1

slf
slf

Reputation: 22767

Cocos2D is fine, and I like it, but you don't really need to go to that level just to do some basic UITouch handling. If all you want to do is handle some touches, here is an example:

- (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];
        }
    }
}

For more, check out the event handling guide which is where I got this hacked up code from.

Upvotes: 1

Tark
Tark

Reputation: 5173

This is a pretty general question with huge scope, but a simple approach could be to create a custom UIView subclass for each draggable number that handles the drawing. In a view controller you can create all of these custom UIViews and create a UILongPressGestureRecognizer for each one, with the allowableMovement property set to CGFLOAT_MAX, or some large number. Attach the recognizer to each draggable view with the action method some callback in the view controller.

Then, in the view controller gesture recognizer action method, you can just update the views center property to the gesture recognizers location in the view controllers view. Something like:

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

Upvotes: 2

PTBG
PTBG

Reputation: 595

do a search on 'cocos2d drag' ... also, here is an article that might help you get started.

Upvotes: 2

Related Questions