Как получить название альбома фотографий, количество изображений в Swift?

Я создаю приложение Gallery, как стандартное приложение Photos для iOS. (Swift 4.1)

Я хочу получить эскизы, заголовки и общее количество изображений, которые я вижу при запуске стандартного приложения для фотографий.

Рамка для фотографий кажется более сложной, чем я думал.

Нелегко найти способ объяснить, почему и к каким процедурам следует подходить.

Можете ли вы рассказать мне об этом?

2 ответа

Решение

Минимальное количество шагов для достижения того, что вы просите:

  // import the framework
  import Photos

  // get the albums list
  let albumList = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .albumRegular, options: nil)

  // you can access the number of albums with
  albumList.count
  // individual objects with
  let album = albumList.object(at: 0)
  // eg. get the name of the album
  album.localizedTitle

  // get the assets in a collection
  func getAssets(fromCollection collection: PHAssetCollection) -> PHFetchResult<PHAsset> {
    let photosOptions = PHFetchOptions()
    photosOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]
    photosOptions.predicate = NSPredicate(format: "mediaType == %d", PHAssetMediaType.image.rawValue)

    return PHAsset.fetchAssets(in: collection, options: photosOptions)
  }

  // eg.
  albumList.enumerateObjects { (coll, _, _) in
        let result = self.getAssets(fromCollection: coll)
        print("\(coll.localizedTitle): \(result.count)")
    }

  // Now you can:
  // access the count of assets in the PHFetchResult
  result.count

 // get an asset (eg. in a UITableView)
 let asset = result.object(at: indexPath.row)

 // get the "real" image
 PHCachingImageManager.default().requestImage(for: asset, targetSize: CGSize(width: 200, height: 200), contentMode: .aspectFill, options: nil) { (image, _) in
        // do something with the image
    }

Я также предлагаю взглянуть на пример кода Apple для платформы Photoshop, не трудно следовать, вместе с документацией Framework Photos.

Вы можете попробовать что-то вроде этого:

import Photos

func fetchCustomAlbumPhotos( completion : (_ array : [PHAsset]) -> Void) {
    var assetCollection          = PHAssetCollection()
    var photoAssets              = PHFetchResult<AnyObject>()
    var arrayOfPHAsset           = [PHAsset]()
    let fetchOptions             = PHFetchOptions()
    fetchOptions.predicate       = NSPredicate(format: "title = %@", CustomAlbum.albumName)
    let collection:PHFetchResult = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .any, options: fetchOptions)


    if let _:AnyObject = collection.firstObject{
        assetCollection = collection.firstObject!
    }else {
        completion([])
    }
    _           = collection.count
    photoAssets = PHAsset.fetchAssets(in: assetCollection, options: nil) as! PHFetchResult<AnyObject>
    photoAssets.enumerateObjects({(object: AnyObject!,
        count: Int,
        stop: UnsafeMutablePointer<ObjCBool>) in
        if object is PHAsset{
            If let asset = object as? PHAsset {
              arrayOfPHAsset.append(asset)
            }
        }
    })
    completion(arrayOfPHAsset)
}


CustomAlbum().fetchCustomAlbumPhotos { (array) in
   // array will have all PHAsset
}

Эта функция возвращает фотографии из моего собственного альбома, вы можете удалить строку NSPredicate, чтобы получить все фотографии.

Затем вы можете увидеть все свойства PHAsset.

Другие вопросы по тегам