Search code examples
iosswift2avplayerviewcontroller

AVPlayerViewController and View's constraints


I am developing my first app using AVPlayerViewController. I need to display video stream using this class inside view. On the screenshot this view has dark blue color. Under this view I have Label and UICollectionView. When I tap on item, video is displayed but there is a problem with size of this view, size is changed, label under view becomes not visible, also there is a gap on top of view. I use AutoLayout to set constrains and they are correct, XCode doesn't show problems with layout, but after tapping on item to start video during runtime, XCode shows a lot of errors with constraints. This is how layout looks, no errors or warnings.

Layout

This is how app looks when it starts app starts

This is a problem with layout when I tap on item of UICollectionView, as you can see AVPlayer with controller do not fill dark blue view (leaves free space), also changes its size, so label is not visible. Also buttons of this controller do not work, it appears when I tap on video. problem with layout

This is a code where I set frame for AVPlayerViewController, myView is a dark blue view.

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {

        let url = NSURL(string:"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8")
        playerController.player = player
        self.addChildViewController(playerController)
        self.myView.addSubview(playerController.view)
        playerController.view.frame = self.myView.frame
        let playerItem = AVPlayerItem(URL: url!)
        player.replaceCurrentItemWithPlayerItem(playerItem)
        player.play()   
    }

This is an error in the output after executing this code:

Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it.


Solution

  • Instead of a view I added Container View, AVKit Player View Controller on the Storyboard and made connection between them, also added a code to a ViewController:

    let child = childViewControllers[0] as! AVPlayerViewController
    child.view.clipsToBounds = true
    child.player = player
    

    now it works