Просмотр видео внутри XIB не растягивается на ширину контроллера - PullRequest
0 голосов
/ 19 июня 2019

У меня есть представление коллекции, которое использует 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)
    }
}

Вот как выглядит моя ячейка:

https://i.stack.imgur.com/xJ4DC.png

Как видите, ограничения установлены на суперпредставление (то есть растянуто на полную ширину / высоту).

Проблема в том, что видео не занимает всю ширину контроллера представления коллекции (красный фон - полный размер ячейки):

https://i.stack.imgur.com/DlH4Q.png

Как видите, видео не растягивается на полную ширину.

Я полагаю, что это связано с тем, что ширина и высота xib является статической высотой (360x640), и эта строка в классе VideoView использует эту ширину / высоту для установки размера видео:

playerLayer?.frame = bounds

Но я не знаю, как это изменить, чтобы видео соответствовало ширине контроллера представления коллекции.

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Вы можете попробовать:

playerLayer.videoGravity=AVLayerVideoGravityResizeAspectFill
0 голосов
/ 19 июня 2019

Как вы сказали, я думаю, что проблема в этой строке кода:

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)

}

Надеюсь, это решит вашу проблему.

...