首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何让AVPlayerViewController以编程的方式全屏显示?

如何让AVPlayerViewController以编程的方式全屏显示?
EN

Stack Overflow用户
提问于 2015-06-13 18:33:35
回答 9查看 31K关注 0票数 36

我试图通过编程的方式让AVPlayerViewController从“嵌入式”模式转到全屏模式,但是使用发布的API似乎无法做到这一点。

有没有我错过的变通方法?我对获得与用户按下控件右下角的全屏按钮时获得的动画相同的动画感兴趣。

使用MPMoviePlayerController不是一个可行的选择,因为我可能会同时播放多个视频。

谢谢。

EN

回答 9

Stack Overflow用户

发布于 2015-11-19 00:14:07

AVPlayerViewController是UIViewController的一个子类,因此它和其他视图控制器子类一样是可表示的。你会使用presentViewController:animated:completion吗?

代码语言:javascript
运行
复制
self.avPlayerController.modalPresentationStyle = UIModalPresentationOverFullScreen;
[self presentViewController:self.avPlayerController animated:YES completion:nil];

然后在左上角显示“完成”按钮。

票数 15
EN

Stack Overflow用户

发布于 2016-04-26 08:21:01

针对iOS 11更新了

没有一种受支持的方式可以通过编程的方式使用AVPlayerViewController全屏(在我看来,这有点疏忽)。

然而,AVPlayerViewController does contain a private method确实做到了这一点。你必须自己决定是否要使用它,因为你不应该调用私有方法。

AVPlayerViewController+Fullscreen.h

代码语言:javascript
运行
复制
#import <AVKit/AVKit.h>

@interface AVPlayerViewController (Fullscreen)

-(void)goFullscreen;

@end

AVPlayerViewController+Fullscreen.m

代码语言:javascript
运行
复制
#import "AVPlayerViewController+Fullscreen.h"

@implementation AVPlayerViewController (Fullscreen)

-(void)goFullscreen {
    NSString *selectorForFullscreen = @"transitionToFullScreenViewControllerAnimated:completionHandler:";
    if (@available(iOS 11.3, *)) {
        selectorForFullscreen = @"transitionToFullScreenAnimated:interactive:completionHandler:";
    } else if (@available(iOS 11.0, *)) {
        selectorForFullscreen = @"transitionToFullScreenAnimated:completionHandler:";
    }
    SEL fsSelector = NSSelectorFromString([@"_" stringByAppendingString:selectorForFullscreen]);
    if ([self respondsToSelector:fsSelector]) {
        NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:fsSelector]];
        [inv setSelector:fsSelector];
        [inv setTarget:self];

        NSInteger index = 2; //arguments 0 and 1 are self and _cmd respectively, automatically set
        BOOL animated = YES;
        [inv setArgument:&(animated) atIndex:index];
        index++;

        if (@available(iOS 11.3, *)) {
            BOOL interactive = YES;
            [inv setArgument:&(interactive) atIndex:index]; //arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation
            index++;
        }

        id completionBlock = nil;
        [inv setArgument:&(completionBlock) atIndex:index];
        [inv invoke];
    }
}

@end
票数 14
EN

Stack Overflow用户

发布于 2017-09-26 18:11:20

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

我可以展示一个如何使用它的示例。首先,您需要在UIViewController中创建AVPlayerViewController实例

代码语言:javascript
运行
复制
private let playerController : AVPlayerViewController = {

    if let urlForPlayer = URL(string: "your_video_url") {

        $0.player = AVPlayer(url: urlForPlayer)
    }
    return $0
} (AVPlayerViewController())

然后,您需要为AVPlayerViewController设置视图,并将其添加到当前控制器视图中。Function setupAVplayerController可以为您完成此操作:

代码语言:javascript
运行
复制
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)
}

Function enterFullscreen强制使用AVPlayerViewController的全屏模式

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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)
    }
}

不要忘记,此解决方案基于不推荐使用的私有API调用。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30817667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档