2013-05-02 13 views
8

Ich möchte nur die vertikale Ausrichtung in allen View-Controllern meiner iOS-App unterstützen. Allerdings bette ich ein YouTube-Video in einen meiner View-Controller ein. Wenn dieses Video für den gesamten Bildschirm ausgewählt wird, möchte ich, dass der Benutzer sein Telefon horizontal ausrichten kann, sodass das Video maximiert wird, um den gesamten Bildschirm aufzunehmen .iOS 6.0+ Autorotation für youtube eingebettetes Video

EDIT: Ich habe versucht, den folgenden Code aus Autorotate in iOS 6 has strange behaviour mit:

- (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { 

return self.fullScreenVideoIsPlaying ? 
    UIInterfaceOrientationMaskAllButUpsideDown : 
    UIInterfaceOrientationMaskPortrait; 

}

und meiner Ansicht-Controller, der die UIWebView/YouTube Rahmen präsentiert, ich habe diesen Code in meinem viewDidLoad:

Allerdings, wenn der Benutzer auf dem Fullscreen-YouTube-Video fertig ist, wenn er/sie immer noch das Telefon ho hat Rizontal, dann bleibt der präsentierende View-Controller auch horizontal (ich möchte, dass der aktuelle View-Controller im Hochformat ist). Es ist ein Rennen auf der fullSreenVideoIsPlaying Variablen, die nicht schnell genug aktualisiert wird, so dass mein präsentierender Ansichtcontroller Porträt ist.

Jede Rückmeldung, wie dies zu erreichen wäre, würde sehr geschätzt werden.

Danke!

+0

Sie lesen können - http://buddingdevelopers.com/autorotation-in-ios/ Autorotation deutlich hier erklärt. – Xcoder

+0

möglich duplizieren: http://stackoverflow.com/questions/13580753/mpmovieplayercontroller-rotating-in-full-screen-while-the-parent-view-controller –

Antwort

21

Ich habe eine Lösung gefunden, indem ich ein paar Lösungen, die ich auf StackOverflow gefunden habe, zusammen formte.

Statt diese Benachrichtigung der Verwendung

[[NSNotificationCenter defaultCenter] 
     addObserver:self 
     selector:@selector(windowNowVisible:) 
     name:UIWindowDidBecomeVisibleNotification 
     object:self.view.window 
]; 

ich folgende Mitteilungen

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

mit den Implementierungen

-(void) youTubeStarted:(NSNotification*) notif { 
    AppDelegate* appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate]; 
    appDelegate.fullScreenVideoIsPlaying = YES; 
} 
-(void) youTubeFinished:(NSNotification*) notif { 
    AppDelegate* appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate]; 
    appDelegate.fullScreenVideoIsPlaying = NO; 
} 

und in meinem AppDelegate verwenden, ich habe

- (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; 
} 

und meiner Ansicht-Controller, ich habe

-(BOOL) shouldAutorotate { 
    return NO; 
} 
-(NSUInteger)supportedInterfaceOrientations{ 
    return UIInterfaceOrientationMaskPortrait; 
} 
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{ 
    return UIInterfaceOrientationPortrait; 
} 
+2

einfach behalten Beachten Sie jedoch, dass die Verwendung von privaten Benachrichtigungen ('UIMoviePlayerControllerDidEnterFullscreenNotification' und' UIMoviePlayerControllerWillExitFullscreenNotification') in zukünftigen iOS-Versionen auftreten oder eine Ablehnung des App Store verursachen könnte. – jszumski

+0

Ok danke! Kennen Sie eine andere Benachrichtigung, die ich verwenden könnte? –

+0

Leider bietet das SDK keine wie von iOS 6. – jszumski

6

Ich habe das gleiche Problem schon früher kennengelernt, und die beste Lösung, die ich unter iOS 5.x und 6.x finden konnte, war, den Videocontroller in einer modalen Ansicht darzustellen.

Die modale Ansicht ist eine UINavigationController, die den Videocontroller umhüllt und mit UIInterfaceOrientationMaskAll in supportedInterfaceOrientations antwortet. In der modalen Ansicht viewWillAppear:, kippe ich fullScreenVideoIsPlaying zu YES und setze es auf NO in viewWillDisappear:. Durch diese Anordnung bleiben die darunter liegenden Ansichtscontroller im Hochformat, während die modale Ansicht nach Belieben gedreht werden kann.

+1

danke für Ihre Antwort..hat eine kurze Follow-up-Frage. Im Moment ist mein UIWebView des Youtube-Videos eine kleine Zelle (200x100) in der Mitte meines präsentierenden View-Controllers.Wie kann ich das Video in einem Modal-View-Controller präsentieren, wenn es ausgewählt ist? Mit anderen Worten, wie bekomme ich einen Rückruf, dass der Benutzer die Wiedergabe-Taste in der UIWebView gedrückt hat? –

+0

Der Videoplayer, der aus der Webansicht stammt, wird die Rotationseinstellungen des übergeordneten Elements berücksichtigen. Daher müssen Sie Ihren "präsentierenden Ansichtscontroller" modal gestalten. – jszumski

+0

Ich verstehe, dass der Videoplayer die Rotationseinstellungen seiner Eltern respektiert; Mein Problem ist jedoch, dass der aktuelle Ansichtscontroller nicht horizontal rotieren darf. Nur der Video-Player, der angezeigt wird, sollte in der Lage sein, horizontal zu rotieren. –

Verwandte Themen