UITableview + 来自 ipod 库的图像产生不连贯的滚动。有解决方法吗?

Posted

技术标签:

【中文标题】UITableview + 来自 ipod 库的图像产生不连贯的滚动。有解决方法吗?【英文标题】:UITableview + images from ipod library yielding choppy scrolling. Are there workarounds? 【发布时间】:2012-03-12 20:28:35 【问题描述】:

我有一个 UITableView,它正在从 MPMediaQuery 加载专辑列表。一切工作正常,直到我注意到一张带有非方形专辑封面的专辑将内置单元格视图的标签文本推向右侧。注意到这是我的失败,因为在此过程中我还注意到滚动不太流畅。

我用笔尖做了一个单元,解决了定位问题,但性能仍然受到影响。在这一点上,我开始进行大量的研究,并尽我所能去实施。

首先是来自 nib 的单元格,带有一个图像视图和两个标签 为了纠正 imageview 中奇怪的缩放,我在 uiview 中添加了 imageview 来裁剪它(对性能没有真正的影响)。 加载图像时未进行任何后期处理,性能仍然不稳定。 在-(void)drawRect 中实现了单元格(如Apple 的TableViewSuite 示例#5 中的示例),从tableview 传递图像。最初只加载了前约 8 张图片,性能只是略微卡顿。 然后我设置 [myCell setNeedsDisplay] 让它重绘单元格,这样所有其他图像都能正确显示,性能又下降了。我也尝试只用图像重绘部分而不做任何更改。 这种仅使用一张静态图像的方法产生了完美的性能。

我已经确保所有正常的东西,如 cellIdentifier 等都是正确的,如果单元格视图只有文本,它可以完美滚动。

下面找到使用默认单元格视图之一的 tableviewcell 的实现,以说明我当前如何为单元格抓取图像:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

// Cell initizalation
static NSString *CellIdent = @"CellIdent";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdent];
if (cell == nil) 
    cell = [[UITableViewCell alloc]
            initWithStyle:UITableViewCellStyleSubtitle
            reuseIdentifier:CellIdent];


cell.imageView.image = [[[[albumList
                       objectAtIndex:indexPath.section]objectAtIndex:indexPath.row] valueForProperty:MPMediaItemPropertyArtwork]imageWithSize:CGSizeMake(0,56)];
//it seems to scale with a sharper image if CGSizeMake has a value, rather than 
//CGSizeZero. It doesn't actually do any scaling at this point, which I initially thought
//it would, but the results were more what I wanted so...

return cell;



在 Apple 的 ipod 应用程序中,带有像丝绸一样的艺术卷轴的专辑列表,很明显,我错过了一些东西。

【问题讨论】:

你正在分配你的 UITableViewCell 但你没有释放它。我建议在 alloc 行添加一个自动释放。 我正在使用 ARC,加上这会导致崩溃(至少,这就是我认为它崩溃的原因)=) 【参考方案1】:

这个答案会有所帮助:

Tricks for improving iPhone UITableView scrolling performance?

特别注意第 3 步:

在 UITableViewCell 的 drawRect 中绘制所有内容:如果可能,不惜一切代价避免子视图(或者如果您需要标准的可访问性功能,则使用内容视图的 drawRect:)

示例:

- (void)drawRect:(CGRect)rect 
   [yourImage drawAtPoint:CGPointMake(0,0)];

如果您自己绘制图像,您可以找到 Apple 的示例应用程序来说明性能提升:

https://developer.apple.com/library/ios/#samplecode/AdvancedTableViewCells/Introduction/Intro.html#//apple_ref/doc/uid/DTS40009111

如果您想要完整而清晰的解释,请查看此 WWDC 会议,其中详细介绍了 UITableViewPerformance:

https://developer.apple.com/videos/wwdc/2010/?id=128

【讨论】:

我实际上提到我在第二段中尝试过,但无济于事。 [image drawAtPoint:point]; 目前是 drawrect 方法中的内容,但我仍然会受到性能影响。我是否需要以某种方式预先缓存图像,或者有没有办法让更多单元格排队或在不同的线程中合成单元格?

以上是关于UITableview + 来自 ipod 库的图像产生不连贯的滚动。有解决方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用用户的 iPod 库艺术家索引 UITableView?

像 iPod 应用一样使用 UITableView 气泡/标注

在 iPod 库的本地通知中播放声音

eplan p8 图框库的创建

如何在 iOS 中从 UITableView 播放选定的媒体项?

如何将来自 OpenAL 的音频与 iPod 音乐混合?