我有一个图像选择器控制器,可以选择多张图片,然后设置一个PHAssets数组,使用它的委托方法,我将该数组传递给另一个视图控制器,该控制器应将PHAssets转换为[UIImage],我想要UIImage数组作为集合视图中imageView的数据源。
var assets = [PHAsset]()
var uiimage = [UIImage]()
override func viewDidLoad() {
super.viewDidLoad()
collectionView.dataSource = self
collectionView.delegate = self
collectionView.register(postPicturesCell.self, forCellWithReuseIdentifier: cellIdentifier)
}
func phassetToUIImage(){
let requestOptions = PHImageRequestOptions()
requestOptions.resizeMode = PHImageRequestOptionsResizeMode.exact
requestOptions.deliveryMode = PHImageRequestOptionsDeliveryMode.highQualityFormat
for asset in assets {
if asset.mediaType == PHAssetMediaType.image {
PHImageManager.default().requestImage(for: asset , targetSize: PHImageManagerMaximumSize, contentMode: PHImageContentMode.default, options: requestOptions, resultHandler: { (pickedImage, info) in
self.uiimage.append(pickedImage!)
debugPrint(self.uiimage)
})
}
}
self.collectionView.reloadData()
}
打印语句将其打印到控制台
[<UIImage: 0x1d40bf680>, {3024, 4032}]
这意味着数组不为空。
这是我如何在视图控制器之间传递数据
func imagePickerController(_ picker: ImagePickerController, didFinishPickingImageAssets assets: [PHAsset]) {
debugPrint(assets)
let vc = postViewController()
vc.assets = assets
picker.dismiss(animated: true, completion: nil)
present(vc, animated: true, completion: nil)
}
打印语句打印
[<PHAsset: 0x105fd5500> E23A656E-D3D8-4193-9864-BEBF2323E640/L0/001 mediaType=1/0, sourceType=1, (3024x4032), creationDate=2018-07-22 13:50:36 +0000, location=0, hidden=0, favorite=0 ]
我的手机班
class postPicturesCell: UICollectionViewCell {
var imgView: UIImageView = {
var img = UIImageView()
img.contentMode = .scaleAspectFit
return img
}()
override init(frame: CGRect) {
super.init(frame: frame)
imgView = UIImageView()
setUpViews()
}
func setUpViews(){
imgView.translatesAutoresizingMaskIntoConstraints = false
addSubview(imgView)
imgView.topAnchor.constraint(equalTo: topAnchor).isActive = true
imgView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
imgView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
imgView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
imgView.backgroundColor = UIColor.blue
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
cellForItemAt
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath as IndexPath) as! postPicturesCell
cell.imgView.image = uiimage[indexPath.row]
collectionView.reloadData()
return cell
}
该图像未显示在收藏夹视图上,有人可以指出我在这里做错了什么吗?
答案 0 :(得分:1)
您需要重新加载内部文件,因为PHImageManager.default().requestImage
是异步的
debugPrint(self.uiimage)
self.collectionView.reloadData()
})
}
}
//
或使用DispatchGroup
let group = DispatchGroup()
for asset in assets {
if asset.mediaType == PHAssetMediaType.image {
group.enter()
PHImageManager.default().requestImage(for: asset , targetSize: PHImageManagerMaximumSize, contentMode: PHImageContentMode.default, options: requestOptions, resultHandler: { (pickedImage, info) in
self.uiimage.append(pickedImage!)
debugPrint(self.uiimage)
group.leave()
})
}
}
group.notify(queue: .main) {
self.collectionView.reloadData()
}
//
picker.dismiss(animated: true) {
self.present(vc, animated: true, completion: nil)
}