我有一个收集视图,该视图使用xib作为其单元格。在那个xib中,我有一个UIView
,带有一个自定义类VideoView
,它看起来像这样:
import UIKit
import AVKit
import AVFoundation
/**
Source: https://medium.com/@rodrigo_freitas/a-simple-ios-view-to-play-video-b7ee05f9ce6a
*/
class VideoView: UIView {
var playerLayer: AVPlayerLayer?
var player: AVPlayer?
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
func configure(url: String) {
if let videoURL = URL(string: url) {
player = AVPlayer(url: videoURL)
playerLayer = AVPlayerLayer(player: player)
playerLayer?.frame = bounds
playerLayer?.videoGravity = AVLayerVideoGravity.resizeAspect
if let playerLayer = self.playerLayer {
layer.addSublayer(playerLayer)
}
}
}
func play() {
if player?.timeControlStatus != AVPlayer.TimeControlStatus.playing {
player?.play()
}
}
func pause() {
player?.pause()
}
func stop() {
player?.pause()
player?.seek(to: CMTime.zero)
}
}
这是我的细胞xib的样子:
https://i.stack.imgur.com/xJ4DC.png
如您所见,约束设置为超级视图(即拉伸到全宽/全高)。
问题在于视频未占用集合视图控制器的整个宽度(红色背景是整个单元格的大小):
https://i.stack.imgur.com/DlH4Q.png
如您所见,视频无法拉伸到整个宽度。
我认为这与xib的宽度和高度是静态高度(360x640)以及VideoView
类中的这一行使用该宽度/高度来设置视频的大小有关:
playerLayer?.frame = bounds
但是我不知道如何更改它,以使视频与集合视图控制器的宽度匹配。
答案 0 :(得分:0)
就像您说的,我认为问题出在这行代码:
playerLayer?.frame = bounds
因此,请尝试为其提供自定义CGRect,使其具有与视图相同的高度和宽度,以确保它是问题的根源。如果是这样,则将您的代码更改为:
playerLayer?.frame = view.frame
我不确定您从哪里获得“界限”,但是它的值可能不正确,这就是为什么您要缩小视图的原因。 还要确保collectionCell的大小实际上足够整个屏幕使用此功能,或者只是从情节提要中调整大小:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: view.frame.width, height: view.frame.height)
}
我希望这可以解决您的问题。
答案 1 :(得分:0)
您可以尝试:
playerLayer.videoGravity=AVLayerVideoGravityResizeAspectFill