2016-01-15 1 views
3

У меня есть UIImageView с распознающим жесты, который я перемещаю и поворачиваю на основе действия пользователя. Когда пользователь поднимает палец, я хочу, чтобы анимировать обратно в исходное положение, вот мой код:Как анимировать повернутый и перемещенный UIView в исходное положение?

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

    if (recognizer.state == UIGestureRecognizerStateBegan) { 
     startX = recognizer.view.center.x; 
     startY = recognizer.view.center.y; 
     startRotation = atan2(recognizer.view.transform.b, recognizer.view.transform.a); 
     NSLog(@"Start Position %f %f %f", startX, startY, startRotation); 
    } else if (recognizer.state == UIGestureRecognizerStateEnded) { 

     float distance = (startX - recognizer.view.center.x)/DISTANCE_TO_ACCEPT; 
     CGPoint center = recognizer.view.center; 


      // animate back 
      [UIView animateWithDuration:0.5 animations:^{ 
       NSLog(@"Position %f %f %f", recognizer.view.center.x, recognizer.view.center.y, atan2(recognizer.view.transform.b, recognizer.view.transform.a)); 
       NSLog(@"Destination %f %f %f", startX, startY, startRotation); 
       NSLog(@"Translation %f %f %f", startX - center.x, startY - center.y, (startRotation - atan2(recognizer.view.transform.b, recognizer.view.transform.a))); 

       recognizer.view.transform = CGAffineTransformRotate(CGAffineTransformTranslate(recognizer.view.transform, startX - center.x, startY - center.y), (CGFloat) (startRotation - atan2(recognizer.view.transform.b, recognizer.view.transform.a))); 
      }]; 


    } else if (recognizer.state == UIGestureRecognizerStateChanged) { 
     // move image 
     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]; 

     // rotate image 
     float distance = (startX - recognizer.view.center.x)/DISTANCE_TO_ACCEPT; 

     // cap distance 
     if (distance > 1) { 
      distance = 1; 
     } else if (distance < -1) { 
      distance = -1; 
     } 

     double rotation = 15 - startRotation; 
     rotation = rotation * distance; 
     recognizer.view.transform = CGAffineTransformRotate(recognizer.view.transform, (CGFloat) ((rotation * M_PI/180) - atan2(recognizer.view.transform.b, recognizer.view.transform.a))); 

    } 

} 

Но он никогда не переходит в исходное положение. У него всегда есть своего рода смещение. Дальнейшее перемещение изображения только ухудшает его. Похоже, что позиция не изменяется во время обратной анимации, потому что, когда я снова панорамирую изображение, начальная позиция и вращение равно положению и повороту, которые он имел в конце предыдущего движения [хотя на экране положение изображения и вращение изменилось].

Что я здесь делаю неправильно?

Благодаря

ответ

3

попробовать что-то подобное в UIGestureRecognizerStateEnded состоянии:

recognizer.view.transform = CGAffineTransformIdentity; 
recognizer.view.center = CGPointMake(startX,startY); 
+0

отлично! Я думал, что view.center - это свойство только для чтения :) – Krystian

Смежные вопросы