Ошибка AVPlayerViewController в UICollectionViewCell?

В моем UICollectionView у меня есть ячейка. Это мой cellForItemAtIndexPath

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
{
    var videoCell = collectionView.dequeueReusableCellWithReuseIdentifier("cellVideo", forIndexPath: indexPath) as? CollectionViewCell

    let post = self.arrayOfDetails[indexPath.row]

    var myUrl = post.image // post.image is image url

    let fileUrl = NSURL(string: post.image)

    aPlayer = AVPlayer(URL: fileUrl)

    moviePlayerController.player = aPlayer
    moviePlayerController.view.frame = CGRectMake(8, 8, videoCell!.frame.size.width-16, 310)
    moviePlayerController.videoGravity = AVLayerVideoGravityResizeAspectFill
    moviePlayerController.view.sizeToFit()
    moviePlayerController.showsPlaybackControls = true
    videoCell!.addSubview(moviePlayerController.view)

    return videoCell!
}

Проблема в том, что AVPlayerViewController не отображается в каждой ячейке. Но только в ячейке, которая находится под той, на которую я смотрю, поэтому, если я прокручиваю свой UICollectionView и как только на экране появляется новая ячейка, AVPlayerViewController находится в этой ячейке, а не в ячейке в середине экрана. Любые предложения, что я могу ошибаться здесь?

Видео здесь: https://vid.me/e/fU5X


person Tore. Ini    schedule 26.11.2015    source источник
comment
Это поведение по умолчанию для UICollectionView ячеек, которые можно использовать повторно. Если вы хотите показать видео, если какая-то конкретная ячейка, вам нужно указать, в какой из них в вашем cellForRowAtIndexPath   -  person Victor Sigler    schedule 26.11.2015


Ответы (1)


Вам нужны новые aPlayer и moviePlayerController для каждой ячейки, в которой есть видео. Что-то вроде этого должно сделать это:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
    {
        var videoCell = collectionView.dequeueReusableCellWithReuseIdentifier("cellVideo", forIndexPath: indexPath) as? CollectionViewCell

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

        let post = self.arrayOfDetails[indexPath.row]

        var myUrl = post.image // post.image is image url

        let fileUrl = NSURL(string: post.image)

        aPlayer = AVPlayer(URL: fileUrl)

        moviePlayerController.player = aPlayer
        moviePlayerController.view.frame = CGRectMake(8, 8, videoCell!.frame.size.width-16, 310)
        moviePlayerController.videoGravity = AVLayerVideoGravityResizeAspectFill
        moviePlayerController.view.sizeToFit()
        moviePlayerController.showsPlaybackControls = true
        videoCell!.addSubview(moviePlayerController.view)

        return videoCell!
    }
person Erik Auranaune    schedule 26.11.2015
comment
Поскольку ячейка используется повторно, несколько AVPlayer будут добавлены в одну и ту же ячейку, когда пользователь прокручивает представление таблицы. Важно удалить AVPlayer (если он существует) перед добавлением нового. - person Rameez; 10.12.2017
comment
Это необходимо обновить, так как это неверно и может вызвать у читателей множество проблем. Как отметил Рамиз, прокрутка приводит к многократному добавлению moviePlayerController в одну и ту же ячейку. - person crashoverride777; 28.03.2018