0

Мое приложение принимает только портретную ориентацию, за исключением MPMoviePlayerController, которую я хочу разрешить пользователю изменять ориентацию.Изменение ориентации интерфейса при нажатии кнопки «Назад»

Итак, я подклассы UINavigationController и добавил следующий код:

-(BOOL)shouldAutorotate 
{ 
    if ([[[self.viewControllers lastObject] presentedViewController] isKindOfClass:[MPMoviePlayerViewController class]]) 
    { 
     return YES; 
    } 
    else 
    { 
     return NO; 
    } 
} 

Он отлично работает, позволяя только мое MPMoviePlayerViewController изменить ориентацию. Проблема заключается в том, что когда пользователь находится в альбомной ориентации и нажимает кнопку done или воспроизведение заканчивается, оно выдает moviePlayer и возвращается к представлениюViewController, но в ландшафтном режиме, что приводит к сбою, поскольку этот вид не сделан для альбомной ориентации.

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

UPDATE:

Вот обновленный код в моем UINavigationController подкласса:

-(BOOL)shouldAutorotate 
{ 
    return YES; 
} 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    if ([[[self.viewControllers lastObject] presentedViewController] isKindOfClass:[MPMoviePlayerViewController class]]) 
    { 
     return UIInterfaceOrientationMaskAll; 
    } 
    else 
    { 
     return UIInterfaceOrientationMaskPortrait; 
    } 
} 

Теперь, если я делаю вещи в следующем порядке с точки зрения с Play button.

  1. Поверните устройство. (он вызывает метод, но экран не вращается, так как он не MPMoviePlayerController класс)
  2. Нажмите кнопку воспроизведения button. (Он отображает плеер уже в ландшафтном режиме).
  3. Нажмите кнопку «Назад». (Он выталкивает плеер и правильно показывает вид на портретном режиме)

Теперь, если изменить порядок:

  1. Нажмите кнопку воспроизведения. (удерживая устройство на обычной портретной позиции).
  2. Поверните устройство. (он правильно поворачивает видеопроигрыватель, показывающий видео).
  3. Нажмите кнопку «Назад». (Она появляется игрок, но на этот раз, вид находится в ландшафтном режиме, который не является ожидаемым поведением)

ответ

4

Нашли решение здесь, this answer.

Нажав кнопку, я добавил уведомление, а затем нажмите кнопку «Готово». Я использовал приведенный ниже код для изменения ориентации. Я сохранил подкласс UINavigationController, как и в моем вопросе, чтобы разрешить изменение ориентации при начале воспроизведения фильма.

- (IBAction)playButton:(id)sender {   
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(moviePlaybackDidFinish) 
               name:MPMoviePlayerPlaybackDidFinishNotification 
               object:self.player.moviePlayer]; 

    NSURL *url = [NSURL URLWithString:@"https://dl.dropboxusercontent.com/s/crzu6yrwt35tgej/flexao.mp4"];   
    self.player = [[MPMoviePlayerViewController alloc] initWithContentURL:url]; 
    self.player.moviePlayer.movieSourceType = MPMovieSourceTypeFile; 
    [self presentMoviePlayerViewControllerAnimated:self.player]; // presentMoviePlayerViewControllerAnimated:self.player]; 
} 

-(void)moviePlaybackDidFinish 
{ 
    [[UIDevice currentDevice] setValue: 
    [NSNumber numberWithInteger: UIInterfaceOrientationPortrait] 
           forKey:@"orientation"]; 
} 
+0

Perfect, Great Решение :), спасибо –

-1
-(void)viewWillAppear:(BOOL)animated 
{ 


     [self updateLayoutForNewOrientation:self.interfaceOrientation]; 
} 
- (void)updateLayoutForNewOrientation:(UIInterfaceOrientation)orientation 
{ 
    if (self.interfaceOrientation == UIInterfaceOrientationPortrait || self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) 
    { 
     // Portrait view 

     if(iPhone5) 

     { 
     }else{ 

     } 

     if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) 
     { 

     } 


    } 

    else 
    { 
     // Landscape view 

     if(iPhone5) 

     { 


     }else{ 
      float SystemVersion=[[[UIDevice currentDevice] systemVersion] floatValue]; 
      if(SystemVersion>=7.0f) 
      { 


      }else{ 

      } 
     } 

     if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) 
     { 
      if(iPhone5) 
      { 

      } 
      else 
      { 

      } 
     } 


    } 
} 

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration 
{ 
    [self updateLayoutForNewOrientation:self.interfaceOrientation]; 
} 

Надеюсь, что это поможет

+0

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

0

У меня есть рабочая конфигурация для проблема, насколько я понимаю из вашего вопроса.

Вам нужен подкласс UINavigationController, как у вас уже есть, но со следующим кодом:

заголовочных файла:

@interface EECNavigationController : UINavigationController 

@property (assign, nonatomic) BOOL landscapeDisallowed; 

@end 

В.м файла:

#import "EECNavigationController.h" 

@implementation EECNavigationController 

- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    if(!_landscapeDisallowed) { 
     // for iPhone, you could also return UIInterfaceOrientationMaskAllButUpsideDown 
     return UIInterfaceOrientationMaskAll; 
    } 
    return UIInterfaceOrientationMaskPortrait; 
} 

@end 

Теперь, в контроллерах зрения, которые будут находиться под этой навигации контроллера, который вы хотите быть просто портрет вам просто нужно установить «landscapeDisallowed» Да в методе viewDidLoad, как:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    ((EECNavigationController *)self.navigationController).landscapeDisallowed = YES; 
} 

и переопределить следующие методы, как это:

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

- (NSUInteger)supportedInterfaceOrientations { 
    return UIInterfaceOrientationMaskPortrait; 
} 

взгляды, которые могут быть представлены в ландшафтном режиме нужно:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    ((EECNavigationController *)self.navigationController).landscapeDisallowed = NO; 
} 

Это работает для меня, надеюсь, что это сработает для вас.

+0

Спасибо, это хороший код, но он не решает мою проблему. Он правильно определяет, какие представления разрешены для каждой ориентации, хотя, когда я перехожу к представлению, которое является «landscapeDisallowed = NO', меняет ориентацию и поп этот вид в ландшафтном режиме, он показывает предыдущее представление в ландшафтном режиме, даже если это' landscapeDisallowed = YES; '. Ожидаемое поведение заключается в том, чтобы вручную переключить ориентацию на портрет. – Jorge

+0

Кажется, что есть лучший ответ для этого: http://stackoverflow.com/questions/12662240/how-to-make-app-fully-working-correctly-for-autorotation-in-ios-6 – ncerezo

Смежные вопросы