MPMoviePlayerController вращается в полноэкранном режиме, в то время как родительский контроллер просмотра поддерживает только портретную ориентацию
этот вопрос является лишь частью моей проблемы. Я использую поддержку ротации iOS6 и ориентацию для моего существующего приложения.
Итак, у меня есть ViewController, который содержит MPMoviePlayerController, встроенный в представление ViewController (это требует мое приложение). Пользователь может воспроизводить видео и просматривать его во встроенном виде или нажимать на полноэкранную кнопку, используя кнопки управления проигрывателем по умолчанию, и проигрыватель переходит в полноэкранный режим.
Теперь я ограничил контроллер представления только поддержкой ориентации на порт, используя новые API вращения, предоставляемые iOS6.
// New Autorotation support.
- (BOOL)shouldAutorotate;
{
return NO;
}
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
это работает очень хорошо. ViewController поддерживает только портрет, а пользователь воспроизводит фильм во встроенном виде.
Теперь проблема возникает, когда пользователь переходит в полноэкранный режим. В полноэкранном режиме фильм продолжает вращаться, когда я вращаю симулятор/устройство. Когда я вращаю устройство во время воспроизведения фильма в полноэкранном режиме с точками останова в shouldAutorotate
и supportedInterfaceOrientations
, он по-прежнему поступает в эти оба метода, которые возвращают NO
и UIInterfaceOrientationMaskPortrait
соответственно, но все же фильм вращается..
Почему это происходит?.... это одна часть моего вопроса... Вторая часть - это то, что я хочу, чтобы фильм переходил в альбомный режим, когда пользователь переходит в полноэкранный режим. и я хочу, чтобы проигрыватель фильма блокировался в альбомном режиме, пока пользователь не нажмет кнопку DONE.
Пожалуйста, помогите....
Ответы
Ответ 1
вы можете попробовать выполнить функцию ниже в AppDelegate
:
-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
}
вы можете сделать условие для обоих режимов.
например, если медиаплеер находится в полноэкранном режиме, то
return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
в противном случае return UIInterfaceOrientationMaskPortrait;
Я не пробовал, но думаю, он должен работать в вашем случае.
спасибо
Ответ 2
Для наглядности здесь приведен полный код (он ВСЕ входит в делегат вашего приложения):
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(willExitFullscreen:)
name:MPMoviePlayerWillExitFullscreenNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(willEnterFullscreen:)
name:MPMoviePlayerWillEnterFullscreenNotification
object:nil];
}
- (void)willEnterFullscreen:(NSNotification*)notification
{
NSLog(@"willEnterFullscreen");
isFullScreen = YES;
}
- (void)willExitFullscreen:(NSNotification*)notification
{
NSLog(@"willExitFullscreen");
isFullScreen = NO;
}
-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
if (isFullScreen)
return UIInterfaceOrientationMaskLandscapeLeft;
else
return UIInterfaceOrientationMaskPortrait;
}
isFullScreen - это BOOL, который должен быть объявлен в AppDelegate.h
Ответ 3
Я бы предложил вместо MPMoviePlayerViewController
использовать MPMoviePlayerViewController
. Подклассируем его и реализуем метод supportedInterfaceOrientations
и возвращаем UIInterfaceOrientationMaskLandscape
.
Вам также может понадобиться реализовать метод shouldAutorotateToInterfaceOrientation:
.
См. ссылку на класс:
MPMoviePlayerViewController
Изменить: Вы также можете посмотреть этот пост: iphone - заставить MPMoviePlayerController воспроизводить видео в ландшафтном режиме
Ответ 4
Это поглотило меня какое-то время, и у меня было так много разных ужасающих ошибок, но в итоге я не делал этого с помощью MPMoviePlayerController, но MPMoviePlayerViewController. Я просто повернул self.playerView, который является свойством, перед его представлением. Также я добавил NSNotification, который вернется к основному элементу управления и главному ViewController после завершения видео. Вот как я начал его выполнять:
[[NSNotificationCenter defaultCenter] removeObserver:self.playerView
name:MPMoviePlayerPlaybackDidFinishNotification
object:self.playerView.moviePlayer];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(movieFinishedCallback:)
name:MPMoviePlayerPlaybackDidFinishNotification
object:self.playerView.moviePlayer];
self.playerView = [[MPMoviePlayerViewController alloc] initWithContentURL:docUrl];
self.playerView.view.frame = CGRectMake(10, 10, self.frame.size.width-20, 180);
[self.playerView.moviePlayer prepareToPlay];
if(IS_IPHONE_6P)
{
[self.playerView.view setBounds:CGRectMake(0, 0, 736, 414)];
[self.playerView.view setCenter:CGPointMake(212, 368)];
}
else if(IS_IPHONE_6)
{
[self.playerView.view setBounds:CGRectMake(0, 0, 375, 667)];
[self.playerView.view setCenter:CGPointMake(187, 333)];
}
else if (IS_IPHONE_5)
{
[self.playerView.view setBounds:CGRectMake(0, 0, 736, 414)];
[self.playerView.view setCenter:CGPointMake(160, 284)];
}
else
{
[self.playerView.view setBounds:CGRectMake(0, 0, 480, 320)];
[self.playerView.view setCenter:CGPointMake(160, 240)];
}
[self.playerView.view setTransform:CGAffineTransformMakeRotation(M_PI / 2)];
self.playerView.modalPresentationStyle = UIModalPresentationFormSheet;
self.playerView.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:self.playerView animated:YES completion:nil];
И обратный вызов movieFinishedCallback: выглядит следующим образом:
- (void)movieFinishedCallback:(NSNotification*)aNotification
{
// Obtain the reason why the movie playback finished
NSNumber *finishReason = [[aNotification userInfo] objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey];
// Dismiss the view controller ONLY when the reason is not "playback ended"
if ([finishReason intValue] != MPMovieFinishReasonPlaybackEnded)
{
MPMoviePlayerController *moviePlayer = [aNotification object];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:MPMoviePlayerPlaybackDidFinishNotification
object:moviePlayer];
NSLog(@"Video Closed");
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^
{
[self dismissViewControllerAnimated:NO completion:nil];
self.playerView = nil;
});
}
}
Это сработало для меня. Надеюсь, что это поможет.
Ответ 5
в вашем проекте, выберите проект имени и правое окно, выберите вкладку информации.
в пользовательских целевых свойствах ios
добавить ключ и выбрать ключ: "Начальная ориентация интерфейса" установленное значение: портрет (нижняя кнопка дома)
- перестройте свой проект → ok
Ответ 6
Для iOS 6 вы можете использовать этот ответ.
Но если вы поддерживаете < iOS 6 нужен другой подход.
Вы должны создать пользовательский контроллер навигации и добавить его для создания с помощью корневого контроллера и метода для вращения.
Он будет выглядеть так: m file и h file.
И в вашем AppDelegate должен вызывать метод для init:
В файле h:
#import "IORNavigationController.h"
и
@property (nonatomic, retain) IORNavigationController* navigationController;
В файле m:
self.navigationController = [[[MyNavigationController alloc] initWithRootViewController:start] autorelease];
Ответ 7
используйте этот
moviePlayerController.view.transform = CGAffineTransformMakeRotation(M_PI/2);
он работает с ios 7
Ответ 8
Просто добавьте этот код в свой контроллер просмотра
-(NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationPortrait;
}