Ios 如何滑动和旋转UIImageView动画

Ios 如何滑动和旋转UIImageView动画,ios,objective-c,animation,Ios,Objective C,Animation,我想制作一个动画,将UIImageView移动到设备屏幕上的另一个位置,同时旋转视图 我尝试使用UIView方法,如transitionWithView和animateWithDuration,它们大部分时间都有效,但不是每次都有效 动画似乎会随机运行,因此动画不会从当前位置开始,而是从屏幕外的某个位置滑动到其位置。终点是正确的,如果我在没有动画的情况下设置视图变换,则最终结果是正确的。所以,看起来动画的开始变换时不时会出错 我试图通过使用cGraffeTransformity重置动画之前的视图

我想制作一个动画,将
UIImageView
移动到设备屏幕上的另一个位置,同时旋转视图

我尝试使用
UIView
方法,如
transitionWithView
animateWithDuration
,它们大部分时间都有效,但不是每次都有效

动画似乎会随机运行,因此动画不会从当前位置开始,而是从屏幕外的某个位置滑动到其位置。终点是正确的,如果我在没有动画的情况下设置视图变换,则最终结果是正确的。所以,看起来动画的开始变换时不时会出错

我试图通过使用
cGraffeTransformity
重置动画之前的视图变换来解决此问题,但即使如此,我还是随机看到视图从屏幕外滑入。我也在设备上测试了这个,同样的问题也存在

下面是该案例的简化代码。我正在将转换重置为屏幕上的一个固定点。然后,我创建了一个带有一点向上滑动和旋转的变换,在动画中,我将该变换设置为图像视图。带有run循环的wait标志用于确保在动画完成之前不会从该调用继续执行

-(void) foldAnimation:(int)player {
    // reset view transform
    UIImageView *leftCard = (UIImageView*)[self.view viewWithTag:6];
    leftCard.transform = CGAffineTransformTranslate(CGAffineTransformIdentity, 120.0, 408.0);

    // slide and rotate
    float ySlide = -80.0 + arc4random_uniform(5);
    CGAffineTransform transform1 =  CGAffineTransformTranslate(leftCard.transform, 0.0, ySlide);
    transform1 = CGAffineTransformRotate(transform1, M_PI/180*(arc4random_uniform(7)-2));

    waitFlag = YES;
    [UIView transitionWithView:leftCard
                  duration:0.4
                   options:UIViewAnimationOptionCurveEaseIn
                animations:^{
                    leftCard.transform = transform1;
                }
                completion:^(BOOL finished){
                    waitFlag = NO;
                }];

    NSRunLoop *theRL = [NSRunLoop currentRunLoop];
    while (waitFlag && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);
}

尝试将transitionWithView:there中的选项参数更改为(UIViewAnimationOptionCurveEaseIn | UIViewAnimationOptionBeginFromCurrentState)当现有动画正在进行时可能会发生这种情况。添加UIViewAnimationOptionBeginFromCurrentState并没有解决此问题,但它更清楚地指出动画是从错误的状态开始的。我在重置转换的行之后添加了一个运行循环和一个短暂的等待。现在我可以看到重设发生在UI上,但此后动画每次都从不同的状态开始,即代码中的重设行无效。我也尝试通过[leftCard.layer RemoveAllianimations]进行重设,但也没有效果。图像滑入屏幕的方向表明图像视图的x、y坐标已交换。原因可能是之前在应用程序中使用UIViewAnimationOptionTransitionFlipFromLeft翻转了图像。如果我从变换中移除旋转,我就看不到小故障,所以我改变了设计,只是为了在没有旋转的情况下进行平移。