我在UITableView上有包含UIImageView的UITableViewCell时出现了平滑滚动的问题。在StrackOverflow各处都可以找到类似的问题,但是所提出的解决方案都无法帮助我完全摆脱这一滞后。
我的情况很普遍:
我遵循了多个优化技巧,并设法对滚动进行了很多优化。
不幸的是,它仍然不是完美的。这是我的情况:
最初,在开始新的后台线程以在此处获取图像之前(步骤1)是在没有后台线程的情况下进行UIImage缓存检查。在这种情况下,如果我们将图像保存在缓存中,则会立即对其进行分配,这在快速滚动期间会带来很大的延迟(我们将图像分配给通常只要我们立即获取它们就可以)。这些行在下面附上的示例中进行了注释。
仍然有两个问题:
我将新的UIImage分配给UIImageView的时刻。
关于如何处理这两个问题或如何优化我的方案的任何建议,均表示赞赏。
请考虑使用Xamarin编写的示例,但是只要我也对用ObjectiveC编写的应用程序存在相同的问题,我不认为Xamarin是问题的原因。
Smooth Scrolling Test App
最佳答案
你们是否都尝试过只用一张保存在TableView
中的120x120图像填充Bundle
?这样,您可以检查Image rendering
是否出现问题
建议您创建并使用所有图像的缩略图,而不是将所有图像的大小调整为120x120并将其保存在缓存中。您已经以某种方式进行了此操作,但是您已经进行了几次(每次滚动或缓存已满时)。
在我们的上一个项目中,我们有一个带有书套的UICollectionView
。大多数封面的大小在400-800kb之间,滚动时的感觉真的很差。因此,我们为每个图像创建了一个缩略图(缩略图约40-50kb),并使用了缩略图代替了真实的封面。奇迹般有效!我附加了缩略图创建功能
- (BOOL) createThumbnailForImageAtFilePath:(NSString *)sourcePath withName:(NSString *)name {
UIImage* sourceImage = [UIImage imageWithContentsOfFile:sourcePath];
if (!sourceImage) {
//...
return NO;
}
CGSize thumbnailSize = CGSizeMake(128,198);
float imgAspectRatio = sourceImage.size.height / sourceImage.size.width;
float thumbnailAspectRatio = thumbnailSize.height/thumbnailSize.width;
CGSize scaledSize = thumbnailSize;
if(imgAspectRatio >= thumbnailAspectRatio){
//image is higher than thumbnail
scaledSize.width = scaledSize.height * thumbnailSize.width / thumbnailSize.height;
}
else{
//image is broader than thumbnail
scaledSize.height = scaledSize.width * imgAspectRatio;
}
UIGraphicsBeginImageContextWithOptions( scaledSize, NO, 0.0 );
CGRect scaledImageRect = CGRectMake( 0.0, 0.0, scaledSize.width, scaledSize.height );
[sourceImage drawInRect:scaledImageRect];
UIImage* destImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSString* thumbnailFilePath = [[self SOMEDIRECTORY] stringByAppendingPathComponent:name];
BOOL success = [UIImageJPEGRepresentation(destImage, 0.9) writeToFile:thumbnailFilePath atomically:NO];
return success;
}
关于ios - UITableView滚动不流畅,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26310754/