在表视图中慢速滚动

时间:2014-03-19 13:56:13

标签: objective-c

我的表格中有一个慢滚动,滚动条有从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;
}

3 个答案:

答案 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实现来加载内容。