1

Во-первых, это для Google Developers, что позволяет легко добавлять встроенный плеер в проект iOS. Мой вопрос - как изменить ориентацию.Ориентация видео встраиваемого видео YouTube

Первоначально я установил свой проект в «Портрет» только в общих настройках. Это работало для всех диспетчеров viewcontrollers, однако оно также работало на проигрывателе YouTube. Видео воспроизводится так, как ожидалось, однако, когда я поворачиваю телефон, видео остается в портрете.

Если я вернусь к настройкам «Общие», а также настроил его на пейзаж, тогда игрок будет вращаться правильно (но тогда и все проекторы просмотра в проекте).

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

Я следовал инструкциям на https://developers.google.com/youtube/v3/guides/ios_youtube_helper так единственный код, который мне нужно, чтобы добавить за это было:

[self.playerView loadWithVideoId:videoSourceID]; 

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

TLDR: Так что, в основном, я хочу, чтобы «поворот к пейзажу» был разблокирован, если пользователь просматривает полноэкранный видеоролик YouTube, все остальное в приложении должно быть заблокировано на портрете (в том числе viewcontroller, где UIView отображает оконное видео). Спасибо, что посмотрели!

ответ

1

Вставьте этот код на AppDelegate.m:

- (UIViewController*)topViewController { 
return [self topViewControllerWithRootViewController:[UIApplication sharedApplication].keyWindow.rootViewController]; 
} 

- (UIViewController*)topViewControllerWithRootViewController:(UIViewController*)rootViewController { 
// Handling UITabBarController 
if ([rootViewController isKindOfClass:[UITabBarController class]]) { 
    UITabBarController* tabBarController = (UITabBarController*)rootViewController; 
    return [self topViewControllerWithRootViewController:tabBarController.selectedViewController]; 
} 
// Handling UINavigationController 
else if ([rootViewController isKindOfClass:[UINavigationController class]]) { 
    UINavigationController* navigationController = (UINavigationController*)rootViewController; 
    return [self topViewControllerWithRootViewController:navigationController.visibleViewController]; 
} 
// Handling Modal views 
else if (rootViewController.presentedViewController) { 
    UIViewController* presentedViewController = rootViewController.presentedViewController; 
    return [self topViewControllerWithRootViewController:presentedViewController]; 
} 
// Handling UIViewController's added as subviews to some other views. 
else 
{ 
    for (UIView *view in [rootViewController.view subviews]) 
    { 
     id subViewController = [view nextResponder]; // Key property which most of us are unaware of/rarely use. 
     if (subViewController && [subViewController isKindOfClass:[UIViewController class]]) 
     { 
      return [self topViewControllerWithRootViewController:subViewController]; 
     } 
    } 
    return rootViewController; 
    } 
} 

На следующий метод вы можете выбрать ориентацию для каждого UIViewController. Положите его на вас AppDelegate.m

- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { 

id presentedViewController = [self topViewController]; 
NSString *className = presentedViewController ? NSStringFromClass([presentedViewController class]) : nil; 

if (window && [className isEqualToString:@"FullScreenViewController"]) { //FullScreenViewController should support all orientations. Put the exact name of the viewcontroller displayed when the video is fullscreen 

    return UIInterfaceOrientationMaskAll; 
} else { 
    return UIInterfaceOrientationMaskPortrait; //Every other viewcontroller will support portrait only 
} 
} 

Вы должны обнаружить точное название UIViewController отображается, когда видео на весь экран. Вы должны найти его на трассировку стека, и поставить его имя вместо «FullScreenViewController», который я написал в качестве примера

+0

Это было фантастическое решение @Metronic и работает почти безупречно. Единственная проблема теперь, когда вы нажимаете [Готово] на видео, и она возвращается к viewcontroller с оригинальным оконным видео, показывающим, если вы все еще держите телефон в альбомной ориентации, этот viewcontroller также показывает ландшафтный дизайн. Есть ли способ предотвратить это? – Lee

+1

Уверен, для предотвращения этого вам нужно обнаружить, возможно, с делегатом, когда видео выходит из полноэкранного режима и помещается в этот метод: [[UIDevice currentDevice] setValue: [NSNumber numberWithInt: UIInterfaceOrientationPortrait] forKey: @ "orientation"] ; Если вы не можете найти, где разместить этот фрагмент, вы можете поместить его в viewWillAppear – metronic

0

Swift 3,0

class AppDelegate 
    func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { 
     guard UIApplication.currentVC.isMovie else { return application.supportedInterfaceOrientations(for: window) } 
     return UIInterfaceOrientationMask.allButUpsideDown 
    } 
} 


extension UIApplication { 
    struct currentVC { 
     static var isMovie: Bool { 
      guard let presentedViewController = UIApplication.shared.keyWindow?.rootViewController?.presentedViewController else { return false } 

      let className = String(describing: type(of: presentedViewController)) 

      return ["MPInlineVideoFullscreenViewController", 
        "MPMoviePlayerViewController", 
        "AVFullScreenViewController"].contains(className) 
     } 
    } 
} 


import AVKit 
extension AVPlayerViewController { 
    open override func viewWillDisappear(_ animated: Bool) { 
     super.viewWillDisappear(animated) 
     UIDevice.current.setValue(UIInterfaceOrientationMask.portrait.rawValue, forKey: "orientation") 
    } 
}