如何滑动和旋转UIImageView动画

时间:2015-01-18 18:59:51

标签: ios objective-c animation

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

我尝试使用UIViewtransitionWithView之类的animateWithDuration方法,但它们大部分时间都有效,但不是每次都有效。

动画似乎随机运行,以便动画不会从当前位置开始,而是UIImageView从屏幕外的某个位置滑动到其位置。结束点是正确的,如果我设置视图变换没有动画,最终结果是正确的。所以,它看起来就像现在一样,然后动画的起始变换搞砸了。

我试图通过在CGAffineTransformIdentity动画之前重置视图变换来解决这个故障,但即使这样我也会随机看到视图从屏幕外滑入。我也在设备上对此进行了测试,并且存在同样的问题。

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

-(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]]);
}

0 个答案:

没有答案