如何使AVPlayerViewController进入全屏编程?

我试图使AVPlayerViewController进入全屏模式编程,来自“embedded”模式,但是这似乎不可能与发布的API。

有没有解决方法,我错过了? 我有兴趣获得与用户按下控件右下angular的全屏button时所获得的animation相同的animation。

使用MPMoviePlayerController不是一个可行的select,因为我可能一次播放多个video。

谢谢。

AVPlayerViewController是UIViewController的一个子类,所以它像任何其他视图控制器子类一样。 你可以使用presentViewController:animated:completion

 self.avPlayerController.modalPresentationStyle = UIModalPresentationOverFullScreen; [self presentViewController:self.avPlayerController animated:YES completion:nil]; 

然后在左上angular显示“完成”button。

更新了iOS 11

有没有支持的方式来编程与AVPlayerViewController全屏(在我看来有点疏忽)。

但是, AVPlayerViewController确实包含一个私人的方法 。 你必须自己决定是否要使用它,因为你不应该调用私有方法。

AVPlayerViewController + Fullscreen.h

 #import <AVKit/AVKit.h> @interface AVPlayerViewController (Fullscreen) -(void)goFullscreen; @end 

AVPlayerViewController + Fullscreen.m

 #import "AVPlayerViewController+Fullscreen.h" @implementation AVPlayerViewController (Fullscreen) -(void)goFullscreen { NSString *selectorForFullscreen = @"_transitionToFullScreenViewControllerAnimated:completionHandler:"; if (@available(iOS 11.0, *)) { selectorForFullscreen = @"_transitionToFullScreenAnimated:completionHandler:"; } SEL fsSelector = NSSelectorFromString(selectorForFullscreen); if ([self respondsToSelector:fsSelector]) { NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:fsSelector]]; [inv setSelector:fsSelector]; [inv setTarget:self]; BOOL animated = YES; id completionBlock = nil; [inv setArgument:&(animated) atIndex:2]; //arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation [inv setArgument:&(completionBlock) atIndex:3]; [inv invoke]; } } @end 

在iOS11中, AVPlayerViewController有两个新的属性: entersFullScreenWhenPlaybackBeginsexitsFullScreenWhenPlaybackEnds时间entersFullScreenWhenPlaybackBegins exitsFullScreenWhenPlaybackEnds 。 您可以在播放开始后立即启用全屏模式,并在以这些属性播放结束时将其禁用。 如果您需要延迟一段时间才能启用全屏模式,您可以使用私人API方法,如ToddH在他的答案中提到的那样。 然而,在iOS11 _transitionToFullScreenViewControllerAnimated:completionHandler:方法不再可用,有相同的方法称为_transitionToFullScreenAnimated:completionHandler: 第二种方法接受与第一种相同的参数。

我可以举一个例子来说明如何使用它。 首先你需要在你的UIViewController创buildAVPlayerViewController实例:

 private let playerController : AVPlayerViewController = { if let urlForPlayer = URL(string: "your_video_url") { $0.player = AVPlayer(url: urlForPlayer) } return $0 } (AVPlayerViewController()) 

然后,您需要设置AVPlayerViewController的视图,并将其添加到您当前的控制器视图。 函数setupAVplayerController可以为你做到这一点:

 private func setupAVplayerController() { self.addChildViewController(self.playerController) self.playerController.view.frame = CGRect(x: 0.0, y: 0.0, width: 200.0, height: 200.0) self.view.addSubview(self.playerController.view) self.playerController.didMove(toParentViewController: self) } 

functionenterFullscreen强制AVPlayerViewController全屏模式:

 private func enterFullscreen(playerViewController:AVPlayerViewController) { let selectorName : String = { if #available(iOS 11, *) { return "_transitionToFullScreenAnimated:completionHandler:" } else { return "_transitionToFullScreenViewControllerAnimated:completionHandler:" } }() let selectorToForceFullScreenMode = NSSelectorFromString(selectorName) if playerViewController.responds(to: selectorToForceFullScreenMode) { playerViewController.perform(selectorToForceFullScreenMode, with: true, with: nil) } } 

现在,您需要在需要的地方调用所有这些函数,例如在viewDidAppear

 override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) //Your code self.setupAVplayerController() self.playerController.player?.play() DispatchQueue.main.asyncAfter(deadline: .now() + 10) { self.enterFullscreen(playerViewController:self.playerController) } } 

不要忘记,这个解决scheme基于私人API调用,不build议使用。

Swift 3版本为ToddH的答案:

 extension AVPlayerViewController { func goFullScreen() { let selector = NSSelectorFromString("_transitionToFullScreenViewControllerAnimated:completionHandler:") if self.responds(to: selector) { // first argument is animated (true for me), second is completion handler (nil in my case) self.perform(selector, with: true, with: nil) } } }