填充单元格后如何在单元格中加载/显示 UIImageView
Posted
技术标签:
【中文标题】填充单元格后如何在单元格中加载/显示 UIImageView【英文标题】:How to load / show a UIImageView in cell after cell is populated 【发布时间】:2019-04-08 21:58:52 【问题描述】:我有一个UICollectionView
的图像,在每个单元格的角落我都有一个水印(或一个小图标)。图像是远程获取的,图标是硬编码的(本地)。一切都很好,除了一个丑陋的问题:本地水印图标首先加载每个单元格,同时获取图像,这看起来不太好。
---> 我正在寻找一种在填充每个单元格后加载/显示水印图标 (UIImageView
) 的方法(或更糟糕的情况,在填充所有单元格后)。感谢您的帮助!
1.这可能吗? 2. 我将在哪里实现它:cellForItemAt
、viewDidLoad
等? 3. 然后是什么代码。请注意,我对编码比较陌生。
这就是我使用远程存储图像填充 collectionView 的方式(不包括侦听器):
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "myproductCell", for: indexPath) as! MyProductsCollectionCell
if (self.products.indices.contains(indexPath.row))
let product = self.products[indexPath.row]
cell.configureWithProduct(Product(caption: product.caption, videoUrl: product.videoUrl, imageUrl: product.imageUrl))
return cell
我刚刚为本地存储的水印(图标)创建了一个出口:
@IBOutlet weak var watermark: UIImageView!
【问题讨论】:
在您的问题中显示相关代码(作为文本)。清楚地指出您需要帮助的地方。 @rmaddy 那是问题或问题的一部分,我不知道如何以及在哪里实现这一点,我可以发布我的整个 collectionView 代码,但我认为这将是很多和皱眉在这里。我想我的问题分为三个部分。 1. 是我想要的可能吗? 2. 我将在哪里实现它,在哪个函数cellForItemAt
、viewDidLoad
等? 3. 然后是代码。我会更新我的问题以反映这一点。请注意,我对编码比较陌生。
只显示与图像加载相关的代码,其中可能包括cellForItemAt
。显示显示两个图像的代码。
好的@rmaddy我已经添加了我的collectionView填充代码,希望这可以帮助你:)
【参考方案1】:
使用SDWebImage 库。
首先使用 cocoapods 安装库
pod 'SDWebImage'
在你的MyProductsCollectionCell
上方导入SDWebImage库,使用SDWebImage
提供的方法设置图片。
该库将处理异步下载、图像设置和缓存。
import SDWebImage
class MyProductsCollectionCell: UICollectionViewCell
@IBOutlet weak var watermark: UIImageView!
// rest of your properties.
func configureWithProduct(_ product: Product)
cell.watermark.sd_setImage(with: URL(string: product.imageUrl), placeholderImage: UIImage(named: "placeholder.png"))
// set values to the rest properties.
【讨论】:
【参考方案2】:我没有看到你的代码,所以我不能评论。但绝对不在 viewDidLoad 中。
您可以在 cellForItemAt 中使用块来实现这一点。
- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
// download the image on the background thread
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
// once you have the image downloaded,
// set the image on a main thread
// in the completion handler
dispatch_async(dispatch_get_main_queue, ^
callback(yourImage); // this can be a call to your method.
);
);
【讨论】:
问题被标记为 Swift。请以正确的语言发布答案。 什么是completionHandler? @barryjones 感谢您的回复,我已将cellForItemAt
代码添加到问题中,请再看一下。
@Jamakes 在cell.configureWithProduct这个方法中,你应该下载图片,然后在主线程上设置图片,类似于我在描述中使用的dispatch方法。
URLSession.shared.dataTask(with: imageUrl!) data, _, error in if error != nil print(error) return DispatchQueue.main.async imageView.image = UIImage(数据:数据!) .resume()以上是关于填充单元格后如何在单元格中加载/显示 UIImageView的主要内容,如果未能解决你的问题,请参考以下文章
在搜索栏iOS swift3中加载带有条目的单元格时,图像无法正确显示