Видео внутри UICollectionView: проблема с прокруткой

У меня есть несколько видео, показанных в UICollectionView; когда приложение загружено, оно работает нормально, а когда пользователь прокручивает UICollectionView, видео не загружаются, а все ячейки отображаются серым цветом и никогда не заполняются правильным видео, даже если в отладке я вижу правильный URL-адрес mp4.

Вот код:

    func collectionView(cv: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

        let videoCell = collectionView!.dequeueReusableCellWithReuseIdentifier("VideoCell", forIndexPath: indexPath) as? UICollectionViewCell

        var aPlayer = AVPlayer()
        let moviePlayerController = AVPlayerViewController()

        let item = self.wall[indexPath.row]

        print("URL:"+item.video_link)

        let fileUrl = NSURL(string: item.video_link)

        dispatch_async(dispatch_get_main_queue(), {
        aPlayer = AVPlayer(URL: fileUrl!)

        moviePlayerController.player = aPlayer
        moviePlayerController.view.frame = CGRectMake(0, 0, videoCell!.frame.size.width, videoCell!.frame.size.height)
        moviePlayerController.videoGravity = AVLayerVideoGravityResizeAspectFill
        moviePlayerController.view.sizeToFit()
        moviePlayerController.player?.actionAtItemEnd=AVPlayerActionAtItemEnd.None
        NSNotificationCenter.defaultCenter().addObserver(self,
                                                         selector: "playerItemDidReachEnd:",
                                                         name: AVPlayerItemDidPlayToEndTimeNotification,
                                                         object: moviePlayerController.player!.currentItem)
        moviePlayerController.showsPlaybackControls = false
        moviePlayerController.player?.play()
        /*
        videoCell?.layer.shouldRasterize = true;
        videoCell!.layer.rasterizationScale = UIScreen.mainScreen().scale;
        */
        videoCell!.addSubview(moviePlayerController.view)
        })
        return videoCell!
    }

Может ли кто-нибудь помочь мне понять проблему?


person Cris    schedule 19.06.2016    source источник
comment
вы нашли какое-нибудь решение?   -  person H Raval    schedule 23.11.2016


Ответы (1)


  1. Вы должны добавлять подпредставления в videoCell!.contentView, а не в videoCell.

  2. Вы добавляете много moviePlayerController.view в одну ячейку! cellForItemAtIndexPath вызывается всякий раз, когда ячейка должна быть показана, но это не означает, что после удаления из очереди у вас будет чистая ячейка, это может быть одна из предыдущих ячеек, которая больше не отображается на экране. иметь Bool или проверить videoCell!.subviews.count, чтобы определить, добавили ли вы ранее moviePlayerController.view или нет. Если вы уже добавили его, измените URL-адрес (если возможно) или удалите его, а затем добавьте снова.

p.s. Лучше всего определить собственный класс UICollectionViewCell.

person farzadshbfn    schedule 19.06.2016