问题描述
我需要在 viewDidload 事件中从照片库中获取并显示最后拍摄的 3 张照片,而无需任何点击.
I need to get and show last taken 3 photos from photo library on viewDidload event without any clicks.
在这一步之后,当我滚动 ScrollView 时,我应该得到其他 3 张 3 的照片.
After this step, I should get other photos 3 by 3 when I scroll the ScrollView.
您知道使用 swift 执行此操作的正确方法吗?谢谢.
Do you know the proper way to do this with swift? Thanks.
推荐答案
这是一个使用 iOS 8+ 设备可用的 Photos 框架的解决方案:
Here's a solution using the Photos framework available for devices iOS 8+ :
import Photos class ViewController: UIViewController { var images:[UIImage] = [] func fetchPhotos () { // Sort the images by descending creation date and fetch the first 3 let fetchOptions = PHFetchOptions() fetchOptions.sortDescriptors = [NSSortDescriptor(key:"creationDate", ascending: false)] fetchOptions.fetchLimit = 3 // Fetch the image assets let fetchResult: PHFetchResult = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: fetchOptions) // If the fetch result isn't empty, // proceed with the image request if fetchResult.count > 0 { let totalImageCountNeeded = 3 // <-- The number of images to fetch fetchPhotoAtIndex(0, totalImageCountNeeded, fetchResult) } } // Repeatedly call the following method while incrementing // the index until all the photos are fetched func fetchPhotoAtIndex(_ index:Int, _ totalImageCountNeeded: Int, _ fetchResult: PHFetchResult<PHAsset>) { // Note that if the request is not set to synchronous // the requestImageForAsset will return both the image // and thumbnail; by setting synchronous to true it // will return just the thumbnail let requestOptions = PHImageRequestOptions() requestOptions.isSynchronous = true // Perform the image request PHImageManager.default().requestImage(for: fetchResult.object(at: index) as PHAsset, targetSize: view.frame.size, contentMode: PHImageContentMode.aspectFill, options: requestOptions, resultHandler: { (image, _) in if let image = image { // Add the returned image to your array self.images += [image] } // If you haven't already reached the first // index of the fetch result and if you haven't // already stored all of the images you need, // perform the fetch request again with an // incremented index if index + 1 < fetchResult.count && self.images.count < totalImageCountNeeded { self.fetchPhotoAtIndex(index + 1, totalImageCountNeeded, fetchResult) } else { // Else you have completed creating your array print("Completed array: (self.images)") } }) } }