2015-06-13 2 views
13

Я пытаюсь сделать AVPlayerViewController в полноэкранном режиме программно, исходя из «встроенного» режима, однако это не представляется возможным с опубликованным API.Как сделать AVPlayerViewController доступным для просмотра в полноэкранном режиме?

Есть ли обходной путь, который мне не хватает? Я заинтересован в том, чтобы получить ту же анимацию, которую вы получаете, когда пользователь нажимает кнопку полного экрана в правом нижнем углу элементов управления.

Использование MPMoviePlayerController не является жизнеспособной альтернативой, так как у меня может быть одновременно несколько видеороликов.

Спасибо.

+0

Я нахожусь в том же положении, что и вы. Похоже, в настоящее время для этого нет никакой работы. @ Ответ Стефана на самом деле не «полный экран» игрока, а просто делает его больше, что, как вы говорите, приводит к тому, что элементы управления не обновляются должным образом, и вы не можете узнать, нажал ли человек кнопку «Готово» или «свернуть». Не имеет значения, хотя, поскольку это начнется с расширения стрелка в любом случае, что неверно. В моем случае мне придется изменить приложение, чтобы обойти ограничения AVPlayerViewController. Надеюсь, они исправит это в какой-то момент. –

+0

Такая же проблема. Это странно, потому что есть [apple tech talk] (http://asciiwwdc.com/2016/sessions/506?q=avplayerviewcontroller), где они говорят, что вы должны представить контроллер просмотра, чтобы сделать его полноэкранным. –

ответ

11

AVPlayerViewController является подклассом UIViewController, поэтому он представлен как любой другой подкласс класса просмотра. Вы можете использовать presentViewController:animated:completion?

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

Затем отображается кнопка «Готово» в верхнем левом углу.

+0

Невозможно сделать это, когда устройство привязано (синий верхний стержень). Старый MPMoviePlayer смог войти в полноэкранный режим даже в этом случае. – JOM

+0

Это не будет использовать анимацию перехода по умолчанию для перехода в полноэкранный режим, верно? Вместо этого он использует модальный. –

8

Обновлено для прошивкой 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.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 
+0

Это все еще работает в iOS 10? Я вижу, что контроллер отвечает на селектор, но при вызове ничего не происходит. –

+0

Да, он по-прежнему работает в iOS 10 для меня! – ToddH

+1

Спасибо @ToddH Его работа !! как мы можем добавить наблюдателя для этого полноэкранного и небольшого перехода экрана? –

2

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) 
     } 
    } 
} 
4

В iOS11 есть 2 новые свойства для AVPlayerViewController: entersFullScreenWhenPlaybackBegins и exitsFullScreenWhenPlaybackEnds. Вы можете включить полноэкранный режим сразу после начала воспроизведения и отключить его, когда воспроизведение заканчивается этими свойствами. Если вам нужно включить полноэкранный режим после некоторой задержки, вы можете использовать частные методы API как ToddH, упомянутые в his answer. Однако в iOS11 _transitionToFullScreenViewControllerAnimated:completionHandler: метод больше не доступен, существует тот же метод, что и _transitionToFullScreenAnimated:completionHandler:. Второй метод принимает те же аргументы, что и первый.

Я могу показать пример того, как его использовать. Прежде всего, вам нужно создать AVPlayerViewController экземпляр в вашем UIViewController:

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) 
} 

Функция 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, которые не рекомендуется использовать.

+0

@ karthikeyan Если вам нужно принудительно включить полноэкранный режим для AVPlayerViewController, и вы можете использовать частные вызовы API, просто скопируйте код из моего ответа на ваш проект и после этого вызовите myPlayerViewController. forceFullScreenMode(). Или вы нашли некоторые ошибки в этом ответе? –

+0

@karthikeyan Или, может быть, этот код не работает для вас? –

+0

Да, это не работает, я показываю игроку половину взгляда с первой начальной загрузкой, когда пользователь нажимает кнопку полного экрана, он должен отображаться как альбомный режим. Есть ли все-таки, чтобы узнать, как войти в полноэкранный или выходной экран? Я пробовал много способов, ничего не помогает – karthikeyan

0

Вы можете просто установить videoGravity свойство AVPlayerViewController.

if(fullscreen) 
{ 
    [self.avPlayerController 
    setVideoGravity:AVLayerVideoGravityResizeAspectFill]; 
} 
else 
{ 
    [self.avPlayerController 
    setVideoGravity:AVLayerVideoGravityResizeAspect]; 
} 
Смежные вопросы