UICollectionViewCells не будет загружаться без прокрутки - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть UICollectionView, и я заполняю его ячейками.

У меня есть анимация загрузки, которая останавливается, чтобы указать, что все ячейки заполнены, но ячейки не будут отображаться, пока я не прокручиваю (Могусделайте несколько попыток).

Это похоже на это:

UICollectionView не загружается полностью, пока я не прокручиваю

Но разница в том, что моя победила 't частично загружен - но не будет вообще.

Мой UICollectionViewDataSource:

extension ProductsCollectionViewController: UICollectionViewDataSource
{

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
    {
        if searchActive
        {
            return filtered.count
        }
        else
        {
            return products.count    //return number of rows in section
        }
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
    {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "product_collection_cell", for: indexPath) as! ProductsCollectionViewCell
        cell.ProductImageView.image = nil
        cell.ProductName.text = nil
        cell.ProductPrice.text = nil
        cell.productUniqueID = nil

        let prodInCell =  searchActive ? filtered[indexPath.row] : products[indexPath.row]

        let prodID = prodInCell.getUniqueID()
        let dbRef = Storage.storage().reference().child(prodID).child("pic0.jpg")
        cell.contentMode = .scaleAspectFit
        cell.ProductImageView.image = #imageLiteral(resourceName: "DefaultProductImage")
        dbRef.downloadURL(completion:
            {
                url, error in
                if let error = error
                {
                    print (error)
                }
                else if let url = url
                {
                    cell.ProductImageView.loadImageUsingUrlString(urlString: url.absoluteString)
                    cell.ProductImageView.contentMode = UIViewContentMode.scaleToFill
                    cell.layoutIfNeeded()
                }
        })
        cell.ProductImageView.clipsToBounds = true

        //cell.ProductName = UILabel()
        cell.ProductName.text = prodInCell.getName()

        //cell.ProductPrice = UILabel()
        cell.ProductPrice.text = String(prodInCell.getPrice())
        cell.productUniqueID = prodInCell.getUniqueID()
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
    {
        // Display selected Item
        prodToLoad = products[indexPath.row]
        performSegue(withIdentifier: "view_product_information", sender:self  )
    }

    // Swift 3.0
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: CGFloat((collectionView.frame.size.width / 3) - 20), height: CGFloat(100))
    }
}

Что я делаю не так?

1 Ответ

0 голосов
/ 12 сентября 2018

Внутри cellForRowAt, у вас есть 2 асинхронные операции

1

dbRef.downloadURL(completion:

2-

cell.ProductImageView.loadImageUsingUrlString(urlString: url.absoluteString)

рассмотрите возможность использования SDWebImage , поскольку при этом будет продолжаться загрузка одного и того же изображения несколько раз

//

Создайте необязательное свойство urlStr внутри пользовательского класса / структуры элемента массива и установите его при загрузке как

if let str = prodInCell.urlStr {

    cell.ProductImageView.sd_setImage(with: URL(string:str), placeholderImage: UIImage(named: "placeholder.png"))
}
else {

       let dbRef = Storage.storage().reference().child(prodID).child("pic0.jpg")
       cell.contentMode = .scaleAspectFit
       cell.ProductImageView.image = #imageLiteral(resourceName: "DefaultProductImage")
       dbRef.downloadURL(completion:
        {
            url, error in
            if let error = error
            {
                print (error)
            }
            else if let url = url
            {
               prodInCell.urlStr = url.absoluteString // store for upcoming need
               cell.ProductImageView.sd_setImage(with: URL(string:url.absoluteString), placeholderImage: UIImage(named: "placeholder.png"))      
               cell.ProductImageView.contentMode = UIViewContentMode.scaleToFill
               cell.layoutIfNeeded()
            }
    })

 }

//

также помните

import SDWebImage

и установите любое изображение-заполнитель внутри пакета проекта для загрузки, пока не будет загружено реальное изображение

...