Есть ли способ управлять порядком сортировки при создании нового альбома для сохранения изображений в фотобиблиотеке?

Обзор. Есть ли способ управлять порядком сортировки для альбома, созданного приложением на пользовательском устройстве? Я бы хотел, чтобы альбом, который я создал, сортировался по дате, но он сортируется по порядку загрузки.

Подробности. Я использую функцию 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 ?? "")")
            }
        })
    }
}

person Daniel Patriarca    schedule 08.06.2019    source источник
comment
Я нашел moveAsset в документации для PHAssetCollectionChangeRequest, но я не совсем уверен, как использовать его для правильной сортировки альбома по дате. Чувствуется неуклюже, но я подозреваю, что могу прочитать массив активов в альбоме, создать массив текущего индекса/правильного индекса, а затем переместить их в новое место, если это не является ресурсоемким? developer.apple.com/documentation/photokit/   -  person Daniel Patriarca    schedule 11.06.2019


Ответы (1)


Вместо того, чтобы использовать addAssets, как вы делали в PerformChanges 'albumChangeRequest!.addAssets(assetEnumeration)'.

Вы должны использовать insertAssets в индексах, которые контролируют положение, в котором изображения добавляются в альбом, очень похоже на метод NSArray insertObject atIndex.

Быстрый

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

Цель-C

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

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

person skg    schedule 31.07.2020