具有大图像的UITableViewCell不流畅

时间:2016-12-20 13:36:04

标签: ios objective-c uitableview

我有一个表视图,我想用图像和文本做经典列表。

这是我的cellForRowAtIndexPath。一切都工作正常,没有图像细化,但这对于呈现视图控制器非常缓慢,并且滚动不流畅。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    static NSString *simpleTableIdentifier = @"SimpleTableItem";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    NSDictionary* element = [dataSource objectAtIndex:indexPath.row];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
    }


    NSString* imageUri = [element valueForKey:@"uri"];
    UIImage* image = [UIImage imageWithContentsOfFile:imageUri];
    CGFloat wImg = image.size.width * cell.frame.size.height / image.size.height;

    CGSize newSize = CGSizeMake(wImg, cell.frame.size.height);
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();



    cell.textLabel.text = [ element valueForKey:@"text"];
    cell.imageView.image = newImage;

    return cell;

}

我有大图片(iphone照片),有什么更好的方法呢?

2 个答案:

答案 0 :(得分:2)

不是每次加载单元格时调整大小,如果缓存已调整大小的图像并使用它们,您将获得更好的性能。

答案 1 :(得分:-1)

使用核心图形调整图像大小是非常昂贵的操作,并且正在影响用户体验,导致滚动不流畅。

只需使用图片并设置contentMode

cell.imageView属性即可
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    static NSString *simpleTableIdentifier = @"SimpleTableItem";<br/>
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    NSDictionary* element = [dataSource objectAtIndex:indexPath.row];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
    }


    NSString* imageUri = [element valueForKey:@"uri"];
    UIImage* image = [UIImage imageWithContentsOfFile:imageUri];


    cell.textLabel.text = [ element valueForKey:@"text"];
    cell.imageView.image = newImage;
    cell.imageView.contentMode = UIViewContentModeScaleAspectFill;


    return cell;

}