填充单元格后如何在单元格中加载/显示 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. 我将在哪里实现它:cellForItemAtviewDidLoad 等? 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. 我将在哪里实现它,在哪个函数cellForItemAtviewDidLoad 等? 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的主要内容,如果未能解决你的问题,请参考以下文章

EXCEL如何从单元格选中到它所在的整行

在搜索栏iOS swift3中加载带有条目的单元格时,图像无法正确显示

如何在UITableView SWIFT中加载更多单元格

自定义 UITableView 单元格 Nib 文件仅在选择单元格后显示?

phpexcel 合并单元格后插入图片 如何让图片居中

使用自动布局在某些单元格中加载图像