2011-04-11 192 views
5

我试图拖动图像,并在释放它之后让它返回原始位置。 (如在回答看到了这个问题::Basic Drag and Drop in iOS)到目前为止,我可以使用下面的代码创建它作为一个按钮,拖动图像拖放对象并将它们返回到原始位置

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
[button addTarget:self action:@selector(imageTouch:withEvent:) forControlEvents:UIControlEventTouchDown]; 
[button addTarget:self action:@selector(imageMoved:withEvent:) forControlEvents:UIControlEventTouchDragInside]; 
[button setImage:[UIImage imageNamed:@"vehicle.png"] forState:UIControlStateNormal]; 
[self.view addSubview:button]; 

后来我定义:

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

我怎么才能让它在释放它之后回到它原来的位置呢?对于初学者,我将保存每个图像应该返回的位置,但是,无论如何,指示UIImage从它的当前位置移动并移动到另一个?或者其他的替代解决方案?

回答

-1

你知道吗,我只是工作这种昨天,所以在这里你去一点点奖金动画:

- (void)previewImageTouchUpInside:(UIButton*)aButton { 
    if (!previewImageDragged) { 
     [self selectPreviewImage:aButton]; 
     return; 
} 

    previewImageDragged = NO; 

    // If user drag photo a little and then release, we'll still treat it as a tap 
    // instead of drag 
    if ((originalPositionOfButton.x - aButton.center.x) * 
     (originalPositionOfButton.x - aButton.center.x) + 
     (originalPositionOfButton.y - aButton.center.y) * 
     (originalPositionOfButton.y - aButton.center.y) < 10) { 
     aButton.center = originalPositionOfButton; 
     [self selectPreviewImage:aButton]; 
     return; 
    } 

    [UIView animateWithDuration:0.5 
     delay:0 
     options:UIViewAnimationOptionCurveEaseOut | 
     UIViewAnimationOptionAllowUserInteraction animations:^{ 
     aButton.center = originalPositionOfButton; 
    } completion:nil]; 
} 



- (void)previewImageDraggedInside:(UIButton*)aButton event:(UIEvent*)event { 
    if (!previewImageDragged) { 
     originalPositionOfButton = aButton.center; 
     [self.view bringSubviewToFront:aButton]; 
     [self.view bringSubviewToFront:[self.view viewWithTag:CHOOSE_PHOTO_BUTTON_TAG]]; 
    } 

    UITouch* touch = [[event allTouches] anyObject]; 

    previewImageDragged = YES; 
    aButton.center = CGPointMake(aButton.center.x+[touch locationInView:self.view].x- 
     [touch previousLocationInView:self.view].x, 
     aButton.center.y+[touch locationInView:self.view].y- 
     [touch previousLocationInView:self.view].y); 
} 

它仍然有一些神奇数字,我还没有改名的函数和变量以适应你的例子,但它应该很清楚。我也在这里做了缩进,因为我不会在代码中手动分解长行。

0

如何调用UIControlEventTouchUpInside上的选择器,然后在选择器中,将按钮的框架设置为新的x和y坐标(已保存的坐标)。

+0

谢谢。但那会立即将UIButton移动到一个新的位置,对吗?如果是这样,一旦UIControlEventTouchUpInside上的选择器被调用,可以命令UIButton从它的当前位置移动到新的位置? – 2011-04-11 22:23:12

+0

阅读“动画” – 2011-04-12 03:13:28

7

苹果推荐UIGestureRecognizer用于最新的iOS。你不仅可以将它用于UIButton,也可以用于UIView(尤其是UIImageView)等等,所以我想推荐它。

在接口:

@interface TestDragViewController : UIViewController { 
    IBOutlet UIImageView *dragImage; 
    CGPoint originalCenter; 
} 

在viewDidLoad中,PLZ记得让用户交互:

- (void)viewDidLoad { 
    [super viewDidLoad]; 


    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self 
                       action:@selector(dragGesture:)]; 
    [dragImage addGestureRecognizer:panGesture]; 
    [dragImage setUserInteractionEnabled:YES]; 
} 

,并在其选择,我只设置动画以可视化的恢复效果:

#pragma mark - 
#pragma mark UIPanGestureRecognizer selector 
- (void) dragGesture:(UIPanGestureRecognizer *) panGesture{ 
    CGPoint translation = [panGesture translationInView:self.view]; 

    switch (panGesture.state) { 
     case UIGestureRecognizerStateBegan:{ 
      originalCenter = dragImage.center; 
     } 
      break; 
     case UIGestureRecognizerStateChanged:{ 
      dragImage.center = CGPointMake(dragImage.center.x + translation.x, 
              dragImage.center.y + translation.y); 
     } 
      break; 
     case UIGestureRecognizerStateEnded:{    
      [UIView animateWithDuration:kImageReturnTime 
          animations:^{ 
           dragImage.center = originalCenter; 
          } 
          completion:^(BOOL finished){ 
           NSLog(@"Returned"); 
          }]; 
     } 
      break; 
     default: 
      break; 
    } 

    [panGesture setTranslation:CGPointZero inView:self.view]; 
} 

干杯,

Tommy

+0

的文档到目前为止,这是正确的解决方案,没有复杂性或创造非必要的抽象!,做得好汤米! – Wilson 2016-04-13 00:14:53

0

在我提到的线程链接的解决方案中,我创建了一个通用的拖放管理器,负责将拖动对象返回到原始位置(如果在已知的拖放区外发布)。目前解决方案中没有动画,但可以结合上面介绍的一些想法。

看到一些generic drag and drop solution in iOS

1

如何定义CGPoint在全球范围内,还是在.h文件中。

CGPoint point;   

     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
     [button addTarget:self action:@selector(imageTouch:withEvent:)forControlEvents:UIControlEventTouchDown]; 
     [button addTarget:self action:@selector(imageMoved:withEvent:) forControlEvents:UIControlEventTouchDragInside]; 
     [button setImage:[UIImage imageNamed:@"vehicle.png"] forState:UIControlStateNormal]; 
     [self.view addSubview:button]; 

后来我定义:

- (IBAction) imageMoved:(UIButton*) sender withEvent:(UIEvent *) event 
{ 
point = [[[event allTouches] anyObject] locationInView:self.view]; 
UIControl *control = sender; 
control.center = point; 
[sender addTarget:self action:@selector(touches:withEvent:) forControlEvents:UIControlEventTouchUpInside]; 
} 

-(void)touches:(UIButton *)button withEvent:(UIEvent *)event { 

[UIView animateWithDuration:0.1 delay:0 options:UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionAllowUserInteraction animations:^{ 
    button.center = point; 

} completion:^(BOOL finished){ 
    if (finished) { 
    // do anything yu want 
    } 

它工作真棒,因为我在我的项目中使用它!

相关问题