为什么在调用[super prepareForReuse]后,自定义UITableViewCell上的UIImageView中的'animations'属性被删除了?

时间:2014-03-14 06:47:27

标签: ios objective-c uiimageview

最近,我正在制作一个带有动画UIImageView的自定义UITableViewCell来播放动画GIF。在制作过程中,我发现在重复使用单元格后不会显示动画。 似乎UIImageView受[self prepareForReuse]的影响。当我调试它时,我可以获得以下信息。

** before calling [super prepareForReuse] **
(lldb) po self.testImageView  
<UIImageView: 0x1ab681c0; frame = (39 0; 78 61); opaque = NO; autoresize = W+H; userInteractionEnabled = NO; animations = { UIImageAnimation=<CAKeyframeAnimation: 0x1ab77870>; }; layer = <CALayer: 0x1ab68b60>> - (null)

** after calling [super prepareForReuse] **  
(lldb) n  
(lldb) po self.testImageView  
<UIImageView: 0x1ab681c0; frame = (39 0; 78 61); opaque = NO; autoresize = W+H; userInteractionEnabled = NO; layer = <CALayer: 0x1ab68b60>> - (null)  

如图所示,“动画= {UIImageAnimation =;};”已移除。

幸运的是,我可以通过创建一个新的UIImage实例并将其再次设置为UIImageView作为解决方法来解决该问题。为了解决这个问题,重新创建一个UIImage实例不要重用已经设置为UIImageView的实例。

无论如何,我真正想知道的是为什么prepareForReuse方法删除了有关动画的信息。 请让我知道隐藏的方法的内部重用逻辑。

2 个答案:

答案 0 :(得分:0)

致电[super prepareForReuse]后,stopAnimation就会调用self.testImageView。我认为这是正确使用的逻辑,以便可以重复使用单元格。一旦单元格准备好重用,您只需要调用[self.testImageView startAnimation]方法。您无需采用您提到的“变通方法”。

答案 1 :(得分:0)

找到了解决方案。在设置新的(甚至相同的)动画UIImage之前,我必须在prepareForReuse()中将UIImageView的image属性设置为nil。