如何将旋转和移动的UIView动画恢复到其原始位置?

4
我有一个带有平移手势识别器的UIImageView,根据用户的操作进行移动和旋转。 当用户松开手指时,我希望它能够动画回到原始位置,以下是我的代码:
- (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)));

    }

}

但它从未回到原始位置。它总是有一些偏移。图像视图的进一步移动只会使情况变得更糟。 看起来在后退动画期间位置没有被修改,因为当我再次平移图像时,起始位置和旋转角度等于先前移动结束时的位置和旋转角度[尽管在屏幕上图像的位置和旋转角度已经改变]。

我在这里做错了什么?

谢谢

1个回答

4
在UIGestureRecognizerStateEnded状态下,可以尝试像这样做:
recognizer.view.transform = CGAffineTransformIdentity;
recognizer.view.center = CGPointMake(startX,startY);

太好了!我以为view.center是只读属性 :) - Krystian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接