问题 列出iOS中的所有相册


我需要在iPhone上获取所有相册。

我知道我可以启动图像选择器让用户从中选择图像。但我需要开发自己的图像浏览器。

我发现的所有代码都与图像选择器一起使用,或者他们已经知道了专辑名称。

我首先需要列出所有相册名称,然后用户将选择其中一个,然后我将在此相册中显示图像。

所有这些步骤都将在自定义布局中完成。

我可以列出所有相册吗?


2856
2018-04-19 08:44


起源

你可以从这里看到答案: stackoverflow.com/questions/32169185/... - fatihyildizhan
我需要首先获取专辑而不是专辑中的图像。在我的情况下,我不知道专辑名称 - Ahmed M. Abed
Photos Framework将为您完成。您可以在不使用传统方法的情况下获取相册,照片等。对于构建自己的照片选择器非常重要 - NSNoob


答案:


我用它来获得几张专辑,但你可以得到更多:

private func setupPhotos() {
        let fetchOptions = PHFetchOptions()

    let smartAlbums = PHAssetCollection.fetchAssetCollectionsWithType(.SmartAlbum, subtype: .Any, options: fetchOptions)

    let topLevelfetchOptions = PHFetchOptions()

    let topLevelUserCollections = PHCollectionList.fetchTopLevelUserCollectionsWithOptions(topLevelfetchOptions)

    let allAlbums = [topLevelUserCollections, smartAlbums]

    for i in 0 ..< allAlbums.count {
        let result = allAlbums[i]

        result.enumerateObjectsUsingBlock { (asset, index, stop) -> Void in
            if let a = asset as? PHAssetCollection {
                let opts = PHFetchOptions()

                if #available(iOS 9.0, *) {
                    opts.fetchLimit = 1
                }

                let ass = PHAsset.fetchAssetsInAssetCollection(a, options: opts)
                if let _ = ass.firstObject {
                    let obj = MYSpecialAssetContainerStruct(asset: a)
                    self.data.append(obj)
                }
            }

            if i == (allAlbums.count - 1) && index == (result.count - 1) {
                self.data.sortInPlace({ (a, b) -> Bool in
                    return a.asset.localizedTitle < b.asset.localizedTitle
                })
                self.tableView.reloadData()
            }
        }
    }
}

编辑: 这会得到你的 PHAssetCollections 然后我将它们放在具有此方法的单元格中,以便从相册中获取最新的图像缩略图。

private func downloadAndSetImage(asset: MYSpecialAssetContainerStruct) {
    if asset.thumbnail == nil {
        let imageRequestOptions = PHImageRequestOptions()
        imageRequestOptions.networkAccessAllowed = false
        imageRequestOptions.synchronous = true
        imageRequestOptions.deliveryMode = .HighQualityFormat

        PHImageManager.defaultManager().requestImageForAsset(
            asset.asset,
            targetSize: self.targetImageSize(),
            contentMode: .AspectFit,
            options: imageRequestOptions,
            resultHandler: { (img, info) -> Void in
                asset.thumbnail = img
                self.albumImage.image = asset.thumbnail
        })
    } else {
        albumImage.image = asset.thumbnail
    }
}

7
2018-04-19 08:46



在第一个代码中什么是专辑变量? - Ahmed M. Abed
抱歉,我犯了一个错误,请再次检查顶部代码:D - SeanLintern88
真棒..非常感谢.. - Ahmed M. Abed
@ SeanLintern88:它没有给通过iTunes添加的Pics,我该怎么办? - Abhishek Thapliyal
代码不能在Swift 4中运行。“NSObject”类型的值没有成员'enumerateObjectsUsingBlock'。 “result”变量出错 - Đông An


简单 列出具有图像计数的所有相册的方法。

class AlbumModel {
    let name:String
    let count:Int
    let collection:PHAssetCollection
    init(name:String, count:Int, collection:PHAssetCollection) {
      self.name = name
      self.count = count
      self.collection = collection
    }
  }

  func listAlbums() {
    var album:[AlbumModel] = [AlbumModel]()

    let options = PHFetchOptions()
    let userAlbums = PHAssetCollection.fetchAssetCollectionsWithType(PHAssetCollectionType.Album, subtype: PHAssetCollectionSubtype.Any, options: options)
    userAlbums.enumerateObjectsUsingBlock{ (object: AnyObject!, count: Int, stop: UnsafeMutablePointer) in
      if object is PHAssetCollection {
        let obj:PHAssetCollection = object as! PHAssetCollection

        let fetchOptions = PHFetchOptions()
        fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
        fetchOptions.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.Image.rawValue)

        let newAlbum = AlbumModel(name: obj.localizedTitle!, count: obj.estimatedAssetCount, collection:obj)
        album.append(newAlbum)
      }
    }

    for item in album {
      print(item)
    }
  }

8
2018-04-19 09:09



伟大的工作,但它只返回一个专辑。肖恩的回答回归所有专辑。在这里查看 stackoverflow.com/a/36713200/1361120 - Ahmed M. Abed