PHAssets/PHAssetCollection/PHCollectionList и папки

Я следую примеру кода Apple «ExampleappusingPhotosframework».

В теме PHAssets/PHAssetCollection я заметил возможность присутствия «Папки». Они могут появиться из-за того, что они были созданы в приложении Mac Photo или более старом приложении iPhoto и т. Д. ....

Есть вероятность, что в папке присутствует количество PHAssetCollection, и эта папка может содержать неизвестные уровни вложенных папок, заканчивающиеся альбомом(ами) в конце.

Таким образом, даже приведенный выше пример проекта дает сбой, если у меня есть вложенные папки в библиотеке фотографий. Большинство приложений просто игнорируют и вообще не показывают эти папки.

Например, скажем, этот пример существует:

введите здесь описание изображения

Уровень папки 1 > Уровень папки 2 > Пользовательский альбом > Изображение1, Изображение2

Как с этим справляется приложение iOS Photos:

введите здесь описание изображения

Задача

В списке корневых альбомов под альбомами пользователей должна отображаться папка «Уровень 1». Когда это нажато, я хочу перечислить все изображения из всех подпапок независимо от подуровней.....

viewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()

    let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(self.addAlbum))
    self.navigationItem.rightBarButtonItem = addButton


    // Create a PHFetchResult object for each section in the table view.
    let allPhotosOptions = PHFetchOptions()
    allPhotosOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]
    allPhotos = PHAsset.fetchAssets(with: allPhotosOptions)
    smartAlbums = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .albumRegular, options: nil)
    userCollections = PHCollectionList.fetchTopLevelUserCollections(with: nil)
    PHPhotoLibrary.shared().register(self)

}

cellForRowAt:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    switch Section(rawValue: indexPath.section)! {
        case .allPhotos:
            let cell = tableView.dequeueReusableCell(withIdentifier: CellIdentifier.allPhotos.rawValue, for: indexPath)
            cell.textLabel!.text = NSLocalizedString("All Photos", comment: "")
            return cell

        case .smartAlbums:
            let cell = tableView.dequeueReusableCell(withIdentifier: CellIdentifier.collection.rawValue, for: indexPath)
            let collection = smartAlbums.object(at: indexPath.row)
            cell.textLabel!.text = collection.localizedTitle
            return cell

        case .userCollections:
            let cell = tableView.dequeueReusableCell(withIdentifier: CellIdentifier.collection.rawValue, for: indexPath)
            let collection = userCollections.object(at: indexPath.row)

            cell.textLabel!.text = collection.localizedTitle
            return cell
    }
}

Перейти:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    guard let destination = (segue.destination as? UINavigationController)?.topViewController as? AssetGridViewController
        else { fatalError("unexpected view controller for segue") }
    let cell = sender as! UITableViewCell

    destination.title = cell.textLabel?.text

    switch SegueIdentifier(rawValue: segue.identifier!)! {
        case .showAllPhotos:
            destination.fetchResult = allPhotos
        case .showCollection:

            // get the asset collection for the selected row
            let indexPath = tableView.indexPath(for: cell)!
            let collection: PHCollection
            switch Section(rawValue: indexPath.section)! {
                case .smartAlbums:
                    collection = smartAlbums.object(at: indexPath.row)
                case .userCollections:
                    collection = userCollections.object(at: indexPath.row)
                default: return // not reached; all photos section already handled by other segue
            }

            // configure the view controller with the asset collection
            guard let assetCollection = collection as? PHAssetCollection
                else { fatalError("expected asset collection") }
            destination.fetchResult = PHAsset.fetchAssets(in: assetCollection, options: nil)
            destination.assetCollection = assetCollection
    }
}

Вопрос

assetsCollection?. canContainCollections кажется решающим фактором. Однако как мне получить все содержащие PHAssets в папке, независимо от подуровней/подпапок? (Это невозможно, так как даже в стандартном приложении есть «Все фотографии» внутри уровня 1)


person Gizmodo    schedule 02.02.2017    source источник
comment
Несколько второстепенно по отношению к вашей проблеме, но если вы обнаружите сбой в примере кода Apple, вы должны сообщить об этом.. , тогда, возможно, в следующий раз, когда они обновят образец, у него будет решение вашей проблемы.   -  person rickster    schedule 02.02.2017
comment
Что ж, согласно их примеру кода, он вылетает, если у вас есть папка и вы пытаетесь войти в нее; Тем не менее, я все еще хочу, чтобы все работало с папками в Фото.   -  person Gizmodo    schedule 03.02.2017
comment
Об ошибке сообщили в Apple.   -  person Gizmodo    schedule 03.02.2017
comment
у меня такая же проблема. любое решение тогда дайте мне   -  person Rajesh    schedule 27.04.2019


Ответы (1)


С текущими API-интерфейсами разработчиков (PhotoKit) нет простого способа (например, с помощью одного запроса) перечислить все ресурсы в папке (и ее подпапках/альбомах). Однако вы можете рекурсивно перечислить все альбомы в папке и ее подпапках, а затем поместить результаты в один массив. Однако это может быть медленным в зависимости от количества уровней и ресурсов, содержащихся во вложенной структуре. Обратите внимание, что папка на любом уровне также может содержать альбом (например, в папке «Папка уровня 1» помимо папки «Папка уровня 2» может быть еще и альбом). Приложение Apple Photos не использует PhotoKit, поэтому я предполагаю, что у них есть способ сделать это с помощью одного запроса.

person holtmann    schedule 09.02.2017
comment
Apple не использует PhotoKit для этого? Как именно вы это знаете? Похоже, мне придется проходить уровень за уровнем... - person Gizmodo; 09.02.2017
comment
Многие функции приложения «Фотографии» недоступны в PhotoKit. Они используют свои собственные частные API для фотографий. - person holtmann; 10.02.2017