I have an AVPlayerViewController
which I initialize with an AVPlayer
and some AVPlayerItem
(iOS 10, Xcode 8, Objective C).
The AVPlayerViewController
is presented "inline" inside some subview, and everything works perfectly with the native playback controls.
When I press the native fullscreen button, it also works ok and switches to full screen mode (with Done button on top left).
My problem is when I press the Done button to return from full screen, the player for some reason stops playing, resets itself, and if I check .currentItem
, I see it's nil
.
What's happening here? Why can't AVPlayerViewController
maintain its AVPlayerItem
in between switching from/to full screen?
Since it looks like the current behavior of AVPlayerViewController
is to pause when exiting full screen, we can call play()
when exiting by implementing the delegate:
class VideoView {
private var playerViewController: AVPlayerViewController?
func something() {
playerViewController = AVPlayerViewController()
// Other setups
playerViewController?.delegate = self
}
}
extension VideoView: AVPlayerViewControllerDelegate {
func playerViewController(_ playerViewController: AVPlayerViewController, willEndFullScreenPresentationWithAnimationCoordinator coordinator: UIViewControllerTransitionCoordinator) {
// The system pauses when returning from full screen, we need to 'resume' manually.
coordinator.animate(alongsideTransition: nil) { transitionContext in
self.playerViewController?.player.play()
}
}
}