我正在构建一个类似于iPod.app的专辑浏览视图的UITableView:
在第一次启动时,我将所有艺术家和专辑的艺术品从iPod库中导入。将所有内容保存到CoreData中并重新获取到NSFetchedResultsController中。我重复使用单元格标识符,并在我的cellForRowAtIndexPath:
方法中添加了以下代码:
Artist *artist = [fetchedResultsController objectAtIndexPath:indexPath];
NSString *identifier = @"bigCell";
SWArtistViewCell *cell = (SWArtistViewCell*)[tableView dequeueReusableCellWithIdentifier:identifier];
if (cell == nil)
cell = [[[SWArtistViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease];
cell.artistName = artist.artist_name;
cell.artworkImage = [UIImage imageWithData:artist.image];
[cell setNeedsDisplay];
return cell;
我的SWArtistViewCell单元格实现了drawRect:
方法来绘制字符串和图像:
[artworkImage drawInRect:CGRectMake(0,1,44,44)]
[artistName drawAtPoint:CGPointMake(54, 13) forWidth:200 withFont:[UIFont boldSystemFontOfSize:20] lineBreakMode:UILineBreakModeClip];
滚动仍然很卡顿,我就是想不明白为什么。像iPod和Twitter这样的应用程序具有非常流畅的滚动效果,但它们都像我一样在单元格中绘制了一些小图像。
我的所有视图都是不透明的。我错过了什么?
编辑:这是Shark的内容:
我不熟悉Shark。这些符号与什么相关?当我查看这些的跟踪时,它们都指向我的drawRect:方法,特别是UIImage绘制。
如果窒息点是文件读取,它会指向其他东西吗?它肯定是绘图吗?
编辑:保留图像
我已经按照pothibo建议的方式添加了一个artworkImage方法到我的Artist类中,该方法保留了使用imageWithData:创建的图像。
- (UIImage*)artworkImage {
if(artworkImage == nil)
artworkImage = [[UIImage imageWithData:self.image] retain];
return artworkImage;
}
所以现在我可以直接将保留的图像设置为我的TableViewCell,如下所示:
cell.artworkImage = artist.artworkImage;
我还在我的tableViewCell类的setArtworkImage:方法中设置了setNeedsDisplay。滚动仍然很卡顿,Shark显示的结果完全相同。