Подтвердить что ты не робот

MPMoviePlayerController вращается в полноэкранном режиме, в то время как родительский контроллер просмотра поддерживает только портретную ориентацию

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

Итак, у меня есть ViewController, который содержит MPMoviePlayerController, встроенный в представление ViewController (это требует мое приложение). Пользователь может воспроизводить видео и просматривать его во встроенном виде или нажимать на полноэкранную кнопку, используя кнопки управления проигрывателем по умолчанию, и проигрыватель переходит в полноэкранный режим.

Теперь я ограничил контроллер представления только поддержкой ориентации на порт, используя новые API вращения, предоставляемые iOS6.

// New Autorotation support.
- (BOOL)shouldAutorotate;
{
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

это работает очень хорошо. ViewController поддерживает только портрет, а пользователь воспроизводит фильм во встроенном виде.

Теперь проблема возникает, когда пользователь переходит в полноэкранный режим. В полноэкранном режиме фильм продолжает вращаться, когда я вращаю симулятор/устройство. Когда я вращаю устройство во время воспроизведения фильма в полноэкранном режиме с точками останова в shouldAutorotate и supportedInterfaceOrientations, он по-прежнему поступает в эти оба метода, которые возвращают NO и UIInterfaceOrientationMaskPortrait соответственно, но все же фильм вращается..

Почему это происходит?.... это одна часть моего вопроса... Вторая часть - это то, что я хочу, чтобы фильм переходил в альбомный режим, когда пользователь переходит в полноэкранный режим. и я хочу, чтобы проигрыватель фильма блокировался в альбомном режиме, пока пользователь не нажмет кнопку DONE.

Пожалуйста, помогите....

4b9b3361

Ответ 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;
}