Добавить AVPlayerLayer в качестве подслоя в каждой ячейке представления коллекции? - PullRequest
0 голосов
/ 16 мая 2018

У меня есть пользовательское представление, которое я встраиваю в каждую ячейку CollectionView.Это представление, когда ему присваивается URL-адрес, проверяет, является ли его URL-адрес фото или видео, а также видео, он добавляет AVPlayerLayer и устанавливает ресурс в URL-адрес.Если это изображение, оно добавляет представление изображения с этим изображением.

import UIKit
import Kingfisher
import AVKit
import AVFoundation

class MediaPlayerView: UIView {
    var mediaURL: URL? {
        didSet {
            determineMediaType()
        }
    }
    let videoExtensions = ["mov"]
    var asset: AVURLAsset?
    var playerLayer: AVPlayerLayer {
        return layer as! AVPlayerLayer
    }
    var player: AVPlayer?{
        get {
            return playerLayer.player
        }
        set {
            playerLayer.player = newValue
        }
    }
    override static var layerClass: AnyClass {
        return AVPlayerLayer.self
    }
    static let assetKeysRequiredToPlay = [
        "playable",
        "hasProtectedContent"
    ]

    private var playerItem: AVPlayerItem? = nil

    override init (frame : CGRect) {
        super.init(frame : frame)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        //determineMediaType()
    }

    func determineMediaType() {
        let url = self.mediaURL
        let pathExtention = url?.pathExtension
        print(url)
        print(pathExtention)
        if videoExtensions.contains(pathExtention!) {
            print("Movie URL: \(String(describing: url))")
            setupVideo(url: url!)
        } else {
            print("Image URL: \(String(describing: url))")
            setupImage(url: url!)
        }
    }

    func setupVideo(url: URL) {
        self.layer.addSublayer(playerLayer)
        asset = AVURLAsset(url: url, options: nil)
    }

    func setupImage(url: URL) {
        let imageView = UIImageView()
        imageView.frame = self.bounds
        imageView.autoresizingMask = [.flexibleWidth,.flexibleHeight]
        self.addSubview(imageView)
        imageView.kf.setImage(with: url)
    }

}

Прямо сейчас, когда это представление создается, оно завершается с этим исключением:

Terminating app due to uncaught exception 'CALayerInvalid', reason: 'layer <AVPlayerLayer: 0x60c000a26760> is a part of cycle 

Я думаю, что это проблема, потому что я добавляю playerLayer в функции setupVideo к себе, которыйпереопределил LayerClass, чтобы всегда предоставлять AVPlayerLayer.self.АКА добавляет слой игрока как подпредставление к себе.Но я не уверен, как этого избежать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...