gpt4 book ai didi

ios - 如何动画旋转和移动 UIView 到其原始位置?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:56:46 26 4
gpt4 key购买 nike

我有一个带有平移手势识别器的 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)));

}

}

但它永远不会回到原来的位置。它总是有某种偏移量。 ImageView 的进一步移动只会使情况变得更糟。看起来位置在后退动画期间没有修改,因为当我再次平移图像时,开始位置和旋转等于它在上一次移动结束时的位置和旋转[即使在屏幕上图像位置和轮换已更改]。

我在这里做错了什么?

谢谢

最佳答案

在 UIGestureRecognizerStateEnded 状态下尝试这样的事情:

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

关于ios - 如何动画旋转和移动 UIView 到其原始位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34806316/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com