如何显示从最新到最旧排列的相册

Cla*_*nce 3 iphone xcode uiimagepickercontroller ipad ios

当我使用下面的代码从iphone加载相册时,我遇到了问题.虽然我装的很完美,但第一张照片出现的却是最古老的照片.是否可以重新排列顺序,以便我可以先获取最新的照片,然后是时间,最后的是后面的照片?

- (IBAction)imageFromAlbum:(id)sender
  {    
    imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.delegate = self;
    imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
    [self presentViewController:imagePicker animated:YES completion:nil];
  }
Run Code Online (Sandbox Code Playgroud)

dev*_*luv 5

要实现您的目标,您必须使用资产库框架创建自己的自定义照片选择器.根据您使用的ios版本,您可以使用UICollectionViewController(ios6以上)或者必须创建自己的版本.

要获取已保存照片相册中的所有照片/资源,请执行此方法,然后使用属性ALAssetPropertyDate按降序顺序使用创建日期对对象进行排序

thisVC.assetArray将是您的自定义表或集合视图控制器的数据源.这两个方法是异步的,因此一旦数据源完成,您将需要刷新tableView或collectionView

__block YourViewController *thisVC = self;
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
        if (group) {
            [self enumerateAssetForGroup:group forFilter:[ALAssetsFilter allPhotos] withCompletionBlock:^(id object) {
                thisVC.assetArray = object;
                [thisVC.assetArray sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
                            NSDate *date1 = [obj1 valueForProperty:ALAssetPropertyDate];
                            NSDate *date2 = [obj2 valueForProperty:ALAssetPropertyDate];

                            return ([date1 compare:date2] == NSOrderedAscending ? NSOrderedDescending : NSOrderedAscending);
                 }];
                //in case of table
                [thisVC.tableView reloadData];
                //in case of collection view
                //reload collection view controller data
            }];
        }
    } failureBlock:nil];


- (void)enumerateAssetForGroup:(ALAssetsGroup*)group forFilter:(ALAssetsFilter*)filter withCompletionBlock:(ALAssetsEnumeration)enumerationCompletionBlock {

    [group setAssetsFilter:filter];
    __block NSInteger assetsCount = [group numberOfAssets];
    __block NSMutableArray *assetArray = [[NSMutableArray alloc] init];
    [group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
        if (result) {
            [assetArray addObject:result];
            if (*stop) {
                enumerationCompletionBlock(assetArray);
                [assetArray release];
            }
        }
        else if (assetsCount == 0) {
            enumerationCompletionBlock(nil);
        }
    }];
}
Run Code Online (Sandbox Code Playgroud)

用第一种方法编写的这部分将按降序对数组进行排序,

[thisVC.assetArray sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
                NSDate *date1 = [obj1 valueForProperty:ALAssetPropertyDate];
                NSDate *date2 = [obj2 valueForProperty:ALAssetPropertyDate];

                return ([date1 compare:date2] == NSOrderedAscending ? NSOrderedDescending : NSOrderedAscending);
}];
Run Code Online (Sandbox Code Playgroud)

试试这个,如果你真的想:)