Xib内部的视频视图未拉伸到控制器的宽度

时间:2019-06-19 02:40:52

标签: ios swift xcode swift4 xib

我有一个收集视图,该视图使用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

但是我不知道如何更改它,以使视频与集合视图控制器的宽度匹配。

2 个答案:

答案 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