Abid Hussain Abid Hussain - 1 month ago 30
iOS Question

AVPlayerController: Full screen Autolayout issues

I'm playing Video in my Swift app (iOS 9) with the following code:

let fileUrl = NSBundle.mainBundle().URLForResource("welcome", withExtension: ".mp4")
videoItem = AVPlayerItem(URL: fileUrl!)
videoPlayer = AVPlayer(playerItem: videoItem)
videoPlayer.addObserver(self, forKeyPath: "rate", options: [.New], context: nil)

videoPlayerController.player = videoPlayer
videoPlayerController.showsPlaybackControls = false

videoPlayerController.view.frame = CGRectMake(0, 0, playerView.frame.size.width, playerView.frame.size.height)
playerView.insertSubview(videoPlayerController.view, belowSubview: videoCoverView)

videoPlayerController.willMoveToParentViewController(self)
addChildViewController(videoPlayerController)
videoPlayerController.didMoveToParentViewController(self)

playerView.bringSubviewToFront(btnPlay)

let asset = AVAsset(URL: fileUrl!)
let imageGenerator = AVAssetImageGenerator(asset: asset)
let time = CMTime(seconds: asset.duration.seconds/2.0, preferredTimescale: 1)

do {
let imageRef = try imageGenerator.copyCGImageAtTime(time, actualTime: nil)
let coverImage = UIImage(CGImage: imageRef)
videoCoverView.image = coverImage
} catch {

}


videoPlayerController
is an instance of
AVPlayerViewController
.
playerView
is added through storyboard and has Autolayout setup on it. I face Autloayout issues once the player controls of AVPlayerViewController show up and also when I try to go in full screen mode through player controls. Here is the log that gets printed.

2016-05-07 15:18:19.325 VoxTrain[2085:66307] 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.
(Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSAutoresizingMaskLayoutConstraint:0x7fb6a2a3f2c0 h=-&- v=-&- _UIBackdropContentView:0x7fb6a2a02310.width == _UIBackdropView:0x7fb6a053bf90.width>",
"<NSLayoutConstraint:0x7fb6a2992800 H:|-(14)-[UILabel:0x7fb6a2991220'Hi-Speed Scrubbing'] (Names: '|':_UIBackdropContentView:0x7fb6a2a02310 )>",
"<NSLayoutConstraint:0x7fb6a2992850 H:[UILabel:0x7fb6a2991220'Hi-Speed Scrubbing']-(14)-| (Names: '|':_UIBackdropContentView:0x7fb6a2a02310 )>",
"<NSLayoutConstraint:0x7fb6a29649a0 H:|-(0)-[_UIBackdropView:0x7fb6a053bf90] (Names: '|':UIView:0x7fb6a0549220 )>",
"<NSLayoutConstraint:0x7fb6a298b8a0 H:[_UIBackdropView:0x7fb6a053bf90]-(0)-| (Names: '|':UIView:0x7fb6a0549220 )>",
"<NSLayoutConstraint:0x7fb6a296f440 H:|-(0)-[UIView:0x7fb6a0549220] (Names: '|':AVAlphaUpdatingView:0x7fb6a053dae0 )>",
"<NSLayoutConstraint:0x7fb6a296f490 H:[UIView:0x7fb6a0549220]-(0)-| (Names: '|':AVAlphaUpdatingView:0x7fb6a053dae0 )>",
"<NSLayoutConstraint:0x7fb6a2a40cc0 'UIView-Encapsulated-Layout-Width' H:[AVAlphaUpdatingView:0x7fb6a053dae0(0)]>"
)


After the initial approach, I tried to set
autolayout
on
videoPlayerController's
view with setting
translatesAutoresizingMaskIntoConstraints
to false. But the issue still persists. How can I fix these issues?

Answer

The problem is that you trying to set showsPlaybackControls = true when your AVPlayerController is onscreen. Doing so creates system UI elements, which leads to Auto Layout issues.

Docs are very specific about this point:

Do not use this property to change the visibility of the playback controls while the player view controller is onscreen, because doing so creates or destroys UI elements.

Link: https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVPlayerViewController_Class/#//apple_ref/occ/instp/AVPlayerViewController/showsPlaybackControls