创建新相册将图像保存到照片库时,是否可以控制排序顺序?

时间:2019-06-08 08:33:07

标签: swift uiimage phasset phphotolibrary

摘要: 有没有办法控制由用户设备上的应用创建的相册的排序顺序?我希望我创建的专辑按日期排序,但按下载顺序排序。

详细信息: 我正在使用下面的功能save()将UIImage保存到用户iPhone上的相册中。它的效果很好,但是保存副本时图像失去了原始的创建时间。为了解决这个问题,我在将图像上传到服务器时读取了创建时间。这样,我就可以在使用assetChangeRequest.creationDate = storedImageDate

创建资产时将其分配给图像
    PHPhotoLibrary.shared().performChanges({
        let assetChangeRequest = PHAssetChangeRequest.creationRequestForAsset(from: image)
        let assetPlaceholder = assetChangeRequest.placeholderForCreatedAsset
        let albumChangeRequest = PHAssetCollectionChangeRequest(for: assetCollection)
        assetChangeRequest.creationDate = storedImageDate
        let assetEnumeration:NSArray = [assetPlaceholder!]
        albumChangeRequest!.addAssets(assetEnumeration)

    }, completionHandler: { success, error in
        if error != nil {
            print("\(error?.localizedDescription ?? "")")
        }
    })

上面的方法效果很好,当我查看新创建的图像时,它位于创建的相册中,这些图像在图像上具有正确的日期,并且在相机胶卷中查看的图像按预期的图像创建日期排序。当转到我的应用为图像创建的相册时,就会出现问题。图像上有图像日期,但按下载顺序而不是图像排序。我还注意到,当我长按相册中的图像时,它可以使顺序移动。

创建相册时我做错了吗?我可以将其设置为按图像日期排序吗?也许有一种方法可以更改我的相册的排序顺序?有没有一种方法可以通过相册获取循环以按日期排序?

这是将图像保存到创建的相册中的完整功能,该相册不会按图像创建日期排序。

func save(image:UIImage, albumName:String) {
    var albumFound = false
    var assetCollection: PHAssetCollection!
    var assetCollectionPlaceholder: PHObjectPlaceholder!

    // https://stackoverflow.com/questions/27008641/save-images-with-phimagemanager-to-custom-album
    // Check if the Album exists and get collection
    let fetchOptions = PHFetchOptions()
    fetchOptions.predicate = NSPredicate(format: "title = %@", albumName)
    let collection : PHFetchResult = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .any, options: fetchOptions)

    if let _: AnyObject = collection.firstObject {
        albumFound = true
        assetCollection = collection.firstObject
    } else {
        //If not found - Then create a new album
        PHPhotoLibrary.shared().performChanges({
            let createAlbumRequest : PHAssetCollectionChangeRequest = PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle: albumName)
            assetCollectionPlaceholder = createAlbumRequest.placeholderForCreatedAssetCollection
        }, completionHandler: { success, error in
            albumFound = success
            if (success) {
                let collectionFetchResult = PHAssetCollection.fetchAssetCollections(withLocalIdentifiers: [assetCollectionPlaceholder.localIdentifier], options: nil)
                print(collectionFetchResult)
                assetCollection = collectionFetchResult.firstObject
            }
        })
    }
    if albumFound {
        PHPhotoLibrary.shared().performChanges({
            let assetChangeRequest = PHAssetChangeRequest.creationRequestForAsset(from: image)
            let assetPlaceholder = assetChangeRequest.placeholderForCreatedAsset
            let albumChangeRequest = PHAssetCollectionChangeRequest(for: assetCollection)
            assetChangeRequest.creationDate = storedImageDate
            let assetEnumeration:NSArray = [assetPlaceholder!]
            albumChangeRequest!.addAssets(assetEnumeration)

        }, completionHandler: { success, error in
            if error != nil {
                print("\(error?.localizedDescription ?? "")")
            }
        })
    }
}

1 个答案:

答案 0 :(得分:0)

与其像在performChanges'albumChangeRequest!.addAssets(assetEnumeration)'中一样使用addAssets。

您应该在用于控制将图像添加到相册的位置的索引处使用insertAssets,就像NSArray insertObject atIndex方法一样。

迅速

func insertAssets(_ assets: NSFastEnumeration, 
             at indexes: IndexSet)

Objective-C

- (void)insertAssets:(id<NSFastEnumeration>)assets 
       atIndexes:(NSIndexSet *)indexes;

https://developer.apple.com/documentation/photokit/phassetcollectionchangerequest/1619447-insertassets