我的表格中有一个慢滚动,滚动条有从web加载并调整大小的图像,但图像已经加载,所以我不明白为什么滚动变慢。 我已经阅读并尝试slow scrolling of UITableView但没有成功(我看到空单元格)
这是单元格(它还有部分标题编码)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
NSString *data=@"";
NSString *icon;
NSMutableArray *result=[allResults objectAtIndex:indexPath.section];
NSDictionary *dic=[result objectAtIndex:indexPath.row+1];
if([[result objectAtIndex:0] isEqualToString:@"types"])
{
NSString *title=[dic objectForKey:@"title"];
icon=[dic objectForKey:@"icon"];
data=[data stringByAppendingString:[NSString stringWithFormat:@"%@",title]];
}
if([[result objectAtIndex:0] isEqualToString:@"subServices"])
{
NSString *title=[dic objectForKey:@"title"];
icon=[dic objectForKey:@"icon"];
data=[data stringByAppendingString:[NSString stringWithFormat:@"%@",title]];
}
if([[result objectAtIndex:0] isEqualToString:@"businesses"])
{
NSString *title=[dic objectForKey:@"title"];
icon=[dic objectForKey:@"logo"];
data=[data stringByAppendingString:[NSString stringWithFormat:@"%@",title]];
}
cell.textLabel.numberOfLines = 1;
cell.textLabel.text = data;
cell.textLabel.textColor=[UIColor blackColor];
cell.textLabel.font = [UIFont fontWithName:@"Arial Rounded MT Bold" size:22];
cell.textLabel.textColor=[UIColor colorWithRed:122.0/255.0 green:181.0/255.0 blue:196.0/255.0 alpha:1];
cell.imageView.layer.masksToBounds = YES;
//load image
NSURL *url = [NSURL URLWithString:icon];
NSData *imdata = [NSData dataWithContentsOfURL:url];
UIImage *logo=[UIImage imageWithData:imdata scale:1];
UIImage *scaled=[self resizeImage:logo imageSize:CGSizeMake(30, 30)];
cell.imageView.image=scaled ;
cell.imageView.layer.masksToBounds = YES;
cell.imageView.layer.cornerRadius = 12.0;
return cell;
}
答案 0 :(得分:1)
没有单元格中的代码来加载图片,这会减慢您的速度。 一般情况下,您要么预先处理图像下载,以便在单元格创建方法中立即使用它们,或者更改单元格中的代码以将图像加载到后台线程中,这样它们就不会阻止单元格绘制。
查看apple的表格视图编程指南和块编程指南。对不起我在手机上打字的简短回答:)
答案 1 :(得分:1)
首先,图标网址是什么?它是您已下载的本地图像的文件URL吗?如果没有,您希望在后台线程上下载它并将其缓存在本地某处,然后在此处使用该本地文件URL。注意,当文件在后台线程中下载时,您不想重新加载整个表!只需上传与该图像相关的一个单元格(甚至更好的是一个imageView)。否则你将重新加载表格,这将导致其他问题。
接下来,您将在每次通话时调整图像大小。您应该调整一次图像大小并缓存该结果。如果您只在此位置使用该图像,请在下载时调整其大小,并仅缓存该大小调整后的版本。如果您在另一个视图中使用它,请缓存原始版本和调整大小的版本。
而且,虽然是一件小事,但将你的三个if改为if / else ifs。您正在检查相同的值,因此您不需要检查三次。更改订单以便首先检查最常用的选项也可以为您节省一些比较。
<强>更新强>
你可以做的另一件事就是让这个单元配置一次。你每次都要设置字体,颜色等。如果将其移动到单元的子类init方法,则无需反复调用它。
此外,您正在做的一些事情是您不需要做的。使用一些注释检查此更新版本:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString* CellIdentifier = @"Cell";
UITableViewCell* cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier
forIndexPath:indexPath];
// Move this part to the init method of a subclass of UITableViewCell
cell.textLabel.numberOfLines = 1;
cell.textLabel.textColor = [UIColor blackColor];
cell.textLabel.font = [UIFont fontWithName:@"Arial Rounded MT Bold"
size:22];
cell.textLabel.textColor = [UIColor colorWithRed:122.0 / 255.0
green:181.0 / 255.0
blue:196.0 / 255.0
alpha:1];
cell.imageView.layer.masksToBounds = YES;
cell.imageView.layer.cornerRadius = 12.0;
// End of section to move to init methods
NSString* icon = nil;
NSMutableArray* result = [allResults objectAtIndex:indexPath.section];
NSDictionary* dic = [result objectAtIndex:indexPath.row + 1];
if ([[result objectAtIndex:0] isEqualToString:@"types"]) {
icon = [dic objectForKey:@"icon"];
}
else if ([[result objectAtIndex:0] isEqualToString:@"subServices"]) {
icon = [dic objectForKey:@"icon"];
}
else if ([[result objectAtIndex:0] isEqualToString:@"businesses"]) {
icon = [dic objectForKey:@"logo"];
}
cell.textLabel.text = [dic objectForKey:@"title"];
// Move the loading of the URL to a background thread if the url is not a local file URL
//load image
NSURL* url = [NSURL URLWithString:icon];
NSData* imdata = [NSData dataWithContentsOfURL:url];
UIImage* logo = [UIImage imageWithData:imdata
scale:1];
// Move the resizing of the image to however you load the image from the network,
// resize it once and cache the results, load the cached version only
UIImage* scaled = [self resizeImage:logo
imageSize:CGSizeMake(30, 30)];
cell.imageView.image = scaled;
return cell;
}
答案 2 :(得分:1)
作为展示@Andrey Chernukha的回答你同步下载图像,这会导致慢滚动。
要避免此问题,您可以使用 AFNetworking ,这些 AFNetworking 以UIImageView
为特色,以异步模式加载图片,或使用具有相同功能的 SDWebImage ,或者您可以编写NSURLSession
实现来加载内容。