1

我正在尝试使用块动画翻转 UIImageView。许多网站(以及此处的答案)都建议这样做:

flipTile.image = frontImage;

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

不幸的是,这并没有给我预期的结果。我在动画的前半部分完全没有得到任何东西,然后 backImage 翻转到动画的后半部分出现。就像 frontImage 被隐藏或透明一样 - 它不是。

过渡中的某些事情正在把事情搞砸。我究竟做错了什么?

4

2 回答 2

3

这是解决方案,如果其他人将来遇到这个问题:

简而言之,动画块在 my 的当前状态UIImageView和我在该animations部分中设置的状态之间翻转。然而,在调用动画块之前设置图像flipTile,iOS 渲染引擎没有机会UIImageView在动画开始之前更新我的图像。UIImageView因此,我看到了从( nil) 的当前状态到新状态 ( )的动画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
                        */
                    }
     ];
}
于 2013-02-04T03:02:23.117 回答
1

这正是transitionWithView设计的目的。

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

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

于 2013-02-03T18:46:02.593 回答