Search code examples
iosiphoneswiftavplayeravplayerviewcontroller

Swift AV Player Video Should be AspectFill OR Full Screen


At Sign In Screen I've to display background video with full resolution. I'm able to do this by double tapping on below image at black area.

enter image description here

Here is my required result. but this isn't done by coding. I just did this by double tapping on black area. enter image description here

Here is my Code for this class.

class loginViewController: UIViewController {
@IBOutlet weak var videoView: UIView!
let player = AVPlayer()

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationController?.isNavigationBarHidden = true
    let myFileManager = FileManager.default
    let mainBundle = Bundle.main
    let resourcesPath = mainBundle.resourcePath!
    guard let allItemsInTheBundle = try? myFileManager.contentsOfDirectory(atPath: resourcesPath) else {
        return
        }

    let videoName = "login_video"
    let videoPath = Bundle.main.path(forResource: videoName, ofType: "mp4")
    let videoUrl = URL(fileURLWithPath: videoPath!)

        let player = AVPlayer(url: videoUrl)
        let controller=AVPlayerViewController()
        controller.player=player

        let playerLayer = AVPlayerLayer(player: self.player)        
        playerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill;

        controller.showsPlaybackControls = false
        controller.view.frame = self.view.frame
        videoView.addSubview(controller.view)
        self.addChildViewController(controller)
        player.play()
        player.actionAtItemEnd = .none
        loopVideo(player: player)
}
func loopVideo(player: AVPlayer) {
    NotificationCenter.default.addObserver(forName: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil, queue: nil) { notification in
        player.seek(to: kCMTimeZero)
        player.play()
    }
}   
}

can anyone suggest me that how can I achieve this required result. I found this solution but in vein.

     let playerLayer = AVPlayerLayer(player: self.player)        
     playerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill;

Please suggest me the better way. Thanks in advance.


Solution

  • This code does nothing:

        let playerLayer = AVPlayerLayer(player: self.player)        
        playerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill;
    

    All that does is create a new player layer and throw it away.

    The AVPlayerViewController already has a player layer! Set the video gravity of the AVPlayerViewController.

        controller.videoGravity = ...