iOS 4升级后,UITableView中的抖动滚动性能

时间:2010-06-26 20:08:46

标签: iphone objective-c uitableview scroll

我在分组的UITableView中有一些大图像。每个部分中有1行用于保存图像,并且每个部分都有关于图像的页眉和页脚文本。我努力让它顺利滚动是iPhone OS 3.x并最终成功。但是......当我升级到iOS 4时,一切都改变了。现在,无论何时加载新单元,都会有非常不稳定的性能。这是我的cellForRowAtIndexPath代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"CellIdentifier";

    UIImageView *photo;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    ApplicationDelegate *appDelegate = (ApplicationDelegate *)[[UIApplication sharedApplication] delegate];

    NSString *fileName = [NSString stringWithFormat:@"%@",[[appDelegate.sectionsDelegateDict objectAtIndex:indexPath.section] objectForKey:@"MainTrackImage"]];
    UIImage *theImage = [UIImage imageNamed:[[appDelegate.sectionsDelegateDict objectAtIndex:indexPath.section] objectForKey:@"MainTrackImage"]];

    imageHeight = CGImageGetHeight(theImage.CGImage);
    imageWidth = CGImageGetWidth(theImage.CGImage);

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        photo = [[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, (imageHeight*320)/imageWidth)] autorelease];
        photo.tag = PHOTO_TAG;
        [cell addSubview:photo];
    } else {
        photo = (UIImageView *) [cell viewWithTag:PHOTO_TAG];
        [photo setFrame:CGRectMake(0, 0, 320, (imageHeight*320)/imageWidth)];
    }

    photo.image = theImage;
    return cell;
}

注意:我尝试使用以下代码代替“imageNamed”方法但没有成功:

UIImage *theImage = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@", bundlePath,fileName]];

我甚至尝试过预先缓存图像,但没有成功。 任何帮助将不胜感激。

更新: 我尝试过使用Grand Central Dispatch来加载图像,方法是创建一个图像队列并异步加载它们:

dispatch_async(_image_queue, ^{
photoImageView.image = [imageCacheNS objectForKey:imageString];});

我遇到的问题是图像加载非常缓慢,当我滚动表格时,先前查看的图像会显示几秒钟,直到加载新图像。

更新2: 我仍然无法完成这项工作。我现在正在研究使用drawRect方法绘制单元格。我希望这会改善滚动性能。 Apple的tableViewSuite示例代码示例#5显示了如何执行此操作,但我无法找到如何使我的项目工作。任何人都有使用drawRect的经验:将图像加载到tableview中吗?

谢谢!

4 个答案:

答案 0 :(得分:1)

尝试在另一个线程中加载图像。这将有助于提高表视图(和其他UI元素)的响应能力。在这里,块和libdispatch将成为您代码的绝佳补充。

答案 1 :(得分:1)

Apple的LazyTableImages示例代码可能有所帮助。 http://developer.apple.com/iphone/library/samplecode/LazyTableImages/Introduction/Intro.html

显示如何在不阻止UI的情况下加载图像。

答案 2 :(得分:1)

你的问题:“我得到的问题是图像加载非常缓慢,当我滚动表格时,先前查看的图像会显示几秒钟,直到加载新图像。”打赌那是因为图像单元格正在被重复使用,但是在它不是零的情况下,你不会将图像属性设置为nil以清除旧图像属性。只是猜测,因为您的代码显然现在与上面发布的代码不同。

BTW - 我还没有使用过块,因为它们需要iOS 4(除非你使用非苹果编译器,即PLBlocks)并且我一直在编写应用程序以支持3.x.以防万一你现在只针对4.x进行构建,并且可能没有意识到你编写的代码在iOS 3.x(例如iPad暂时)上是不可行的。显然,您可以根据运行时的操作系统版本等来执行条件代码。

答案 3 :(得分:0)

经过大量的工作和与Apple开发人员的多次沟通支持后,我终于开始了这项工作。我现在正在后台的tableview中加载非常大的图像,并且具有非常快的滚动性能。

基本上,我遵循了WWDC 2010示例代码“CoreAnimationImageBrowser”中的部分代码。它专为iPad而设计,基于自定义scrollView而不是tableView,但ImageScrollView类是用于加载图像的类。

然后,我必须要做的非常奇怪的事情是,无法在tableView中预加载单元格的事实是将图像添加为子视图BEHIND tableView。当表格滚动时,图像已经加载并且可以快速加载。

一种奇怪的黑客,但Apple Tech似乎认为它很好。

祝所有试图这样做的人好运。我花了很多时间才弄明白。