在 UICollectionView 中显示照片库图像

Displaying photo library images in UICollectionView

我正在尝试显示 UICollectionViewALAssetsLibrary 中照片库中的图像,我的代码运行良好,但我遇到了一些问题。

  1. 缩略图的质量很差。
  2. 如何排列collection视图按顺序显示100张最近的照片 来自

从新到旧。

这是我的代码:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    // collect the photos
    NSMutableArray *collector = [[NSMutableArray alloc] initWithCapacity:0];
    ALAssetsLibrary *al = [ViewController defaultAssetsLibrary];
    [al enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos
                      usingBlock:^(ALAssetsGroup *group, BOOL *stop)
     {
         [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop)
          {
              if (asset) {
                  [collector addObject:asset];
              }
          }];

         self.photos = collector;
     }
                    failureBlock:^(NSError *error) { NSLog(@"error");}];


}



-(void)setPhotos:(NSArray *)photos {
    if (_photos != photos) {
        _photos = photos;
        [_collectionView reloadData];
    }
}


+ (ALAssetsLibrary *)defaultAssetsLibrary {
    static dispatch_once_t pred = 0;
    static ALAssetsLibrary *library = nil;
    dispatch_once(&pred, ^{
        library = [[ALAssetsLibrary alloc] init];
    });
    return library;
}



- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
       return _photos.count;
}


- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *identifier = @"Cell";

    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];

    UIImageView *collectionImageView = (UIImageView *)[cell viewWithTag:100];
    ALAsset *asset = [self.photos objectAtIndex:indexPath.row];


    UIImage* img = [UIImage imageWithCGImage:asset.thumbnail];
    img = [UIImage imageWithCGImage:img.CGImage scale:2.0 orientation:UIImageOrientationUp];

    [collectionImageView setImage:img];


    return cell;
}

您可以通过以下方式获取图像保存在库中的日期:

  NSDate * date = [asset valueForProperty:ALAssetPropertyDate];

您可以将此日期与今天的日期进行比较,并将其存储在一个数组中,对 100 张图像执行相同的操作。

关于你的另一个问题,

您从资产中获取的缩略图 img 的大小取决于 iOS。在 iOS 9 中,它是 75x75,在 iOS 8 中,它是 150x150。

你可以试试这个:

      [UIImage imageWithCGImage:[asset aspectRatioThumbnail]

使用以下代码对照片进行排序。

self.photos = [collector sortedArrayUsingComparator:^NSComparisonResult(ALAsset *first, ALAsset *second) {

   NSDate * date1 = [first valueForProperty:ALAssetPropertyDate];
    NSDate * date2 = [second valueForProperty:ALAssetPropertyDate];

    return [date1 compare:date2];
}];