单元格中的 UITableView 动画导致平滑滚动中断

Posted

技术标签:

【中文标题】单元格中的 UITableView 动画导致平滑滚动中断【英文标题】:UITableView Animation in cell causes smooth scrolling to break 【发布时间】:2011-07-30 17:37:58 【问题描述】:

我有一个带有自定义 UITableViewCells 的 UITableView。每个单元格异步加载图像并显示它,这一切都很好,并且表格视图可以完美滚动。

我现在向单元格图像添加了“淡入”动画,但这会破坏表格 滚动。当我轻弹时,只要图像想要“淡入”,tableview 的滚动动画就会停止。几乎就好像单元格图像上新引入的“淡入”中断了滚动动画。

有没有办法绕过这个?这是常见的行为,还是我做了一些非常奇怪的事情?

这是图像异步加载完成后调用的回调函数(动画函数)。

-(void)imageReady:(UIImage *)image FromUrl:(NSString *)url

    [UIView animateWithDuration:0.3 animations:^
    
        [self.imageThumbnail setImage:image];
        self.imageThumbnail.alpha = 1;
    ]; 


我在较早的阶段将 alpha 设置为 0。

感谢所有帮助。

【问题讨论】:

【参考方案1】:

就我而言,它只需要 animateWithDuration 调用中的“UIViewAnimationOptionAllowUserInteraction”选项。

[UIView animateWithDuration:0.3 delay:0.0 options:(UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction) animations:^
        
            self.imageThumbnail.alpha = 1;
         completion:nil];

【讨论】:

哇,我要花很长时间才能弄清楚这一点。这个选项似乎在 ios 4 中默认禁用,但在 iOS 5 中默认启用。【参考方案2】:

由于UITableView 继承自UIScrollView,我将实现UIScrollViewDelegate 方法,-scrollViewDidScroll:-scrollViewDidEndDecelerating:。此外,我会在您的课程中添加一个 BOOL,例如 shouldPerformAnimations

现在在-scrollViewDidScroll 中,将shouldPerformAnimations 设置为NO。或者在-scrollViewDidEndDecelerating:中将其设置为YES

现在您所要做的就是在imageReady:fromURL: 中执行动画之前检查shouldPerformAnimations。这个想法是,如果单元格正在滚动,那么执行用户永远不会看到的动画是没有意义的。因此,通过这样做,我们只需等到 table view 停止滚动,然后我们对所有可见单元格执行动画。您可以使用UITableView 上的-indexPathForVisibleRows 方法获取可见单元格的索引路径数组。

【讨论】:

以上是关于单元格中的 UITableView 动画导致平滑滚动中断的主要内容,如果未能解决你的问题,请参考以下文章

弹出键盘时如何为 UITableView 设置动画?

滚动时取消 UITableView 中的动画

自定义 UITableViewCell 中的 UIButton 导致在多个单元格中选择按钮

如何知道 UITableView 已完成将数据加载到单元格中? [复制]

单元格中的 CGAffineTransform 动画不起作用

如何使用 UIImage 从 tableview 单元格中的 url 平滑滚动