0

我在我的应用程序的 UICollectionView 中显示图片的缩略图(来自互联网)。当有太多(比如 20+)和太高分辨率的图像时,应用程序就会崩溃。在内存管理方面,我有点业余。我的问题是我是否应该通过内存管理或以某种方式缩放图像来解决这个问题(如果我这样做,我怀疑图像不会在 UIViewContentModeScaleAspectFill 中)?

现在我正在使用SDWebImage加载我的图像。

- (UICollectionViewCell*)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"thumbCell" forIndexPath:indexPath];
    NSString *URL = [self.album.imageURLs objectAtIndex:(indexPath.item+1)];

    UIImageView *iv = [[UIImageView alloc] initWithFrame:CGRectMake(80, 80, 277, 58)];
    iv.backgroundColor = [UIColor clearColor];
    iv.opaque = NO;
    iv.contentMode = UIViewContentModeScaleAspectFill;
    [iv setImageWithURL:[NSURL URLWithString:URL]];
    cell.backgroundView = iv;

    return cell;
}
4

1 回答 1

4

主要问题是,当您将单元格出列时,您正在为集合视图中的每个项目分配和初始化一个新的图像视图。

相反,您应该创建自己的图像单元类:

@interface CollectionViewImageCell : UICollectionViewCell
@property (nonatomic) UIImageView *imageView;
@end

@implementation CollectionViewImageCell

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [self setupImageView];
    }
    return self;
}

#pragma mark - Create Subviews

- (void)setupImageView {
    self.imageView = [[UIImageView alloc] initWithFrame:self.bounds];
    self.imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    // Configure the image view here
    [self addSubview:self.imageView];
}

@end

然后,在注册这个类之后,你的cellForItemAtIndexPath:方法看起来像这样:

- (UICollectionViewCell*)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{

    CollectionViewImageCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"thumbCell" forIndexPath:indexPath];

    NSString *URL = [self.album.imageURLs objectAtIndex:(indexPath.item+1)];
    [cell.imageView setImageWithURL:[NSURL URLWithString:URL]];
    return cell;
}

我对 SDWebImage 不是很熟悉,我倾向于为此使用AFNetworking,但我也会确保您设置了图像缓存。

如果您仍然遇到与内存相关的崩溃甚至滚动性能的问题,那么您可能需要有更好的图像加载策略,并且可能需要在服务器端重新缩放/重新采样图像。

于 2013-04-01T11:36:27.973 回答