2013-07-16 4 views
8

Ich habe eine iPhone-Anwendung mit einem Storyboard, ein paar XIB und benutzerdefinierte Zellen.IOS6 Landschaft spielt eingebettet Youtube Video von einer uiwebview in einem einzigen Porträt iPhone App

Die Anwendung wird als "Porträt" als "unterstützte Schnittstelle Ausrichtung" eingestellt (ich meine, alles ist so angezeigt). In meinen benutzerdefinierten Zellen gibt es Uiwebview, das mit einem YouTube-eingebetteten Video verknüpft ist, als ich darauf geklickt habe, das Video zu spielen, aber mein Problem ist, dass sie immer im "Porträt" -Modus spielen. Ich habe viele Dinge gelesen, die dieses Problem lösen, aber nur in ios5.

Eigentlich: Ich kann identifizieren, wenn das Video zu starten oder zu spielen aufhören. Ich kann die Geräteausrichtung identifizieren. Aber ich kann nicht (möchte ich) die Ausrichtung (Kraft) von Hochformat auf Querformat ändern oder diese Fähigkeit vorschlagen, wenn der Benutzer die Ausrichtung seines Geräts ändert.

Vielen Dank im Voraus.

PS: Ich kann den Code für die Identifizierung der Anwendung anzeigen, falls erforderlich.

Antwort

5

Ich hatte das gleiche Problem. Meine Lösung ist:

1.First aller einschalten alle Orientierungen in Ihrem Xcode-Projekt:

enter image description here

2.In AppDelegate.m add:

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
{ 
    NSArray *stackViewControllers = self.navigationController.viewControllers; 
    UIViewController *rvc = [stackViewControllers objectAtIndex:stackViewControllers.count - 1]; 

    if([rvc isKindOfClass:[VideoViewController class]]) 
    { 
     id presentedViewController = [rvc presentedViewController]; 

     NSString *viewControllerName = NSStringFromClass([presentedViewController class]); 
     if([viewControllerName isEqual:@"MPInlineVideoFullscreenViewController"] && [VideoViewController isVideoPlaying]) { 
      return UIInterfaceOrientationMaskAll; 
     } 
    } 
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; 
} 

In oben Code, jedes Mal fragt das System supportedInterfaceOrientationsForWindow Sie überprüfen, ob der aktuelle ViewController ist, wo Sie haben Setzen Sie UIWebView mit Youtube-Player eingebettet und überprüfen Sie auch, ob Video jetzt abgespielt wird (Video ist im Vollbildmodus).
HINWEIS: Ich verwende UINavigationController, wenn Sie dies nicht tun, müssen Sie einige Änderungen vornehmen, um aktuelle viewController zu erhalten.

3.In Viewcontroller, wo ich mir UIWebView für youtube eingebetteten Player (In meinem Fall ist es VideoViewController ist) gesetzt habe, in dem Header-Datei ist hinzuzufügen Methode:

+(BOOL)isVideoPlaying; 


4 .In VideoViewController.m statische Variable hinzufügen:

static BOOL _isVideoPlaying = NO; 


5.In viewDidLoad hinzufügen addObserver für Benachrichtigungen, um zu wissen, wann Video begann zu spielen und willExitPlaying:

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


6.Auch Benachrichtigung Selektor Methoden hinzufügen:

-(void)playerStarted:(NSNotification *)notification{ 
    _isVideoPlaying = YES; 
} 
-(void)playerWillExitFullscreen:(NSNotification *)notification { 
    _isVideoPlaying = NO; 

    if([AppUtils iOSVersion] < 6) //For iOS < 6.0, you must manually rotate viewController's view when fullscreen video playing is dismissed. 
    { 
     if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeLeft || [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeRight) 
     { 
      self.navigationController.view.userInteractionEnabled = NO; 
      [UIView animateWithDuration:0.5 animations:^{ 
       [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft animated:NO]; 
       // rotate main view, in this sample the view of navigation controller is the root view in main window 
       [self.navigationController.view setTransform: CGAffineTransformMakeRotation(180 * M_PI * 0.5)]; 
       // set size of view 
       [self.navigationController.view setFrame:CGRectMake(0, 0, 320, 960)]; 
      } completion:^(BOOL finished) { 
       self.navigationController.view.userInteractionEnabled = YES; 
      }]; 
     } 
    } 
} 


7.Und, fügen Methoden in VideoViewController.m:

+(BOOL)isVideoPlaying { 
    return _isVideoPlaying; 
} 

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
{ 
    if(!isVideoPlaying) { 
     return toInterfaceOrientation != UIInterfaceOrientationLandscapeLeft && toInterfaceOrientation != UIInterfaceOrientationLandscapeRight; 
    } 
    return YES; 
} 


All diese Tricks funktioniert gut für mich, die Unterstützung iOS 5 und später.
Hoffe es funktioniert für Sie!

+0

Vielen Dank, es funktioniert. Ich kann Quellen für jeden zur Verfügung stellen, wenn nötig. – user2587950

+0

@ user2587950 Kannst du mir ein Demo-Projekt schicken? Ich bekomme Fehler? Ich weiß nicht, wie ich es lösen soll. – karthikeyan

24

Ich nahm Almas Adilbeks Antwort (sehr schön gemacht!) Und kochte es auf seine wesentliche Komponente. Nur dieser Code allein (hinzugefügt zu meinem App-Delegaten) scheint die gewünschten Ergebnisse für mich zu bekommen. Wird aktualisiert, wenn Probleme auftreten.

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

    id presentedViewController = [window.rootViewController presentedViewController]; 
    NSString *className = presentedViewController ? NSStringFromClass([presentedViewController class]) : nil; 

    if (window && [className isEqualToString:@"MPInlineVideoFullscreenViewController"]) { 
     return UIInterfaceOrientationMaskAll; 
    } else { 
     return UIInterfaceOrientationMaskPortrait; 
    } 
} 
+1

+1 Sie verdienen viel mehr upvotes – AmiiQo

+0

Absolut fantastisch! Vielen Dank :) – Omar

+0

Funktioniert gut, außer wenn das Video in einem Modal eingebettet ist und es einen kleinen Fehler gibt, wenn das Video im Querformat abgelehnt wird. Wenn Sie dies tun, befindet sich das Interface im Querformat. Um es zu korrigieren, fügen Sie folgenden Test hinzu: '[presentedViewController isBeingDismissed] == NO' – jfgrang

Verwandte Themen