在集合视图单元格中查看PHAsset

时间:2018-07-22 14:30:37

标签: swift

我有一个图像选择器控制器,可以选择多张图片,然后设置一个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
}

该图像未显示在收藏夹视图上,有人可以指出我在这里做错了什么吗?

1 个答案:

答案 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)
}