UICollectionView - 如何增加要分配的单元格数

时间:2014-12-03 10:40:19

标签: ios objective-c uicollectionviewcell

我的UICollectionView有一个非零的contentInset

self.collectionView.contentInset = UIEdgeInsetsMake(self.mainNavigation.bounds.size.height, 0, 0, 0);

MainNavigation是一个透明的navigationBar - 一旦用户向下滚动,可以通过MainNavigation部分地看到collectionView。初始化更多单元格,因为collectionView的“屏幕上”框架已增加(这些新单元格未出列)。

单元格的初始化非常昂贵,导致UI滞后。

我需要的是collectionView最初将更多单元格加载到内存中,以便初始滚动更顺畅。

如何增加最初加载的单元格数量?

2 个答案:

答案 0 :(得分:1)

我认为您不需要加载更多单元格,因为这是自然行为。如果您的滚动不顺畅,可能是因为您没有正确地将图像加载到单元格中。

您必须应用lazy loading pattern。例如,您可以执行以下操作(假设您设置了NSMutableDictionary* imageDic = [[NSMutableDictionary alloc] init];,您的单元格具有属性@property(nonatomic, retain) UIImageView *imageView;,并且您正在使用AFNetworking

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

UICollectionViewCell *cell = [collectionView_ dequeueReusableCellWithReuseIdentifier:@"identifier" forIndexPath:indexPath];

NSString* cellKey = [NSString stringWithFormat:@"%d_%d", indexPath.section, indexPath.row];
NSString* imgName = [cellKey stringByAppendingPathExtension:@"jpg"];
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString* imagePath = [documentsDirectory stringByAppendingPathComponent:imgName];

BOOL isDirectory = NO;
NSFileManager* fm = [NSFileManager defaultManager];

// set image with image in cache (it will be fast!)
if ([imageDic objectForKey:cellKey])
{
    UIImage *img = [imageDic objectForKey:cellKey];
    cell.imageView.image = img;
}
// set image with image saved in document directory and put it in cache
else if ([fm fileExistsAtPath:imagePath isDirectory:&isDirectory])
{
    UIImage *img = [UIImage imageWithContentsOfFile:imagePath];
    cell.imageView.image = img;
    [imageDic setObject:img forKey:cellKey];
}
// download image at imageURL, save it and put it in cache too. Until then set image with a placeholder
else
{
    __weak UICollectionViewCell* weakCell = cell;
    [cell.imageView setImageWithURLRequest:[NSURLRequest requestWithURL:imageURL] placeholderImage:[UIImage imageNamed:@"placeholder"] success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
        weakCell.imageView.image = image;
        [weakCell setNeedsLayout];

        [imageDic setObject:img forKey:cellKey];
        [UIImageJPEGRepresentation(img, 1.f) writeToFile:imagePath atomically:YES];
    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
        NSLog(@"failed to dl image");
    }];
}

return cell;
}

答案 1 :(得分:0)

无法做到这一点。

你能做的是:

  1. 优化单元格代码并从初始化中删除重要部分,可能会延迟某些操作直到滚动停止。

  2. 为子视图使用纯色背景并为view.opaque设置正确的值。它在滚动时提供了良好的性能提升。您可以在模拟器中调试“颜色混合图层”选项。你会看到以绿色和红色呈现的命中和未命中。

  3. 如果您使用自定义CALayers,请在/如果它们是静态时尝试栅格化。

  4. 如果委托在返回单元格之前执行繁重的操作,则缓存数据。