У меня есть пользовательское представление, которое я встраиваю в каждую ячейку 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.АКА добавляет слой игрока как подпредставление к себе.Но я не уверен, как этого избежать?