考虑一个 UICollectionView,其中每个单元格都包含一个 UIView。单元格中的 UIView 将链接到将播放视频的 AVPlayerLayer。但是,以纵向模式拍摄的视频似乎无法正确缩放。当我使用 AVPlayerLayer
的 videoGravity
属性并将其设置为 resizeAspectFill
以便视频填充单元格时,它似乎剪切了视频。
Is there a way to make the video taken in portrait fit a square cell?
设置如下:
UICollectionView 提要中的单元格将包含一个 UIView,它将容纳视频播放器。这是 UIView 的类 PlayerViewClass:
import Foundation
import UIKit
import AVKit
import AVFoundation
class PlayerViewClass: UIView {
override static var layerClass: AnyClass {
return AVPlayerLayer.self
}
var playerLayer: AVPlayerLayer {
return layer as! AVPlayerLayer
}
var player: AVPlayer? {
get {
return playerLayer.player
}
set {
playerLayer.player = newValue
}
}
}
单元格 MyCollectionViewCell 有一个链接到此 UIView 的 IBOutlet:
class MyCollectionViewCell {
@IBOutlet weak var playerView: PlayerViewClass!
override func awakeFromNib() {
super.awakeFromNib()
//Setup, not relevant
}
}
FeedViewController 中 Feed 的 collectionView cellForItemAt indexPath 委托(delegate)方法如下:
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
if let cell = cell as? MyCollectionViewCell {
...
//Configuring the cell
...
//Video player
let avPlayer = AVPlayer(url: post.fullURL)
**//TODO: Configure layout so the portrait video scales appropriately**
//Setting cell's player
cell.playerView.playerLayer.player = avPlayer
//Play
cell.playerView.player?.play()
}
return cell
}
任何帮助将不胜感激,因为到目前为止我似乎找不到答案!
最佳答案
it seems to cut the video
是的,这就是 resizeAspectFill
所做的。它填满了正方形,任何不适合的东西都落在正方形之外并被切断。不足为奇。如果这不是您想要的,您为什么要请求 resizeAspectFill
?
也许您的意思是 resizeAspect
。这将显示整个视频,在给定的限制(正方形)内。
关于ios - 如何使纵向模式下的视频适合方形单元格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57565169/