Ios 在不删除按钮的情况下拖放

Ios 在不删除按钮的情况下拖放,ios,drag-and-drop,uibutton,Ios,Drag And Drop,Uibutton,问题是我必须触摸两次才能拖动按钮。。当我第一次触摸时,它会自动复制按钮和触摸结束。。现在我想要的是第一次触摸并拖动 point = [[[event allTouches] anyObject] locationInView:self.view]; NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:(id)touch]; UIButton * anotherButton =(id) [NSKeyedUnarc

问题是我必须触摸两次才能拖动按钮。。当我第一次触摸时,它会自动复制按钮和触摸结束。。现在我想要的是第一次触摸并拖动

point = [[[event allTouches] anyObject] locationInView:self.view];

NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:(id)touch];

UIButton * anotherButton =(id) [NSKeyedUnarchiver unarchiveObjectWithData:archivedData];

UIImage *senderImage=[(id)touch imageForState:UIControlStateNormal];

CGImageRef cgImage = [senderImage CGImage];

UIImage *copyOfImage = [[UIImage alloc] initWithCGImage:cgImage];

[anotherButton setImage:copyOfImage forState:UIControlStateNormal];

[anotherButton addTarget:self action:@selector(wasDragged:withEvent:)forControlEvents:UIControlEventTouchDragInside];

[self.view addSubview:anotherButton];
像这样做

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame =CGRectMake(50, 50, 100, 50);
[button setTitle:@"Move me" forState:UIControlStateNormal];
[button addTarget:self action:@selector(buttonMoved:withEvent:) forControlEvents:UIControlEventTouchDragInside];  
[self.view addSubview:button];  


- (IBAction) buttonMoved:(UIButton *) sender withEvent:(UIEvent *) event
 {
   // You can make copy of button here.. you will get button as sender

  CGPoint point = [[[event allTouches] anyObject] locationInView:self.view];
  sender.center = point;
 }
这应该可以解决你的问题, 1) 宣布,


2) 将手势识别器添加到按钮

UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
[self.button addGestureRecognizer:panGesture];

3) 添加此句柄方法

- (void) handlePan:(UIPanGestureRecognizer *)recognizer {

    switch([recognizer state]){
        case  UIGestureRecognizerStatePossible : {

        }break;
        case  UIGestureRecognizerStateBegan: {
            UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
            [button setFrame:self.button.frame];
            [button setTitle:self.button.titleLabel.text forState:UIControlStateNormal];
            [self.view insertSubview:button belowSubview:self.button];
            self.tempButton = button;
            NSLog(@"UIGestureRecognizerStateBegan");
        }break;
        case  UIGestureRecognizerStateChanged: {
            CGPoint translation = [recognizer translationInView:self.view];
            recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,
                                                 recognizer.view.center.y + translation.y);
            [recognizer setTranslation:CGPointMake(0, 0) inView:self.view];
        }break;
        case  UIGestureRecognizerStateCancelled: {

        }break;
        case  UIGestureRecognizerStateFailed: {

        }break;
        case   UIGestureRecognizerStateRecognized: {
            [self.tempButton removeFromSuperview];
            self.tempButton = nil;
        }break;
    }
}

此代码不会复制您触摸过的按钮。。我以前试过…为什么你想要button的副本?因为他们在我的自定义键盘上使用它。。假设您触摸a按钮,它会复制a按钮,与其他按钮b、c、d、e、f、g等相同。。
- (void) handlePan:(UIPanGestureRecognizer *)recognizer {

    switch([recognizer state]){
        case  UIGestureRecognizerStatePossible : {

        }break;
        case  UIGestureRecognizerStateBegan: {
            UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
            [button setFrame:self.button.frame];
            [button setTitle:self.button.titleLabel.text forState:UIControlStateNormal];
            [self.view insertSubview:button belowSubview:self.button];
            self.tempButton = button;
            NSLog(@"UIGestureRecognizerStateBegan");
        }break;
        case  UIGestureRecognizerStateChanged: {
            CGPoint translation = [recognizer translationInView:self.view];
            recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,
                                                 recognizer.view.center.y + translation.y);
            [recognizer setTranslation:CGPointMake(0, 0) inView:self.view];
        }break;
        case  UIGestureRecognizerStateCancelled: {

        }break;
        case  UIGestureRecognizerStateFailed: {

        }break;
        case   UIGestureRecognizerStateRecognized: {
            [self.tempButton removeFromSuperview];
            self.tempButton = nil;
        }break;
    }
}