Перетащите объекты и верните их в исходное положение - PullRequest
5 голосов
/ 12 апреля 2011

Я пытаюсь перетащить изображение и позволить ему вернуться в исходное положение после освобождения.Пока что я могу перетащить изображение, создав его в виде кнопки, используя следующий код: (как видно из ответа на этот вопрос: Основные функции перетаскивания в 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, чтобы перейти из его текущей позиции и перейти в другую?, или любое другое альтернативное решение?

Ответы [ 5 ]

7 голосов
/ 19 июня 2011

UIGestureRecognizer рекомендован Apple для последних версий iOS. Вы можете использовать его не только для UIButton, но и для UIView (особенно UIImageView в вашем случае) и т. Д. Поэтому я хотел бы порекомендовать его.

В интерфейсе:

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

В viewDidLoad, plz, не забудьте включить userInteraction:

- (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

1 голос
/ 24 июля 2013

Определите 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
   }

это работает потрясающе, потому что я использую его в своем проекте!

0 голосов
/ 08 апреля 2012

В решении, на которое я ссылался в потоке, на который вы ссылаетесь, я создал универсальный менеджер перетаскивания, который заботится о возврате перетаскиваемого объекта в исходное положение (если он выпущен за пределы известной точки сброса). В настоящее время в решении нет анимации, но вы можете объединить некоторые идеи, представленные выше.

Посмотрите, как универсальное решение для перетаскивания в iOS

0 голосов
/ 12 апреля 2011

Вы знаете, что я только что работал над этим вчера, так что вы идете с небольшой бонусной анимацией:

- (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 голосов
/ 12 апреля 2011

Как насчет вызова селектора в UIControlEventTouchUpInside, а затем в селекторе, просто установите для рамки вашей кнопки новые координаты x и y (те, которые вы сохранили).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...