我正在尝试在单元格中显示视频。相反,它只是作为一个黑盒出现。有可能没有初始化播放器。但是,我确实看到了黑框,所以我知道它正在初始化VideoPlayerView。当我打印playerLayer的帧时,它打印(0.0,0.0,0.0,0.0),可能是由于我初始化视图的方式。有没有办法在不使用frame的情况下将playerlayer扩展到视图的边缘?
class VideoPlayerView : UIView {
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = UIColor.black
let videoURL = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
let player = AVPlayer(url: videoURL!)
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = self.bounds
//print(playerLayer.frame)
self.layer.addSublayer(playerLayer)
player.play()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
谢谢!
发布于 2017-08-08 04:27:54
我尝试了几种不同的方法,最后使用了一个自定义的UIView类方法(就像您一样),但有一些不同之处。例如,您的类可能如下所示:
class PlayerView: UIView {
var player: AVPlayer? {
get {
return playerLayer.player
}
set {
playerLayer.player = newValue
}
}
var playerLayer: AVPlayerLayer {
return layer as! AVPlayerLayer
}
// Override UIView property
override static var layerClass: AnyClass {
return AVPlayerLayer.self
}
}
然后,在IB中添加一个UIView,将类设置为PlayerView (而不是默认的UIView),添加像normal这样的约束,并像其他控件一样将一个插座拖到控制器上。要使用它,请执行以下操作:
playerView.player = AVPlayer(url: url)
playerView.playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
然后在您的应用程序需要时触发Play命令。
您可以使用相同的方法动态创建此视图,但我倾向于大多数时间使用IB。
希望这能有所帮助!
发布于 2017-08-08 00:26:12
您可以将约束设置为playerLayer
,例如:
let width = UIScreen.main.bounds.width
let height = 300
let playerLayer = AVPlayerLayer(player: player)
playerLayer.translatesAutoresizingMaskIntoConstraints = false
playerLayer.widthAnchor.constraint(equalToConstant: width).isActive = true
playerLayer.heightAnchor.constraint(equalToConstant: height).isActive = true
发布于 2017-08-08 04:48:27
我想你所需要做的就是添加下面的代码:
当你调整大小时,它不会自动调整图层大小。
override func layoutSublayers(of layer: CALayer) {
super.layoutSublayers(of: layer)
playerLayer?.frame = self.bounds
}
https://stackoverflow.com/questions/45557468
复制相似问题