Так что моя проблема выглядит следующим образом:Модальные презентация 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.interfaceOrientation
UIViewController
находится в портретном режиме (режим просмотра - пейзаж). Все с Autolayout. Любая идея, как найти причину проблемы и исправить ее?
редактировать:
В ответ ниже. Он должен быть в View Controller, который встроил видеоплеер в подвью, когда в ландшафтном VideoView перемещается на представленное представление View Controller. Кроме того, это тоже не работает.
Решение:
Я переместил код для вращения портретного, что освобождает полноэкранный режим для didRotate (только для iOS7) и сделать нестандартный переход. Это решает проблему.