8

[aktualizacja]iPhone nie może obrócić film do trybie poziomym za pomocą MPMoviePlayerViewController

Jak zalecono zmieniłem wszystkie kontrolery widoku rodzica do wspierania wszystkich kierunków. Moja struktura aplikacji wygląda następująco: AppDelegate> RootViewController> Wideo> VideoDetails> MPMoviePlayerViewController.

Wideo będzie odtwarzane w poziomie, jeśli zmienię je wszystkie, aby obsługiwały wszystkie orientacje. Ale wspieranie wszystkich orientacji nie jest tym, czego chcę i powoduje inne problemy. Czy jest jakaś inna praca lub cokolwiek innego, co mogę zrobić?

Dzięki

[/ Aktualizacja]

Mam app iPhone portret oparty który wyświetla filmy za pomocą niestandardowego podklasa MPMoviePlayerViewController. Kiedy użytkownik naciśnie grać utworzyć instancję tej klasy i przedstawić go modally następująco:

- (IBAction) playPressed:(id)sender { 

NSString *filepath = [[NSBundle mainBundle] pathForResource:self.currentVideoModel.videoFileName ofType:@"m4v"]; 
NSURL *fileURL = [NSURL fileURLWithPath:filepath]; 

// MovieViewController is just a simple subclass of MPMoviePlayerViewController 
self.moviePlayerController = [[MovieViewController alloc] initWithContentURL:fileURL]; 

// full screen code. 
[self.moviePlayerController.moviePlayer setScalingMode:MPMovieScalingModeFill]; 
[self.moviePlayerController.moviePlayer setFullscreen:TRUE]; 

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlaybackComplete:) name:MPMoviePlayerPlaybackDidFinishNotification object:self.moviePlayerController]; 

[self presentMoviePlayerViewControllerAnimated:self.moviePlayerController]; 
} 

Problemem jest to, że gra dobrze w układzie pionowym, ale po włączeniu telefonu iPhone do krajobrazu film nadal odgrywa w układzie pionowym i nie krajobraz :(Wszystkie kontrolery widoku w aplikacji wspierać orientację pionową tylko

My MPMoviePlayerViewController podklasa nadpisuje tylko następującą metodę w celu umożliwienia zmiany orientacji, ale to nie ma wpływu.

- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { 
return (toInterfaceOrientation == UIInterfaceOrientationPortrait || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight || toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft); 
} 

mam nawet próbował programowo obrócić wideo, ale przy absolutnym braku szczęścia zawsze pozostaje w trybie portretu.

- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { 

if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) { 
    [self.view setTransform:CGAffineTransformMakeRotation(M_PI/2)]; 
    return true; 
} 
else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) { 
    [self.view setTransform:CGAffineTransformMakeRotation(M_PI * 2)]; 
    return true; 
} 
else if (toInterfaceOrientation == UIInterfaceOrientationPortrait) { 
    [self.view setTransform:CGAffineTransformIdentity]; 
    return true; 
} 
else return false; 

}

+0

Wsparcie obrotu jest * rodzaj * heirarchical. Więc jeśli prezentujesz kontroler odtwarzacza filmowego i nie pozwala ci się obracać, moim pierwszym krokiem do debugowania byłoby sprawdzenie KAŻDEGO kontrolera widoku, który prowadzi do twojego odtwarzacza filmowego dla metody 'shouldAutorotate..' i uczynienia go po prostu' return YES; '(możesz zrobić to stopniowo, jeśli chcesz później zaoszczędzić dodatkowych kłopotów).Następnie przełączaj je jeden po drugim z powrotem na portret, aż zablokuje portret, i wiesz, który z nich "UIKit" sprawdza, kiedy próbujesz obrócić swój. Idź stamtąd. – darvids0n

+0

@ darvids0n thanks. Naprawdę nie chcę, aby jakikolwiek inny widok obsługiwał coś innego niż portret, ale myślę, że spróbuję i zobaczę, co się stanie. – bennythemink

+0

@ darvids0n Zaktualizowałem moje pytanie. czy jest coś, co możesz zasugerować? wielkie dzięki za radę. – bennythemink

Odpowiedz

10

[EDIT] Poniższy rozwiązanie działało idealnie na iOS5 ale już nie działa na iOS6. Mogę poświęcić trochę czasu na sprawdzenie tego problemu w przyszłości :([/ EDIT]

OK Naprawiłem to. Było to związane z moim błędnym zrozumieniem tego, jak system iOS powiadamia o zmianie orientacji. myślał, że rozgłasza każdą zmianę orientacji, ale nie, podąża za twoją hierarchią widoków i od ciebie zależy, czy powiesz kontrolerom widoków dziecka o zmianie orientacji To było moje zgubienie

Moja aplikacja składała się z następujących skonfigurować:

okno> RootViewController> regulator umieszczenie zakładek> regulator nav> widok kontroler> MPMoviePlayerViewController

Podklasowałem kontroler tabbar, aby zwracał wartość true tylko w trybie pionowym. Zwróciłem to z metody kontrolera widoku root shouldAutoRotateToOrientation. Zapewniło to, że wszystkie widoki będą tylko portretowe.

Następnie zaprezentowałem film modalnie przy użyciu metody presentMoviePlayerViewControllerAnimated wywołanej z RootViewController. To automatycznie nazwało niestandardową metodę MPMoviePlayerViewController: shouldAutoRotateToOrientation, która została ustawiona na TAK dla krajobrazu i portretu :)

Powiązane problemy