0

Так что моя проблема выглядит следующим образом:Модальные презентация UIViewController и вращение

Это метод для просмотра презентации контроллера:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 

    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; 

    if((toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft 
     || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) && self.interfaceShouldRotate) { 
     if(self.videoFullscreen == nil) { 
      self.videoFullscreen = [self.storyboard instantiateViewControllerWithIdentifier:videoFullscreenController]; 
      self.videoFullscreen.delegate = self; 
     } 
     [self.videoFullscreen setVideoView:self.matchVideoView.containerViewForVideo]; 
     [UIApplication sharedApplication].statusBarHidden = YES; 
     [self presentViewController:self.videoFullscreen animated:YES completion:nil]; 
    } 
} 

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

- (void)setVideoView:(UIView *)videoView { 
NSParameterAssert(videoView); 

_videoView = videoView; 
[self.view addSubview:_videoView]; 
_videoView.translatesAutoresizingMaskIntoConstraints = NO; 
NSDictionary *views = @{@"video":_videoView}; 

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[video]|" 
                    options:0 
                    metrics:nil 
                    views:views]]; 

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[video]|" 
                    options:0 
                    metrics:nil 
                    views:views]]; 

}

Это метод делегата, который информирует контроллер корневого представления о том, что он будет уволен, а Video Player должен быть снова добавлен в портретную ориентацию.

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; 
    if(toInterfaceOrientation == UIInterfaceOrientationPortrait 
     || toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) { 
     [self.delegate fullscreenViewControllerdidRotateToPortrait:self]; 
    } 
} 

метод делегата делает это:

- (void) removeViewAndDismissFullscreenVideoController { 
    [self.presentedViewController dismissViewControllerAnimated:YES completion:nil]; 
    self.matchVideoView.containerViewForVideo = self.videoFullscreen.videoView; 
    [UIApplication sharedApplication].statusBarHidden = NO; 
} 

- (NSUInteger)supportedInterfaceOrientations и - (BOOL)shouldAutorotate устанавливаются в пользовательских UINavigationController Цельное приложение только портретный режим. Когда видео воспроизводится, переключатель уведомлений поддерживает ориентацию на UIInterfaceOrientationMaskAll, и пользователь может поворачивать экран с встроенным видео. Когда устройство будет вращаться в альбомной ориентации, видеоплеер переместится в полноэкранный режим.

Итак, где проблема? На iOS 8 он работает хорошо, но в iOS 7, когда контроллер видеоплеера уволен, контроллер с встроенным проигрывателем остается в ландшафтном режиме, но только для просмотра, потому что в - (void)viewDidAppear:(BOOL)animated, когда я проверяю self.interfaceOrientationUIViewController находится в портретном режиме (режим просмотра - пейзаж). Все с Autolayout. Любая идея, как найти причину проблемы и исправить ее?

редактировать:

В ответ ниже. Он должен быть в View Controller, который встроил видеоплеер в подвью, когда в ландшафтном VideoView перемещается на представленное представление View Controller. Кроме того, это тоже не работает.

Решение:

Я переместил код для вращения портретного, что освобождает полноэкранный режим для didRotate (только для iOS7) и сделать нестандартный переход. Это решает проблему.

ответ

1

Я думаю, что нет необходимости управлять им в этом классе, просто напишите код в методах AppDelegate для поворота только одного вида. а как следует

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

    if([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) 
    { 
     if ([[self.window.rootViewController presentedViewController] 
      isKindOfClass:[MPMoviePlayerViewController class]]) { 
      return UIInterfaceOrientationMaskAllButUpsideDown; 
     } 

     return UIInterfaceOrientationMaskPortrait; 
    } 
    return UIInterfaceOrientationMaskAll; 
} 

, что код говорит «MPMoviePlayerViewController» показывает вращение экрана, установленного в противном случае дают возможность установить, как только портретный режим.

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

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