最近,我正在制作一个带有动画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
方法删除了有关动画的信息。
请让我知道隐藏的方法的内部重用逻辑。
答案 0 :(得分:0)
致电[super prepareForReuse]
后,stopAnimation
就会调用self.testImageView
。我认为这是正确使用的逻辑,以便可以重复使用单元格。一旦单元格准备好重用,您只需要调用[self.testImageView startAnimation]
方法。您无需采用您提到的“变通方法”。
答案 1 :(得分:0)
找到了解决方案。在设置新的(甚至相同的)动画UIImage之前,我必须在prepareForReuse()中将UIImageView的image属性设置为nil。