我正在尝试使用块动画来翻转UIImageView。许多网站(以及SO上的答案)都表明了这一点:
flipTile.image = frontImage;
[UIView transitionWithView: flipTile
duration: 2.5f
options: UIViewAnimationOptionTransitionFlipFromLeft
animations:^(void) {
flipTile.image = backImage;
}
completion:^(BOOL finished) {
}
];
不幸的是,那并没有给我我期望的结果。我对动画的前半部分一无所获,然后backImage翻转到动画的后半部分的外观。这就像frontImage被隐藏或透明 - 它不是。
转型中的某些事情搞砸了。我做错了什么?
答案 0 :(得分:3)
以下是解决方案,如果其他人在将来遇到此问题:
简而言之,动画块在我的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
*/
}
];
}
答案 1 :(得分:1)
这正是transitionWithView
的设计目标。
您描述的行为是frontImage
nil
的症状(或者,正如您所指出的,尚未初始化)。如果尚未使用有效图像初始化并执行动画,则动画的前半部分没有任何内容,您只能看到动画的后半部分。
如果frontImage
不应该是nil
,我会检查(NSAssert
或NSLog
)。如果frontImage
可以nil
,那么,如果nil
将初始图像设置为单独的空白图像,则可以从中创建完整的翻转动画。