Subview исчезает из коллекции View Cell с прокруткой - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть UIImageView из раскадровки с выходом в моем UICollectionViewController:

@IBOutlet var playButtonView: UIImageView!

Раскадровка не позволяет мне делать розетку где угодно, кроме моего контроллера просмотра, так как я сделал видвне холста VC, чтобы я мог динамически позиционировать его:

Storyboard Screenshot

В результате я пытаюсь установить представление как подпредставление ячейки следующим образом:

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

        guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "metadataCell", for: indexPath) as? MetaDataCustomCell
            else { fatalError("Unexpected cell in collection view") }

        if !cell.subviews.contains(playButtonView) {
            let playButtonX = cell.thumbnailImageView.frame.width/2 - playButtonWidthAndHeight/2
            let playButtonY = cell.thumbnailImageView.frame.height/2 - playButtonWidthAndHeight/2
            playButtonView.frame = CGRect(x: playButtonX, y: playButtonY, width: playButtonWidthAndHeight, height: playButtonWidthAndHeight)
            cell.addSubview(playButtonView)

        } else {
            cell.sendSubviewToBack(playButtonView)
        }


        cell.representedAssetIdentifier = asset.localIdentifier

        DispatchQueue.global(qos: .userInitiated).async {

            let requestOption = PHImageRequestOptions()
            requestOption.isSynchronous = true
            self.imageManager.requestImage(for: asset, targetSize:   self.photoSize, contentMode: .aspectFit, options: requestOption, resultHandler: { image, _ in

                if cell.representedAssetIdentifier == asset.localIdentifier {
                    DispatchQueue.main.async {
                        cell.thumbnailImageView.image = image

                    }

                    self.getInfoForAsset(asset: asset) {(assetURL,urlAsset) in

                        if let url = assetURL {

                            if asset.mediaType == .image {
                                self.getDataFromImageURL(imageURL: url, imageAsset: asset, handler: { (metadataDict) in

                                    DispatchQueue.main.async {
                                        cell.dateLabel.text = metadataDict["date"]
                                    }
                                })

                            } else if asset.mediaType == .video {


                                DispatchQueue.main.async {

                                    self.playButtonView.isHidden = false
                                    cell.bringSubviewToFront(self.playButtonView)



                                }
                            }


                        }

                    }


                }
            })
        }


        return  cell

Теперь проблема в том, что playButtonView появляется только тогда, когда первая ячейка загружена, после того, как я прокручиваю вперёд или назад в ту же ячейку снова, она исчезает.Есть идеи?

1 Ответ

0 голосов
/ 29 апреля 2019

Ваш playButtonView является собственностью вашего контроллера представления вместо вашего MetaDataCustomCell. Это не сработает, если у вас есть только один MetaDataCustomCell, потому что у вас есть только один playButtonView, который вы всегда будете удалять из одной ячейки и добавлять в следующую. Переместите это свойство в свою ячейку.

...