У меня есть 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)));
}
}
Но он никогда не переходит в исходное положение. У него всегда есть своего рода смещение. Дальнейшее перемещение изображения только ухудшает его. Похоже, что позиция не изменяется во время обратной анимации, потому что, когда я снова панорамирую изображение, начальная позиция и вращение равно положению и повороту, которые он имел в конце предыдущего движения [хотя на экране положение изображения и вращение изменилось].
Что я здесь делаю неправильно?
Благодаря
отлично! Я думал, что view.center - это свойство только для чтения :) – Krystian