使用Blocks翻转UIImageView

时间:2013-02-03 17:43:04

标签: ios animation objective-c-blocks

我正在尝试使用块动画来翻转UIImageView。许多网站(以及SO上的答案)都表明了这一点:

flipTile.image = frontImage;

[UIView transitionWithView: flipTile
                  duration: 2.5f
                   options: UIViewAnimationOptionTransitionFlipFromLeft
                animations:^(void) {
                    flipTile.image = backImage;
                }
                completion:^(BOOL finished) {
                }
 ];

不幸的是,那并没有给我我期望的结果。我对动画的前半部分一无所获,然后backImage翻转到动画的后半部分的外观。这就像frontImage被隐藏或透明 - 它不是。

转型中的某些事情搞砸了。我做错了什么?

2 个答案:

答案 0 :(得分:3)

以下是解决方案,如果其他人在将来遇到此问题:

简而言之,动画块在我的UIImageView的当前状态和我在animations部分中设置的状态之间翻转。但是,在调用动画块之前设置flipTile的图像时,iOS渲染引擎在动画开始之前没有机会更新UIImageView。因此,我看到从UIImageViewnil)的当前状态到新状态(backImage)的动画。

要解决这个问题,我需要将控制权返回给iOS一段时间以允许渲染引擎完成它的业务,然后执行动画。

我是这样做的:

- (void)giveHint {
    /*
        other work here
    */

    flipTile.image = currentTileImage;

    [self performSelector:@selector(flipTile) withObject:nil afterDelay: 0.1];
}

- (void)flipTile {
    [UIView transitionWithView: flipTile
                      duration: 0.5
                       options: UIViewAnimationOptionTransitionFlipFromLeft
                    animations:^{
                        flipTile.image = newTileImage;
                    }
                    completion:^(BOOL finished) {
                        /*
                            clean up
                        */
                    }
     ];
}

答案 1 :(得分:1)

这正是transitionWithView的设计目标。

您描述的行为是frontImage nil的症状(或者,正如您所指出的,尚未初始化)。如果尚未使用有效图像初始化并执行动画,则动画的前半部分没有任何内容,您只能看到动画的后半部分。

如果frontImage不应该是nil,我会检查(NSAssertNSLog)。如果frontImage可以nil,那么,如果nil将初始图像设置为单独的空白图像,则可以从中创建完整的翻转动画。