3

当我使用以下代码从 iphone 加载相册时遇到问题。虽然我加载得很好,但出现的第一张照片是最旧的照片。是否可以重新排列顺序,以便我可以先加载最新的照片,然后是时间,最后是最旧的照片?

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

2 回答 2

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);
        }
    }];
}

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

[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);
}];

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

于 2013-02-13T10:59:29.567 回答
0

如此处所示,您可以从 UIImagePicker 获取图像的实际文件名。由于您似乎能够按日期顺序访问它们,因此对该结果的反向枚举应该可以解决您的问题。希望有帮助...

于 2013-02-13T07:37:33.657 回答