Abha
Abha

Reputation: 1082

How to make UIButton Draggeable?

I need to drag and drop the uibutton in subview only. Actually i am taking subview in main view. UIbutton is add in subview. When i drag the button it moves on both view but i need to drag button only in subview. Can anyone help me please. Thanks in advance.

- (void) drag
{
  //subview
  UIView *viewscramble = [[UIView alloc] initWithFrame:CGRectMake(0, 90, 320, 50)];
  [viewscramble setBackgroundColor:[UIColor redColor]];
  [self.view addSubview:viewscramble];

   //button
   UIButton  *btnscramble = [[UIButton alloc] initWithFrame:CGRectMake(5, 0, 50, 50)];
   btnscramble.titleLabel.text = @"A";
   [btnscramble setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
   [btnscramble addTarget:self action:@selector(imageMoved:withEvent:) forControlEvents:UIControlEventTouchDragInside];
   [btnscramble setBackgroundImage:[UIImage imageNamed:@"box.png"] forState:UIControlStateNormal];

   //add button`     
   [viewscramble addSubview:btnscramble];
   [btnscramble release];
}

- (IBAction)imageMoved:(id)sender withEvent:(UIEvent *) event
{
  CGPoint point = [[[event allTouches]anyObject] locationInView:viewscramble];
  UIControl *control = sender;
  control.center = point;
}

Upvotes: 1

Views: 1100

Answers (5)

Baig
Baig

Reputation: 4995

Use UIControlEventTouchDragInside and UIControlEventTouchUpInside events of UIButton like

// add drag listener
[button addTarget:self action:@selector(wasDragged:withEvent:) forControlEvents:UIControlEventTouchDragInside];
// add tap listener
[button addTarget:self action:@selector(wasTapped:) forControlEvents:UIControlEventTouchUpInside];

You can use hbdraggablebutton control..

Upvotes: 0

Krishnabhadra
Krishnabhadra

Reputation: 34275

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    if([touch view] == YOUR_BUTTON_OBJECT){
       CGPoint point = [touch locationInView:YOUR_PARENT_VIEW];
       //YOUR_X_LIMIT is your subview end in x direction.
       //YOUR_Y_LIMIT is your subview end in y direction.
       if(point.x < YOUR_X_LIMIT && point.y < YOUR_Y_LIMIT){
          button.center = point;
       }else{
         // do nothing since touch is outside your limit.
       }
    }
}

Upvotes: 0

Paras Joshi
Paras Joshi

Reputation: 20541

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{

    UITouch *tap = [touches anyObject];
    CGPoint pointToMove = [tap locationInView:yourSubView]; // just assign subview where you want to move the Button
}

Upvotes: 0

Nitin Gohel
Nitin Gohel

Reputation: 49720

i just found the solution of your Question from:- http://www.cocoanetics.com/2010/11/draggable-buttons-labels/

- (void)viewDidLoad 
{
    [super viewDidLoad];

    // create a new button
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button setTitle:@"Drag me!" forState:UIControlStateNormal];

    // add drag listener
    [button addTarget:self action:@selector(wasDragged:withEvent:) 
        forControlEvents:UIControlEventTouchDragInside];

    // center and size
    button.frame = CGRectMake((self.view.bounds.size.width - 100)/2.0,
            (self.view.bounds.size.height - 50)/2.0,
            100, 50);

    // add it, centered
    [self.view addSubview:button];
}


- (void)wasDragged:(UIButton *)button withEvent:(UIEvent *)event
{
    // get the touch
    UITouch *touch = [[event touchesForView:button] anyObject];

    // get delta
    CGPoint previousLocation = [touch previousLocationInView:button];
    CGPoint location = [touch locationInView:button];
    CGFloat delta_x = location.x - previousLocation.x;
    CGFloat delta_y = location.y - previousLocation.y;

    // move button
    button.center = CGPointMake(button.center.x + delta_x,
        button.center.y + delta_y);
}

Hope its helpful for you :)

Upvotes: 3

Rushabh
Rushabh

Reputation: 3203

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint pointMoved = [touch locationInView:"SUBVIEWNAME.view"];   
    button.frame = CGRectMake(pointMoved.x, pointMoved.y, 64, 64);
}

Upvotes: 0

Related Questions