首页 > 解决方案 > 视频放在集合视图中的图像顶部?

问题描述

我有一个集合视图,其中填充了视频或图像,基于从 firebase 获取的内容。

我遇到了这个问题,当我获取数据并添加到单元格时,一些单元格会在 [图像] 顶部添加一个视频。

我查看了下面找到的代码,但似乎看不到。找出问题出在哪里。

 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "p1Item", for: indexPath) as! CollectionViewCell1

    if postArray[indexPath.item].media[0].image != nil { //its an image

        let date = ConvertDate(mediaTimestamp: postArray[indexPath.row].media[0].postNum!, isItForP3: false).getDate!

        do {                
            cell.imageView.image = postArray[indexPath.item].media[0].image!

            if postArray[indexPath.item].user.profileImageUrl != "" {
                let url = URL(string: "\(postArray[indexPath.item].user.profileImageUrl)")
                let data = try Data(contentsOf: url!)

                if let profileImage = UIImage(data: data) {
                    cell.profImage.image = profileImage
                    cell.titleLabel.text = postArray[indexPath.item].user.username
                    cell.subtitleLabel.text = date
                }
            } else {
                //I add a fake image here
                cell.titleLabel.text = postArray[indexPath.item].user.username
                cell.subtitleLabel.text = date
                cell.profImage.image = UIImage(named: "media")
            }

        } catch {
            print("need to add stuff to this catch")
        }

    } else { //its a video

        let videoURL = postArray[indexPath.item].media[0].videoURL

        let player = AVPlayer(url: videoURL! as URL)
        let playerLayer = AVPlayerLayer(player: player)
        playerLayer.frame = cell.bounds
        cell.layer.addSublayer(playerLayer)

        let date = ConvertDate(mediaTimestamp: postArray[indexPath.item].media[0].postNum!, isItForP3: false).getDate!

        do {
            if postArray[indexPath.item].user.profileImageUrl != "" {
                let url = URL(string: "\(postArray[indexPath.item].user.profileImageUrl)")
                let data = try Data(contentsOf: url!)
                if let profileImage = UIImage(data: data) {
                    cell.profImage.image = profileImage
                    cell.titleLabel.text = postArray[indexPath.item].user.username
                    cell.subtitleLabel.text = date
                }
            } else {
                //I add a fake profile image here
                cell.titleLabel.text = postArray[indexPath.item].user.username
                cell.subtitleLabel.text = date
                cell.profImage.image = UIImage(named: "media")
            }
        } catch {
            print("need to add stuff to this catch")
        }
    }

    print("Completed: ", cell.imageView!)

    return cell
}

我该如何解决?

标签: iosswiftuicollectionview

解决方案


原因在这里

 cell.layer.addSublayer(playerLayer)

您应该清除单元格,因为它已出队

let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "p1Item", for: indexPath) as! CollectionViewCell1
cell.layer.sublayers.forEach {
  if $0 is AVPlayerLayer {
    $0.removeFromSuperlayer()
  }
}

,你也不应该使用

 let data = try Data(contentsOf: url!)

对于远程数据抓取,您可以使用SDWebImage


推荐阅读