2012-04-07 2 views
11

Ich habe eine universelle iPad/iPhone App, mit der der Benutzer ein Video ansehen kann, das dann in den Vollbildmodus erweitert werden kann.Wie stelle ich sicher, dass meine Ansicht nach Vollbildvideo korrekt ausgerichtet ist?

Ich habe (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration implementiert, und in dieser Methode führe ich verschiedene SetFrame-Aufrufe auf meine Ansichtselemente abhängig davon, ob sie im Querformat oder Hochformat sind.

Das scheint im normalen Gebrauch gut zu funktionieren, d.h. das Hin- und Herdrehen funktioniert gut.

Wenn der Benutzer jedoch im Hochformat startet, ein Video startet, in den Vollbildmodus wechselt, in Querformat wechselt und dann das Video stoppt - die Elemente werden oft nicht richtig skaliert. Sie scheinen immer noch so groß zu sein, als wären sie im Hochformat.

Wenn ich dann in den Hochformatmodus wechsle und dann zurück in den Querformatmodus wechsle, wird die Ansicht korrekt zurückgesetzt.

Der komische Teil ist, habe ich implementiert (void)exitedFullscreen:(NSNotification*)notification und in dort drucke ich die Ausrichtung, und es ist richtig gesehen. Ich rufe auch meinen Code auf, um die Ansichtselemente basierend auf der aktuellen Ausrichtung zurückzusetzen, und ich habe immer noch dieses Problem.

Ein anderes verwandtes Problem ist manchmal, wenn es um Rotation geht, meine Ansichten werden zu weit oben auf dem Bildschirm enden, tatsächlich unter der Statusleiste an der Spitze des Geräts.

Bearbeiten Hier ist das neueste Beispiel. Ich drehe während der Videowiedergabe im Vollbildmodus in den Querformatmodus. Wenn ich dann das Vollbildvideo ausgeblendet habe, wird das Problem mit der Navigationsleiste oben in der Ansicht angezeigt.

Navigation bar goes underneath status bar after rotation during full screen video.

Antwort

1

Ihr ViewController dreht sich möglicherweise nicht, weil ein anderer Controller der erste Responder ist. Um dies zu vermeiden, registrieren Sie den View-Controller für die Gerätedrehungsänderungen und implementieren Sie die Rotation in dem Selektor, den Sie aufrufen, wenn Sie eine solche Benachrichtigung erhalten.

In AppDelegate:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

Ihrer Ansicht Controller

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:)name:UIDeviceOrientationDidChangeNotification object:nil]; 

In hat drehen Sie die Ausrichtung überprüfen mit

[[UIDevice currentDevice] orientation] 
+0

Dies hat mir bei Rotationsproblemen geholfen, während mein Video inline abgespielt wird, aber es treten immer noch Probleme auf, wenn das Video im Vollbildmodus gedreht wird und den Vollbildmodus verlässt. Sehen Sie meine letzte Bearbeitung mit dem beigefügten Screenshot für ein Beispiel des Problems. –

+0

Ich werde Ihnen die Antwort/Kopfgeld geben, weil es so aussieht, seit ich Ihre Änderungen vorgenommen habe, die Orientierungsprobleme haben sich definitiv verbessert. Ich glaube, mein einziges Problem ist, dass sich die Navigationsleiste nach dem Beenden des Vollbilds unterhalb der Statusleiste befindet, was ein ganz anderes Problem sein kann. –

0

Mason, haben Sie angemeldet und geprüft, ob Ihre Methode willAnimateRotationToInterfaceOrientation: Dauer: wird nach jedem Zustandsübergang genannt?

+0

Yep es genannt bekommt. Wie Sie in meiner Frage sehen können, arbeiten die Dinge hauptsächlich in Bezug auf Rotation. Es scheint meistens Probleme zu haben, wenn die Rotation während der Filmwiedergabe stattfindet. Manchmal sogar wenn nicht im Vollbildmodus. –

+0

Sie sagen also Ihre Methode wird aufgerufen, gerade bevor das Problem auftritt, aber wegen der Methode ruft unsachgemäße Orientierung Wert "... die verschiedenen SetFrame Aufrufe auf Ihre Ansichten" werden durch falsche Eingabe täuschen? – buildingKofi

+0

Ich habe ein Debugging an Ort und Stelle, um die angegebene Ausrichtung zu protokollieren, und das scheint nie das Problem zu sein. Die Ausrichtung wird immer korrekt gemeldet, wenn ich über eine Rotation informiert werde. –

0

Ihre Ausrichtung wird möglicherweise nicht ordnungsgemäß aktualisiert, wenn ein anderer Controller als Ersthelfer fungiert. Der beste Weg, dies zu überwinden, ist es, die Funktionen aufrufen Sie den Bildschirm an der Methode viewWillAppear: mit der aktuellen Ausrichtung des View-Controllers verwenden zu orientieren: [self interfaceOrientation]

Wenn Sie eine Unterklasse subview verwenden Sie können die Methot layoutSubviews neu zu implementieren müssen und Rufen Sie setNeedsLayout auf. Eine andere Sache, die dies verursachen kann, ist das Zurücktreten des Viewcontrollers, wo Sie das Video als Ersthelfer haben (Sie können suchen, wenn Sie irgendwo das Methon residntfirstresponder verwenden und versuchen, wie es ohne es funktioniert). Wenn das nicht funktioniert, weiß ich nicht, diese Dinge können sehr schwierig sein und davon abhängen, wie Sie es implementiert haben. Aber für die Dinge, die Sie sagen, sollten Sie nicht viel Code benötigen, da die automatische Drehung und Größenanpassung von Ansichten jetzt vom Größeninspektor des Ansichteneditors gehandhabt wird.

Ich denke, dass dies tun sollte.

+0

Ich rufe den Code bereits auf, um meine Elemente (denselben Code, der bei Orientierungsänderungen aufgerufen wird) nach dem Beenden des Vollbilds anzupassen. Also ich glaube nicht, dass es das ist, aber danke für die Antwort. –

+0

Ich habe die Antwort mit mehr Tipps bearbeitet, wenn das nicht funktioniert, weiß ich nicht. Aber wie ich am Ende gesagt habe, wird die automatische Größenanpassung vom Ansichteneditor gehandhabt, und Sie sollten nicht viel Code für die Größenänderung einer Videoansicht benötigen, sondern nur die Ansicht im Größeninspektor entsprechend konfigurieren. –

0

Für mich neuesten Screenshot sieht nicht so aus ein Problem mit der Ausrichtung. Die Navigationsleiste ist grundsätzlich durch die Höhe der Statusleiste deaktiviert.

Möglicherweise Ihre Positionsberechnung schlägt fehl, da Sie die Ansicht des Rahmens während der Vollbild-Video verwenden (w/o Statusleiste) spielt und dies nicht gelingt, sobald die Statusbar zurück ist?

+0

Danke für die Antwort. Ich habe deine Theorie über das Timing-Problem mit einigen Breakpoints getestet. Der Code zum Anpassen der Positionsberechnungen wird definitiv NACH dem Vollbildmodus angezeigt. –

1

Die Navigationsleiste oben in der Ansicht. Ich löste es mit diesem Code ->

[[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO]; 
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES]; 

Verwenden Sie dies nach Ihrer Rotation.

+0

Danke für die Antwort. Ich habe versucht, diesen Code nach meiner Rotation zu verwenden, nach dem Codeabschnitt, in dem ich meine Elemente in der Ansicht für die neue Ausrichtung positioniere, und es schien keine Wirkung zu haben. –

Verwandte Themen