Ios 当我在swift 3中从图库中获取照片时,为什么集合视图为空?
我正在使用swift 3,希望在“收藏”视图中查看照片库图像,但这些代码不适用于我 在看到我的代码之前,请注意: **我不会收到任何错误或崩溃,只是在集合视图中看不到我的任何图像库** 这是我的密码:Ios 当我在swift 3中从图库中获取照片时,为什么集合视图为空?,ios,swift3,uicollectionview,photolibrary,camera-roll,Ios,Swift3,Uicollectionview,Photolibrary,Camera Roll,我正在使用swift 3,希望在“收藏”视图中查看照片库图像,但这些代码不适用于我 在看到我的代码之前,请注意: **我不会收到任何错误或崩溃,只是在集合视图中看不到我的任何图像库** 这是我的密码: import UIKit import Photos class collectionImageViewController: UIViewController , UICollectionViewDataSource , UICollectionViewDelegate { var
import UIKit
import Photos
class collectionImageViewController: UIViewController , UICollectionViewDataSource , UICollectionViewDelegate {
var imageArray = [UIImage]()
@IBOutlet weak var collectionImageView: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return imageArray.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewImageCell", for: indexPath) as! CollectionViewImageCell
cell.theImage.image = imageArray[indexPath.row]
return cell
}
func getPhotosFromAlbum() {
let imageManager = 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)
if fetchResult.count > 0 {
for i in 0..<fetchResult.count {
imageManager.requestImage(for: fetchResult.object(at: i), targetSize: CGSize(width: 300, height: 300), contentMode: .aspectFill, options: requestOptions, resultHandler: { image, error in
self.imageArray.append(image!)
})
}
} else {
self.collectionImageView?.reloadData()
}
}
导入UIKit
导入照片
类collectionImageViewController:UIViewController、UICollectionViewDataSource、UICollectionViewDelegate{
var imageArray=[UIImage]()
@ibvar collectionImageView:UICollectionView!
重写func viewDidLoad(){
super.viewDidLoad()
//加载视图后执行任何其他设置。
}
func collectionView(collectionView:UICollectionView,numberOfItemsInSection:Int)->Int{
返回imageArray.count
}
func collectionView(collectionView:UICollectionView,cellForItemAt indexPath:indexPath)->UICollectionViewCell{
让cell=collectionView.dequeueReusableCell(带有reuseidentifier:“collectionviewmagecell”,for:indexath)作为!collectionviewmagecell
cell.theImage.image=imageArray[indexPath.row]
返回单元
}
func getPhotosFromAlbum(){
让imageManager=PHImageManager.default()
让requestOptions=PHImageRequestOptions()
requestOptions.isSynchronous=true
requestOptions.deliveryMode=.highQualityFormat
让fetchOptions=PHFetchOptions()
fetchOptions.sortDescriptors=[NSSortDescriptor(键:“creationDate”,升序:false)]
让fetchResult:PHFetchResult=PHAsset.fetchAssets(带:。图像,选项:fetchOptions)
如果fetchResult.count>0{
对于0..中的i,必须在for循环之后重新加载collectionView,如下所示
...
{
for i in 0..<fetchResult.count {
imageManager.requestImage(for: fetchResult.object(at: i), targetSize: CGSize(width: 300, height: 300), contentMode: .aspectFill, options: requestOptions, resultHandler: { image, error in
self.imageArray.append(image!)
})
self.collectionImageView?.reloadData()
}
...
。。。
{
对于0..中的i,必须在for循环之后重新加载collectionView,如下所示
...
{
for i in 0..<fetchResult.count {
imageManager.requestImage(for: fetchResult.object(at: i), targetSize: CGSize(width: 300, height: 300), contentMode: .aspectFill, options: requestOptions, resultHandler: { image, error in
self.imageArray.append(image!)
})
self.collectionImageView?.reloadData()
}
...
。。。
{
对于0中的i..这是我从gallery加载所有图像并加载到collectioview的全部代码。请查看此代码
import UIKit
import Photos
class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {
let arr_img = NSMutableArray()
@IBOutlet var collview: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
let allPhotosOptions : PHFetchOptions = PHFetchOptions.init()
allPhotosOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]
let allPhotosResult = PHAsset.fetchAssets(with: .image, options: allPhotosOptions)
allPhotosResult.enumerateObjects({ (asset, idx, stop) in
self.arr_img.add(asset)
})
}
func getAssetThumbnail(asset: PHAsset, size: CGFloat) -> UIImage {
let retinaScale = UIScreen.main.scale
let retinaSquare = CGSize(width: size * retinaScale, height: size * retinaScale)//CGSizeMake(size * retinaScale, size * retinaScale)
let cropSizeLength = min(asset.pixelWidth, asset.pixelHeight)
let square = CGRect(x: 0, y: 0, width: cropSizeLength, height: cropSizeLength)//CGRectMake(0, 0, CGFloat(cropSizeLength), CGFloat(cropSizeLength))
let cropRect = square.applying(CGAffineTransform(scaleX: 1.0/CGFloat(asset.pixelWidth), y: 1.0/CGFloat(asset.pixelHeight)))
let manager = PHImageManager.default()
let options = PHImageRequestOptions()
var thumbnail = UIImage()
options.isSynchronous = true
options.deliveryMode = .highQualityFormat
options.resizeMode = .exact
options.normalizedCropRect = cropRect
manager.requestImage(for: asset, targetSize: retinaSquare, contentMode: .aspectFit, options: options, resultHandler: {(result, info)->Void in
thumbnail = result!
})
return thumbnail
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
//MARK:
//MARK: Collectioview methods
func collectionView(_ collectionView: UICollectionView,
numberOfItemsInSection section: Int) -> Int {
return arr_img.count
}
func collectionView(_ collectionView: UICollectionView,
cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell",
for: indexPath)
let imgview : UIImageView = cell.viewWithTag(20) as! UIImageView
imgview.image = self.getAssetThumbnail(asset: self.arr_img.object(at: indexPath.row) as! PHAsset, size: 150)
return cell
}
}
这是我从gallery加载所有图像并加载到collectioview的全部代码。请查看此代码
import UIKit
import Photos
class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {
let arr_img = NSMutableArray()
@IBOutlet var collview: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
let allPhotosOptions : PHFetchOptions = PHFetchOptions.init()
allPhotosOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]
let allPhotosResult = PHAsset.fetchAssets(with: .image, options: allPhotosOptions)
allPhotosResult.enumerateObjects({ (asset, idx, stop) in
self.arr_img.add(asset)
})
}
func getAssetThumbnail(asset: PHAsset, size: CGFloat) -> UIImage {
let retinaScale = UIScreen.main.scale
let retinaSquare = CGSize(width: size * retinaScale, height: size * retinaScale)//CGSizeMake(size * retinaScale, size * retinaScale)
let cropSizeLength = min(asset.pixelWidth, asset.pixelHeight)
let square = CGRect(x: 0, y: 0, width: cropSizeLength, height: cropSizeLength)//CGRectMake(0, 0, CGFloat(cropSizeLength), CGFloat(cropSizeLength))
let cropRect = square.applying(CGAffineTransform(scaleX: 1.0/CGFloat(asset.pixelWidth), y: 1.0/CGFloat(asset.pixelHeight)))
let manager = PHImageManager.default()
let options = PHImageRequestOptions()
var thumbnail = UIImage()
options.isSynchronous = true
options.deliveryMode = .highQualityFormat
options.resizeMode = .exact
options.normalizedCropRect = cropRect
manager.requestImage(for: asset, targetSize: retinaSquare, contentMode: .aspectFit, options: options, resultHandler: {(result, info)->Void in
thumbnail = result!
})
return thumbnail
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
//MARK:
//MARK: Collectioview methods
func collectionView(_ collectionView: UICollectionView,
numberOfItemsInSection section: Int) -> Int {
return arr_img.count
}
func collectionView(_ collectionView: UICollectionView,
cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell",
for: indexPath)
let imgview : UIImageView = cell.viewWithTag(20) as! UIImageView
imgview.image = self.getAssetThumbnail(asset: self.arr_img.object(at: indexPath.row) as! PHAsset, size: 150)
return cell
}
}
将此行放在for循环结束self.collectionImageView?.reloadData()之后。获取所有图像后,您不会重新加载collectionview。如果fetchResult.count>0,请将此行放在内部{for loop之后,我仍然无法在集合视图中看到任何照片。您是否可以共享演示?想象一下,只有一个白色页面,没有任何内容,没有任何错误。这些是我的完整代码。我将给您演示将这一行放在for loop之后结束self.collectionImageView?.reloadData()。获取所有图像后,您不会重新加载collectionview。如果fetchResult.count>0,请将此行放入其中{经过循环后,我仍然无法在收藏视图中看到任何照片。你是否可以共享演示?想象一下,只有一个白色页面,没有任何错误,没有任何东西。这些是我的完整代码。我将给你演示。我无法再看到任何照片。我无法再看到任何照片。请在这里编写收藏视图单元格代码。等等,我将给你演示。它是正在工作,但在第一次发布时,我看不到它从您的图库中获得的照片,如果有1000多张照片,则需要一些时间才能获得。不,我已经在模拟器中测试过,模拟器只有5张照片。您可以在这里写集合视图单元格代码吗?请稍候,我将给您演示。它正在工作,但在第一阶段t launch我看不到从你的图库中得到的照片,如果有1000多张照片,那么需要一些时间才能得到。不,我已经在模拟器中测试过了,模拟器只有5张照片