显示来自自定义相册iPhone的图像

时间:2018-07-04 00:56:38

标签: iphone swift xcode uicollectionview

我的应用程序的

部分具有摄像头功能。它保存到自定义命名相册。我有一个图库部分,可以显示手机上的所有图片,但我只希望它显示自定义相册中的图片。

不了解如何处理“抓取照片”部分,以使画廊仅可处理特定照片。

这是自定义相册的代码

import Foundation
import Photos

@objc class CustomPhotoAlbum: NSObject {

/// Default album title.
static let defaultTitle = "PetFeed"

/// Singleton
static let shared = CustomPhotoAlbum(CustomPhotoAlbum.defaultTitle)

/// The album title to use.
private(set) var albumTitle: String

/// This album's asset collection
internal var assetCollection: PHAssetCollection?

/// Initialize a new instance of this class.
///
/// - Parameter title: Album title to use.
init(_ title: String) {
    self.albumTitle = title
    super.init()
}

/// Save the image to this app's album.
///
/// - Parameter image: Image to save.
public func save(_ image: UIImage?) {
    guard let image = image else { return }

    // Request authorization and create the album
    requestAuthorizationIfNeeded { (_) in

        // If it all went well, we've got our asset collection
        guard let assetCollection = self.assetCollection else { return }

        PHPhotoLibrary.shared().performChanges({

            // Make sure that there's no issue while creating the request
            let request = PHAssetChangeRequest.creationRequestForAsset(from: image)
            guard let placeholder = request.placeholderForCreatedAsset,
                let albumChangeRequest = PHAssetCollectionChangeRequest(for: assetCollection) else {
                    return
            }

            let enumeration: NSArray = [placeholder]
            albumChangeRequest.addAssets(enumeration)

        }, completionHandler: nil)
    }
}
}

internal extension CustomPhotoAlbum {

/// Request authorization and create the album if that went well.
///
/// - Parameter completion: Called upon completion.
func requestAuthorizationIfNeeded(_ completion: @escaping ((_ success: Bool) -> Void)) {

    PHPhotoLibrary.requestAuthorization { status in
        guard status == .authorized else {
            completion(false)
            return
        }

        // Try to find an existing collection first so that we don't create duplicates
        if let collection = self.fetchAssetCollectionForAlbum() {
            self.assetCollection = collection
            completion(true)

        } else {
            self.createAlbum(completion)
        }
    }
}


/// Creates an asset collection with the album name.
///
/// - Parameter completion: Called upon completion.
func createAlbum(_ completion: @escaping ((_ success: Bool) -> Void)) {

    PHPhotoLibrary.shared().performChanges({

        PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle: self.albumTitle)

    }) { (success, error) in
        defer {
            completion(success)
        }

        guard error == nil else {
            print("error \(error!)")
            return
        }

        self.assetCollection = self.fetchAssetCollectionForAlbum()
    }
}


/// Fetch the asset collection matching this app's album.
///
/// - Returns: An asset collection if found.
func fetchAssetCollectionForAlbum() -> PHAssetCollection? {

    let fetchOptions = PHFetchOptions()
    fetchOptions.predicate = NSPredicate(format: "title = %@", albumTitle)

    let collection = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .any, options: fetchOptions)
    return collection.firstObject
}
}

这是画廊获取照片的代码

func grabPhotos(){
    imageArray = []

    DispatchQueue.global(qos: .background).async {
        print("This is run on the background queue")
        let imgManager=PHImageManager.default()

        let requestOptions=PHImageRequestOptions()
        requestOptions.isSynchronous=true
        requestOptions.deliveryMode = .highQualityFormat

        let fetchOptions=PHFetchOptions()
        fetchOptions.sortDescriptors=[NSSortDescriptor(key:"creationDate", ascending: false)]

        let fetchResult: PHFetchResult = PHAsset.fetchAssets(with: .image, options: fetchOptions)
        print(fetchResult)
        print(fetchResult.count)
        if fetchResult.count > 0 {
            for i in 0..<fetchResult.count{
                imgManager.requestImage(for: fetchResult.object(at: i) as PHAsset, targetSize: CGSize(width:300, height: 300),contentMode: .aspectFill, options: requestOptions, resultHandler: { (image, error) in
                    self.imageArray.append(image!)
                })
            }
        } else {
            print("You got no photos.")
        }
        print("imageArray count: \(self.imageArray.count)")

        DispatchQueue.main.async {
            print("This is run on the main queue, after the previous code in outer block")
            self.myCollectionView.reloadData()
        }
    }
}

0 个答案:

没有答案