14

У меня есть приложение для iPhone (iOS6 +), которое поддерживает все ориентации интерфейса. Тем не менее, только поддержка ландшафта должна поддерживаться, когда MPMoviePlayerController воспроизводит полноэкранный режим видео.Принудительная ориентация ландшафта на полноэкранном режиме MPMoviePlayerController предотвращает правильное вращение при выходе из полноэкранного режима

Я нашел следующее решение для переполнения стека, и оно работает.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerWillEnterFullscreenNotification:) name:MPMoviePlayerWillEnterFullscreenNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerWillExitFullscreenNotification:) name:MPMoviePlayerWillExitFullscreenNotification object:nil]; 

...

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { 
    if (self.landscapeOnlyOrientation) { 
     return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight; 
    } 
    return UIInterfaceOrientationMaskAll; 
} 

- (void)moviePlayerWillEnterFullscreenNotification:(NSNotification*)notification { 
    self.landscapeOnlyOrientation = YES; 
} 

- (void)moviePlayerWillExitFullscreenNotification:(NSNotification*)notification { 
    self.landscapeOnlyOrientation = NO; 
} 

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

Следующий набор скриншотов должен пояснить, что я имею в виду:

enter image description here enter image description here enter image description here

NB: По различным причинам, использование MPMoviePlayerViewController не представляется возможным.

+1

Я отправил сообщение об ошибке в Apple, по этому вопросу месяцев назад. Я предлагаю вам сделать то же самое. Проблема заключается в том, что с ориентацией на методы управления базовым контроллером просмотра не проводятся консультации. – matt

+0

Любые предложения по обходу? – svth

+0

Нет. Вы можете попытаться предотвратить использование полноэкранного режима. Или просто не используйте MPMoviePlayerController. В основном это просто большая несогласованность от Apple, и разработчики должны следить за ними, пока они не исправят это. – matt

ответ

11

Привет всем У меня была такая же проблема я решил это -

Вот мой полный код ....

Вы должны сначала изменения в AppDelegate:

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
{ 
if ([[[NowPlaying sharedManager] playerViewController] allowRotation])//Place your condition here 
{ 
    return UIInterfaceOrientationMaskAll; 
} 
return UIInterfaceOrientationMaskPortrait; 
} 

Регистрация Уведомления для полного контроля экрана:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerWillEnterFullscreenNotification:) 
              name:MPMoviePlayerWillEnterFullscreenNotification 
              object:nil]; 

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerWillExitFullscreenNotification:) 
              name:MPMoviePlayerWillExitFullscreenNotification 
              object:nil]; 

Затем добавить строку кода в контроллере игрока:

- (void)moviePlayerWillEnterFullscreenNotification:(NSNotification *)notification 
{ 
dispatch_async(dispatch_get_main_queue(),^
       { 
        self.allowRotation = YES; 
       }); 
} 



- (void)moviePlayerWillExitFullscreenNotification:(NSNotification *)notification 
{ 
self.allowRotation = NO; 
[self.moviePlayerController setControlStyle:MPMovieControlStyleNone]; 

dispatch_async(dispatch_get_main_queue(),^
       { 

        //Managing GUI in pause condition 
         if (self.currentContent.contentType == TypeVideo && self.moviePlayerController.playbackState == MPMoviePlaybackStatePaused) 
        { 
         [self.moviePlayerController pause]; 
         if (self.playButton.selected) 
          self.playButton.selected = NO; 
        } 
        self.view.transform = CGAffineTransformMakeRotation(0); 
        [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]; 
        self.view.bounds = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height); 
       }); 
} 

Этот код протестирован в iOS6 и iOS7. Спасибо :)

Пожалуйста, дайте мне знать, если есть вопрос .....

+0

, какое условие я должен проверить здесь? if ([ [[NowPlaying sharedManager] playerViewController] allowRotation]) // Поместите свое условие здесь и что значит сейчас играть? – karthikeyan

+0

Привет, Vijay, спасибо за код. он отлично работает после удаления кода dispatch_async в методе WillExitFullScreen. Можете ли вы рассказать мне, почему вы ставите код, который не полезен, и что такое TypeVideo ?? – Satya

+1

Спасибо Сатье за ​​комментарий. Я использовал dispatch_async для доступа к основному потоку, потому что в моем случае, когда я вхожу в ландшафтный режим, мой предыдущий GUI становится искаженным во время анимации. В моем случае я играю аудио и видео на одном и том же плеере, и всякий раз, когда начинается воспроизведение видео, он получает полный экран не в звуковой песне. Поэтому я использовал TypeVideo для видео-песен. – Kumar

0

Это может показаться сумасшедшим, но вы можете попытаться сохранить локальную последнюю ориентацию перед открытием контроллера видеорекламы, а затем использовать application:supportedInterfaceOrientationsForWindow:, чтобы вернуть сохраненную ориентацию и заставить контроллер вида оставаться на нем и не вращаться.

2

Вы можете попробовать «силы» в обновлении ориентации, чтобы позволить системе обрабатывать правильную ориентацию для вас:

- (void)forceOrientationRefresh 
{ 
    // Force orientation refresh 
    [self presentModalViewController:[UIViewController new] 
          animated:NO]; 
    [self dismissModalViewControllerAnimated:NO]; 
} 

Это хак-иш, но это работает.

0

Вы можете изменить ориентацию программно как этот

-(void)viewDidAppear:(BOOL)animated 
{ 

    if(UIDeviceOrientationIsPortrait(self.interfaceOrientation)){ 
     if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) 
     { 
      objc_msgSend([UIDevice currentDevice], @selector(setOrientation:), UIInterfaceOrientationLandscapeLeft); 

     } 
    } 

} 

И не забывайте добавить #import <objc/message.h>

5

Вы должны подклассы и обеспечить ландшафт в качестве поддерживаемой ориентации интерфейса.

@interface MyMovieViewController : MPMoviePlayerViewController 
@end 

@implementation MyMovieViewController 

- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 

- (UIInterfaceOrientationMask)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskLandscape; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
{ 
    return UIInterfaceOrientationIsLandscape(toInterfaceOrientation); 
} 

@end 
+0

Это должен быть принятый ответ – yonix

0

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

-1

вам нужно добавить этот код для iOS7 это работает идеально и просто

-(NSUInteger)supportedInterfaceOrientations { 

    return UIInterfaceOrientationMaskPortrait; 
} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 
    return UIInterfaceOrientationPortrait; 
} 

.... creating a player 
MPMoviePlayerViewController *mp =[[MPMoviePlayerViewController alloc] initWithContentURL:url]; 
...make settings and present it 
[self presentMoviePlayerViewControllerAnimated:mp]; 
0

Вы используете supportedIterfaceOrientationsForWindow то ищет: MPInlineVideoFullscreenViewController. Немного сложно найти правильный контроллер, но он работает.

Вот пример кода:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{ 
    if ([NSStringFromClass([self.window.rootViewController.presentedViewController.presentedViewController class]) isEqualToString:@"MPInlineVideoFullscreenViewController"]){ 
    return UIInterfaceOrientationMaskAllButUpsideDown; 
} 
    return UIInterfaceOrientationMaskLandscape; 
}