摘要: 有没有办法控制由用户设备上的应用创建的相册的排序顺序?我希望我创建的专辑按日期排序,但按下载顺序排序。
详细信息:
我正在使用下面的功能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 ?? "")")
}
})
}
}
答案 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;