IOS - Видео не вращается только в iOS7 над iPhone?

Что я сделал?

Я воспроизвожу видео в расширенном классе MPMoviePlayerViewController и реализовал функции ориентации следующим образом

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {

    if (toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown){
        return FALSE;
    }
    else{
        return TRUE;
    }
}

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [self setControlsPositions:toInterfaceOrientation];
}
-(BOOL)shouldAutorotate
{
    return YES;
}

Какая проблема, с которой я сталкиваюсь?

Приложение работает до iOS6 на iPhone и iPad Almong с iPad (с iOS7), но видео не вращается над iPhone с установленной iOS7.

В чем причина такой проблемы и как ее можно решить?

Обновление

Я обнаружил, что видео вращается, если setMovieSourceTypeустановлен на MPMovieSourceTypeUnknown, но не вращается, когда установлено значение `MPMovieSourceTypeStreaming

Ответы

Ответ 1

После того, как яблоко захотело, чтобы я дал им образец для сообщения об ошибке, сообщенного мной в iOS-7, я обнаружил, что я не нажимал на контроллер вида, но я добавлял представление в окно.  В таких случаях другие диспетчеры представлений получают события ориентации, но подкласс MPMoviePlayerViewController не так, я просто представил контроллер представления вместо добавления его представления, и он сработал.

Ответ 2

Попробуйте это решение:

На вашем AppDelegate.h:

@property  (nonatomic, assign) BOOL *fullScreenVideoIsPlaying;

На вашем AppDelegate.m:

@synthesize fullScreenVideoIsPlaying;

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
    NSUInteger orientations = UIInterfaceOrientationMaskPortrait;
    if (self.fullScreenVideoIsPlaying) {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }
    else {
        if(self.window.rootViewController){
            UIViewController *presentedViewController = [[(UINavigationController *)self.window.rootViewController viewControllers] lastObject];
            orientations = [presentedViewController supportedInterfaceOrientations];
        }
        return orientations;
    }}

На вашем ViewController:

в методе viewDidLoad:

    myDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieStarted:) name:@"UIMoviePlayerControllerDidEnterFullscreenNotification" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieFinished:) name:@"UIMoviePlayerControllerWillExitFullscreenNotification" object:nil];

И добавьте эти два метода в один класс:

-(void) movieStarted:(NSNotification*) notif {
     myDelegate.fullScreenVideoIsPlaying = YES;
}
-(void) youTubeFinished:(movieFinished*) notif {
     myDelegate.fullScreenVideoIsPlaying = NO;
}

Ответ 3

Методы вращения, измененные с помощью iOS 6, вам нужно будет добавить методы поворота iOS 6 к вашему контроллеру вида:

- (BOOL)shouldAutorotate {
    return YES:
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAllButUpsideDown;
}

И вам нужно добавить Supported interface orientations с поддерживаемой ориентацией в ваши приложения info.plist.

Из iOS 6.0 release:

Класс UIViewController имеет новые интерфейсы, поддерживающие следующие поведение:

  • Новые интерфейсы обеспечивают более четкий путь для управления и отслеживания интерфейсов.

Ответ 4

Я думаю, что вращение устройства заблокировано в центре управления, потому что он работает нормально в ipad ios 7.