【问题标题】:Video view inside xib not stretching to width of controllerxib 内的视频视图未拉伸到控制器的宽度
【发布时间】:2019-11-01 16:50:57
【问题描述】:

我有一个使用 xib 作为其单元格的集合视图。在那个 xib 中,我有一个带有自定义类 VideoViewUIView,它看起来像这样:

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

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

【问题讨论】:

    标签: ios swift xcode swift4 xib


    【解决方案1】:

    如果您有自定义 xib。

    你将拥有:

    playerLayer = AVPlayerLayer 
    mainVideoView: UIView - ( main view is view where video is playing ) 
    

    在 viewDidLoad 或一些自定义 Func 中,您将拥有:

        playerLayer.frame = mainVideoView.frame
        playerLayer.videoGravity = .resizeAspectFill
    

    这是我的代码示例: /// 视频播放器配置

    func configPlayer(with url: String) {
        guard let url = URL(string: url) else { return }
        let player = AVPlayer(url: url)
        let playerLayer = AVPlayerLayer(player: player)
        playerLayer.frame = mainVideoView.frame
        playerLayer.videoGravity = .resizeAspectFill
        mainVideoView.layer.addSublayer(playerLayer)
    }
    

    【讨论】:

      【解决方案2】:

      你可以试试:

      playerLayer.videoGravity=AVLayerVideoGravityResizeAspectFill
      

      【讨论】:

        【解决方案3】:

        就像你说的,我认为问题出在这行代码上:

        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)
        
        }
        

        我希望这能解决你的问题。

        【讨论】:

        • 我不能在playerLayer?.frame = view.frame中使用view,因为Use of unresolved identifier 'view'
        猜你喜欢
        • 1970-01-01
        • 2013-03-11
        • 2015-05-04
        • 2016-02-05
        • 2015-02-05
        • 2013-04-06
        • 2015-03-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多