0
写真を表示するコレクションビューがあります。UIImageViewは、ダウンロードした画像をUICollectionViewCellに表示しません。
Assets.xcassetsから一時イメージを表示するとすべて動作しますが、インターネットからイメージをダウンロードすると何も表示されません。
CollectionViewController.swift
class CollectionViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {
@IBOutlet var collectionView: UICollectionView!
var currentCategory:PhotoCategory!
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return currentCategory.images.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "GalleryItemCollectionViewCell", for: indexPath) as! GalleryItemCollectionViewCell
cell.setGalleryItem(imageURL: currentCategory.images[indexPath.row].image)
return cell
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let picDimension = self.view.frame.size.width/4.0
return CGSize(width: picDimension, height: picDimension)
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
let leftRightInset = self.view.frame.size.width/20.0
return UIEdgeInsetsMake(0, leftRightInset, 0, leftRightInset)
}
}
GalleryItemCollectionViewCell.swift
class GalleryItemCollectionViewCell: UICollectionViewCell {
@IBOutlet var itemImageView: UIImageView!
func setGalleryItem(imageURL:String) {
//itemImageView.image = #imageLiteral(resourceName: "tempImage2")
let url = URL(string: imageURL)
DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async {
let data = try? Data(contentsOf: url!)
DispatchQueue.main.async(execute: {
if let imageData = data {
if let image = UIImage(data: imageData) {
print("We do have the image")
self.itemImageView = UIImageView(image: image)
}
}
});
}
}
}
私は出力に "私たちはイメージを持っている" ので、ダウンロードが完了すると、データがUIImageであることがわかります。私が行コメントを解除した場合
:
//itemImageView.image = #imageLiteral(resourceName: "tempImage2")
をして、次の非同期を削除し、すべてが動作します。
通常のUiImageViewを表示するには、ViewControllerでダウンロードコードを使用すると機能します。
更新:
extension UIImageView { func downloadedFrom(link:String, contentMode mode: UIViewContentMode) { guard let url = NSURL(string: link) else {return} contentMode = mode URLSession.shared.dataTask(with: url as URL, completionHandler: { (data, response, error) -> Void in guard let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200, let mimeType = response?.mimeType, mimeType.hasPrefix("image"), let data = data, error == nil, let image = UIImage(data: data) else { return } DispatchQueue.main.async(execute: { self.image = image }); }).resume() } }
と私はcellForItemAtに、このような画像を追加:
私はプロジェクトにUIImageViewに拡張子を追加することになった
cell.itemImageView.downloadedFrom(link: cell.photo.image, contentMode: .scaleAspectFill)