簡體   English   中英

使用 Swift 將照片保存到圖庫中的文件夾

[英]Save photo to a folder in Gallery using Swift

我正在處理一個 iOS Swift 5 項目,並希望將圖像從我的項目應用程序下載到圖庫中的文件夾。 文件夾名稱將與我的應用程序名稱相同,如果庫中不存在,則代碼應首先在庫中創建應用程序文件夾,然后將圖像保存到其中。

需要幫助來解決這個問題。

正如我一年前實現的那樣從 stackoverflow 獲得了代碼

import Photos

class PhotoManager {
static let instance = PhotoManager()
var folder: PHCollectionList?

/// Fetches an existing folder with the specified identifier or creates one with the specified name
func fetchFolderWithIdentifier(_ identifier: String, name: String) {
    let fetchResult = PHCollectionList.fetchCollectionLists(withLocalIdentifiers: [identifier], options: nil)
    guard let folder = fetchResult.firstObject else {
        createFolderWithName(name)
        return
    }

    self.folder = folder
}

/// Creates a folder with the specified name
private func createFolderWithName(_ name: String) {
    var placeholder: PHObjectPlaceholder?

    PHPhotoLibrary.shared().performChanges({
        let changeRequest = PHCollectionListChangeRequest.creationRequestForCollectionList(withTitle: name)
        placeholder = changeRequest.placeholderForCreatedCollectionList
    }) { (success, error) in
        guard let placeholder = placeholder else { return }
        let fetchResult = PHCollectionList.fetchCollectionLists(withLocalIdentifiers: [placeholder.localIdentifier], options: nil)
        guard let folder = fetchResult.firstObject else { return }

        self.folder = folder
    }
}

/// Creates an album with the specified name
private func createAlbumWithName(_ name: String, completion: @escaping (PHAssetCollection?) -> Void) {
    guard let folder = folder else {
        completion(nil)
        return
    }

    var placeholder: PHObjectPlaceholder?
    PHPhotoLibrary.shared().performChanges({
        let listRequest = PHCollectionListChangeRequest(for: folder)
        let createAlbumRequest = PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle: name)
        listRequest?.addChildCollections([createAlbumRequest.placeholderForCreatedAssetCollection] as NSArray)
        placeholder = createAlbumRequest.placeholderForCreatedAssetCollection
    }) { (success, error) in
        guard let placeholder = placeholder else {
            completion(nil)
            return
        }

        let fetchResult = PHAssetCollection.fetchAssetCollections(withLocalIdentifiers: [placeholder.localIdentifier], options: nil)
        let album = fetchResult.firstObject
        completion(album)
    }
}

/// Saves the image to a new album with the specified name
func saveImageToAlbumInRootFolder(_ albumName: String, image: UIImage?, completion: @escaping (Error?) -> Void) {
    createAlbumWithName(albumName) { (album) in
        guard let album = album else {
            return
        }

        PHPhotoLibrary.shared().performChanges({
            let albumChangeRequest = PHAssetCollectionChangeRequest(for: album)
            let createAssetRequest = PHAssetChangeRequest.creationRequestForAsset(from: image!)
            let photoPlaceholder = createAssetRequest.placeholderForCreatedAsset!
            albumChangeRequest?.addAssets([photoPlaceholder] as NSArray)
        }, completionHandler: { (success, error) in
            if success {
                completion(nil)
            } else if let error = error {
                // Failed with error
            } else {
                // Failed with no error
            }
        })
    }
}}

目前我正在辦公室開展一個項目,這就是為什么我沒有為您提供確切的解決方案,但您可以從上面的課程中輕松找出它...您可以使用它 PhotoManager.instance.saveImageToAlbumInRootFolder(_ albumName: String, image: yourImage) {完成}

import Foundation
import Photos

class CustomPhotoAlbum: NSObject {

static let albumName = "Your App Name"
static let sharedInstance = CustomPhotoAlbum()

var assetCollection: PHAssetCollection!

override init() {
    super.init()

    if let assetCollection = fetchAssetCollectionForAlbum() {
        self.assetCollection = assetCollection
        return
    }

    if PHPhotoLibrary.authorizationStatus() != PHAuthorizationStatus.authorized {
        PHPhotoLibrary.requestAuthorization({ (status: PHAuthorizationStatus) -> Void in
            ()
        })
    }

    if PHPhotoLibrary.authorizationStatus() == PHAuthorizationStatus.authorized {
        self.createAlbum()
    } else {
        PHPhotoLibrary.requestAuthorization(requestAuthorizationHandler)
    }
}

func requestAuthorizationHandler(status: PHAuthorizationStatus) {
    if PHPhotoLibrary.authorizationStatus() == PHAuthorizationStatus.authorized {
        // ideally this ensures the creation of the photo album even if authorization wasn't prompted till after init was done
        print("trying again to create the album")
        self.createAlbum()
    } else {
        print("should really prompt the user to let them know it's failed")
    }
}

func createAlbum() {
    PHPhotoLibrary.shared().performChanges({
        PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle: CustomPhotoAlbum.albumName)   // create an asset collection with the album name
    }) { success, error in
        if success {
            self.assetCollection = self.fetchAssetCollectionForAlbum()
        } else {
            print("error \(error)")
        }
    }
}

func fetchAssetCollectionForAlbum() -> PHAssetCollection? {
    let fetchOptions = PHFetchOptions()
    fetchOptions.predicate = NSPredicate(format: "title = %@", CustomPhotoAlbum.albumName)
    let collection = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .any, options: fetchOptions)

    if let _: AnyObject = collection.firstObject {
        return collection.firstObject
    }
    return nil
}

func save(image: UIImage) {
    if assetCollection == nil {
        return                          // if there was an error upstream, skip the save
    }

    PHPhotoLibrary.shared().performChanges({
        let assetChangeRequest = PHAssetChangeRequest.creationRequestForAsset(from: image)
        let assetPlaceHolder = assetChangeRequest.placeholderForCreatedAsset
        let albumChangeRequest = PHAssetCollectionChangeRequest(for: self.assetCollection)
        let enumeration: NSArray = [assetPlaceHolder!]
        albumChangeRequest!.addAssets(enumeration)

    }, completionHandler: nil)
}

}

如何使用它

  func haiJeenyKaMaqsadAuronKKamAna() {
    CustomPhotoAlbum.sharedInstance.createAlbum()
    CustomPhotoAlbum.sharedInstance.save(image: UIImage(named: "help")!)
}

現在這工作正常,因為我從我的舊項目中復制了它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM