列出 iOS 中的所有相册

Posted

技术标签:

【中文标题】列出 iOS 中的所有相册【英文标题】:List all photo albums in iOS 【发布时间】:2016-04-19 08:44:42 【问题描述】:

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

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

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

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

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

我可以列出所有相册吗?

【问题讨论】:

你可以从这里看到答案:***.com/questions/32169185/… 我需要先获取相册而不是相册中的图片。就我而言,我不知道专辑名称 Photos Framework 将为您完成。您可以在不使用传统方法的情况下获取相册、照片等。对于构建自己的照片选择器非常重要 【参考方案1】:

简单的方法列出所有专辑的图像计数。

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.fetchAssetCollections(with: .album, subtype: .any, options: options)
    userAlbums.enumerateObjects (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)
    

【讨论】:

很好用,但它只返回一张专辑。肖恩的回答返回所有专辑。在这里查看***.com/a/36713200/1361120 @mohammad-farrahi 感谢您的编辑请求。我刚刚批准了。【参考方案2】:

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

private func setupPhotos() 
    let fetchOptions = PHFetchOptions()
    let smartAlbums = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .any, options: fetchOptions)
    let topLevelUserCollections = PHCollectionList.fetchTopLevelUserCollections(with: fetchOptions)
    let allAlbums = [topLevelUserCollections, smartAlbums]

    allAlbums.enumerateObjects (assetCollection, index, stop) in

        if #available(ios 9.0, *) 
            fetchOptions.fetchLimit = 1
        

        let assets = PHAsset.fetchAssets(in: assetCollection, options: fetchOptions)
        if let _ = assets.firstObject 
            let assetObject = MYSpecialAssetContainerStruct(asset: assets)
            self.myDataArray.append(assetObject)
        
   
   self.myDataArray.sortInPlace (a, b) in
       return a.asset.localizedTitle < b.asset.localizedTitle
   
   tableView.reloadData()

编辑:这将为您提供相册的PHAssetCollections,然后我将它们放入具有此方法的单元格中,用于从相册中获取最新图像缩略图。

private func downloadAndSetImage(asset: MYSpecialAssetContainerStruct) 
    guard asset.thumbnail == nil else 
        albumImage.image = asset.thumbnail
        return
    

    let imageRequestOptions = PHImageRequestOptions()
    imageRequestOptions.isNetworkAccessAllowed = false
    imageRequestOptions.isSynchronous = true
    imageRequestOptions.deliveryMode = .highQualityFormat

    PHImageManager.default().requestImage(
        for: asset.asset,
        targetSize: CGSize(width: 200, height: 200),
        contentMode: .aspectFit,
        options: imageRequestOptions,
        resultHandler: (img, info) in
            asset.thumbnail = img
            self.albumImage.image = asset.thumbnail
        
    )

【讨论】:

对不起,我弄错了,请再次检查顶部代码:D @SeanLintern88 : 它没有提供通过 iTunes 添加的图片,我该怎么办?? 代码不能在 Swift 4 中运行。“NSObject”类型的值没有成员“enumerateObjectsUsingBlock”。 “结果”变量错误 代码不是作为复制/粘贴解决方案提供的,它是理解请求收藏/专辑流程的指南

以上是关于列出 iOS 中的所有相册的主要内容,如果未能解决你的问题,请参考以下文章

如何在文档中显示所有视频以及相册中的照片?

iOS系统相册的有关操作

IOS 照片库获取给定照片的相册名称

iOS遍历相册中的图片

如何列出iOS中uiviewcontroller中的所有子视图?

iOS PhotoKit:获取除全景图以外的所有智能相册