我试图通过编程的方式让AVPlayerViewController从“嵌入式”模式转到全屏模式,但是使用发布的API似乎无法做到这一点。
有没有我错过的变通方法?我对获得与用户按下控件右下角的全屏按钮时获得的动画相同的动画感兴趣。
使用MPMoviePlayerController不是一个可行的选择,因为我可能会同时播放多个视频。
谢谢。
发布于 2015-11-19 00:14:07
AVPlayerViewController是UIViewController的一个子类,因此它和其他视图控制器子类一样是可表示的。你会使用presentViewController:animated:completion
吗?
self.avPlayerController.modalPresentationStyle = UIModalPresentationOverFullScreen;
[self presentViewController:self.avPlayerController animated:YES completion:nil];
然后在左上角显示“完成”按钮。
发布于 2016-04-26 08:21:01
针对iOS 11更新了
没有一种受支持的方式可以通过编程的方式使用AVPlayerViewController全屏(在我看来,这有点疏忽)。
然而,AVPlayerViewController does contain a private method确实做到了这一点。你必须自己决定是否要使用它,因为你不应该调用私有方法。
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.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
发布于 2017-09-26 18:11:20
在iOS11中,AVPlayerViewController
有两个新属性:entersFullScreenWhenPlaybackBegins
和exitsFullScreenWhenPlaybackEnds
。您可以在播放开始后立即启用全屏模式,并在具有这些属性的播放结束时禁用该模式。如果您需要在一段时间后启用全屏模式,您可以使用私有API方法,如his answer中提到的ToddH。然而,在iOS11中,_transitionToFullScreenViewControllerAnimated:completionHandler:
方法不再可用,有同样的方法,称为_transitionToFullScreenAnimated:completionHandler:
。第二个方法接受与第一个方法相同的参数。
我可以展示一个如何使用它的示例。首先,您需要在UIViewController
中创建AVPlayerViewController
实例
private let playerController : AVPlayerViewController = {
if let urlForPlayer = URL(string: "your_video_url") {
$0.player = AVPlayer(url: urlForPlayer)
}
return $0
} (AVPlayerViewController())
然后,您需要为AVPlayerViewController设置视图,并将其添加到当前控制器视图中。Function 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)
}
Function enterFullscreen
强制使用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)
}
}
不要忘记,此解决方案基于不推荐使用的私有API调用。
https://stackoverflow.com/questions/30817667
复制相似问题