AVPlayerViewController 上没有“完成”按钮

Posted

技术标签:

【中文标题】AVPlayerViewController 上没有“完成”按钮【英文标题】:No "Done" button on AVPlayerViewController 【发布时间】:2015-06-24 20:24:34 【问题描述】:

我正在使用 AVPLayerViewController 流式传输内容。播放正常,但我没有看到“完成”按钮来关闭视图。

这是我如何设置和显示视图控制器

NSURL* url = [content localSessionUrl];
AVPlayerViewController *playerViewController = [[AVPlayerViewController alloc] init];
playerViewController.player = [AVPlayer playerWithURL:url];
[self.navigationController pushViewController:playerViewController animated:YES];
[self.navigationController setNavigationBarHidden:YES];

是因为我将它推到导航控制器上吗?

【问题讨论】:

你是怎么处理这个的??制作自定义完成按钮? @dev @Fyza,而不是 pushViewController,我调用了 presentViewController,如下 pck456 所述 试试这个solution为我工作! 【参考方案1】:

尝试呈现视图,而不是推送或添加子视图。完成按钮将自动显示。下面是代码sn-p。

-(void)playVideoWithUrl:(NSURL *)url
    AVPlayerViewController *playerViewController = [[AVPlayerViewController alloc]init];
    playerViewController.player = [[AVPlayer alloc]initWithURL:url];
    [self presentViewController:playerViewController animated:YES completion:nil];
    playerViewController.view.frame = self.view.frame;
    [playerViewController.player play];

【讨论】:

完美运行...!! Swift 3 更新:使用self.showDetailViewController 而不是self.presentViewController【参考方案2】:

是的,“完成”按钮作为模态演示样式的解除。如果您将 AVPlayerViewController 推送到导航堆栈上,您将需要自己处理弹出。

【讨论】:

【参考方案3】:

我认为问题在于,当您将 AVPlayerViewController 视图添加到屏幕上占据整个屏幕的视图时,它会将其视为已经处于全屏模式。诀窍是将其添加到占据屏幕较小部分的视图中。

最初我是这样做的:

// Setup an AVPlayerViewController
self.avPlayerViewController = [[AVPlayerViewController alloc] init];
if ([self.avPlayerViewController respondsToSelector:@selector(allowsPictureInPicturePlayback)]) 
    self.avPlayerViewController.allowsPictureInPicturePlayback = NO;


// Attach the Active Cloack AVPlayer to the AVPlayerViewController
AVPlayer *player = self.avPlayer;
self.avPlayerViewController.player = player;
self.avPlayerViewController.view.frame = self.view.bounds;
[self.view addSubview:self.avPlayerViewController.view];

// Setup the Parent Child relationshipo
[self addChildViewController:self.avPlayerViewController];
[self.avPlayerViewController willMoveToParentViewController:self];
[self.avPlayerViewController didMoveToParentViewController:self];

但是,我遇到了同样的问题,我的播放器没有“完成”按钮,所以我无法退出视频。

然后我修改了我的 xib/storyboard 并在顶部添加了一个 UINavigationBar 并带有一个完成按钮,并在其下方添加了一个 UIView 作为容器。然后我将 avPlayerViewController 添加到这个容器视图中,控件神奇地变成了非全屏模式。我有一个全屏按钮,可以让播放器进入全屏模式。

然后我不得不创建代码来自动隐藏我的导航栏并为此添加一个完成按钮和一个标题等......

【讨论】:

【参考方案4】:

对于 iPad,我使用 UIModalPresentationFormSheet 来展示和完成按钮 wwas 丢失...所以我使用了自己的按钮:

        AVPlayerViewController *playerViewController =
 [[AVPlayerViewController alloc] init]; 

//...

        UIViewController *controllerToPresent = playerViewController;

        if (IS_IPAD)
            SBNavigationController *nc = [[SBNavigationController alloc] initWithRootViewController:playerViewController];
            [playerViewController.navigationItem setLeftBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Done", @"") style:UIBarButtonItemStylePlain target:self action:@selector(cancelPlayingPressed)]];
            controllerToPresent = nc;
         

【讨论】:

【参考方案5】:

我也遇到了这个问题。我将 segue 从“Push”切换到“Modal”,然后出现了关闭按钮。

【讨论】:

以上是关于AVPlayerViewController 上没有“完成”按钮的主要内容,如果未能解决你的问题,请参考以下文章

AVPlayerViewController 不按 url 播放视频

iOS - 在 AVPlayerViewController 之上添加控件

在 AVPlayerViewController 中禁用手势识别器

在 AVPlayerViewController 中点击播放按钮时执行操作

Swift AVPlayerViewController 添加 AirPlay

AVPlayerViewController 上没有“完成”按钮