2010-03-10 9 views
7

Wie der Titel sagt. Mein UIViewController dreht sich nicht, egal was passiert. Wenn es lädt, sollteAutorotateToInterfaceOrientation aufgerufen werden, aber danach tut es nicht.UIViewController rotiert nicht automatisch

UPDATE 1:

Es ist ein wirklich, wirklich seltsam Problem. Zumindest für mich. Und ich werde versuchen, alles zu erklären.

Es ist eine navigationsbasierte App. Jeder Controller verfügt über

Xcontroller ist ein Kind von Controller und es nicht automatisch zu drehen. Wenn XController ein Kind von Bcontroller wird, wird es automatisch umdrehen. Da stimmt etwas mit Acontroller nicht. Aber Controller ist identisch (außer seinen Daten) zu Bcontroller.

Was ist falsch?

UPDATE 2:

entschied ich mich AController neu zu erstellen. Und es hat funktioniert. Ich glaube, ich habe etwas Dummes verpasst.

+0

Wie haben Sie die '-shouldAutorotateToInterfaceOrientation:'? – kennytm

+0

- (BOOL) sollteAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation { Rückgabe YES; } Wenn das ist was du meinst :). – looneygrc

Antwort

15

Ich bin mir nicht sicher, ob es der gleiche Grund wie Ihr Fall ist. Aber ich habe das Gleiche erlebt. Die shouldAutorotateToInterfaceOrientation wurde nur einmal am Anfang aufgerufen. Nach einigem ernsthaften Debuggen, indem ich Code auseinander nahm, fand ich, dass der Grund in meiner überschriebenen init Methode ist. Ich hatte dies vor:

- (id)initWithAlbum:(PhotoAlbum *)theAlbum { 
    if (self) {  
     self.photoAlbum = theAlbum;  
    } 
    return self; 
} 

Und dann wechselte ich in diesem

- (id)initWithAlbum:(PhotoAlbum *)theAlbum { 
    if (self = [super init]) {  
     self.photoAlbum = theAlbum;  
    } 
    return self; 
} 

Hinweis: Der einzige Unterschied ist, ich [super init] hinzugefügt, um die Eltern init zu nennen. Nach dieser Änderung funktioniert die Rotation gut und die shouldAutorotateToInterfaceOrientation wird jedes Mal aufgerufen, wenn ich den Bildschirm rotiere. Hoffe diese Hilfe.

+1

Hey DaiLak, du hast mir das Leben gerettet. Ich hatte das gleiche Problem wie deines, und ich hatte stundenlang damit zu kämpfen. Vielen Dank. –

+0

Es funktioniert nicht für mich –

0
  • (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation {return YES; } Die obige Methode, wenn Sie verwenden, können Sie viele Zeit aufrufen, wenn Sie ohne Fehler möchten.
+0

Ich verwende diese Methode. Und es wird nur aufgerufen, wenn der Controller lädt. – looneygrc

0

Ich denke, es gibt kein merkwürdiges Verhalten hier, es heißt nur eine, die richtig ist. Sie müssen nicht mehr als einen Anruf tätigen, um zu entscheiden, ob das Gerät in eine Richtung drehen soll oder nicht.

Diese Methode fragt nur, ob das Gerät in eine Richtung drehen soll oder nicht. Wenn Sie die Orientierungsänderung behandeln wollen, sollten Sie für die Meldung von der UIDeviceDidChangeOrientationNotification registrieren und die folgende Methode überschreiben:

- (void)orientationChanged:(NSNotification *)notification 
{ 
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation; 
    if (UIDeviceOrientationIsLandscape(deviceOrientation) && 
    !isShowingLandscapeView) 
    { 
     [self presentModalViewController:self.landscapeViewController 
          animated:YES]; 
     isShowingLandscapeView = YES; 
    } 
    else if (deviceOrientation == UIDeviceOrientationPortrait && 
      isShowingLandscapeView) 
    { 
     [self dismissModalViewControllerAnimated:YES]; 
     isShowingLandscapeView = NO; 
    } 
} 

Weitere here.

+0

Danke für Ihre Antwort.Aber ich verstehe nicht, warum in meinen anderen Controllern genug AutototateToInterfaceOrientation ist, um sie zu drehen. Und für diesen spezifischen Controller ist nicht genug. Auch in meinen anderen Controllern sollte jedes Mal, wenn ich das Gerät rotiere, AutorotateToInterfaceOrientation aufgerufen werden. – looneygrc

+0

Mit anderen Worten ... mein Controller sollte shallAutorotateToInterfaceOrientation jedes Mal aufrufen, wenn ich das Gerät rotiere, um zu prüfen, ob die Ausrichtung unterstützt wird. Naja ... mein "problematischer" Controller ruft es nur beim Laden auf und nicht wenn das Gerät rotiert. – looneygrc

+0

Wenn sich das Gerät dreht, fragt es den Controller, ob es die Rotation unterstützen soll, indem es "shouldAutorotateToInterfaceOrientation:" abfragt. Wenn die Antwort ja ist, wird es die willRotateToInterfaceDuration: duration aufrufen, um zu sehen, ob es weitere Änderungen vornehmen muss. –

2

Auch, stellen Sie sicher, daß eine Drehung nicht erfassen. Ich verbrachte eine gute Stunde damit, herauszufinden, warum meine Ansichten aufhörten, sich zu drehen. shouldAutorotateToInterfaceOrientation wurde nur einmal beim Start aufgerufen und wenn Game Center Ranglisten/Erfolge präsentiert wurden.

3

Ich hatte das gleiche Problem - der Grund war, dass es mein erster UIViewController war, den ich in meinem ApplicationDelegate on-the-fly erstellte, fügte View zu meinem UIWindow hinzu und veröffentlichte es sofort.

Das ist natürlich nicht richtig, wie ich nur die UIView der UIViewController (Halte es) hinzugefügt und als die gesamte Steuerung freigegeben.

Sie sollten stattdessen Ihren ersten UIViewController als Instanzvariable in Ihrem ApplicationDelegate hinzufügen und in der Dealloc-Methode Ihres ApplicationDelegate freigeben.

+0

Danke, das hat mein Problem behoben. – ChenXin

0

Ich habe das gleiche Problem, aber mit zwei View-Controller zu der UIWindow der Anwendung hinzugefügt. Der Grund ist Die UIView Unterkunft View-Controller innerhalb UIWindow eingebettet ist, sondern neben einer zusätzlichen View-Controller

Von Apple Technical Q & A

http://developer.apple.com/library/ios/#qa/qa1688/_index.html

1

In meinem Fall die Viewcontroller war in einem Navigation Das wurde von einer "Eltern" -Ansicht benutzt, die die Orientierungsänderungen erhalten hat.

Was ich in diesem Elternteil tat, war:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{ 

    if(_navigationController){ 
     return [_navigationController.topViewController shouldAutorotateToInterfaceOrientation: toInterfaceOrientation]; 
    } 

    return toInterfaceOrientation == UIInterfaceOrientationPortrait; 
} 

So können Sie Ihre eigene Orientierungsänderung Logik in Abhängigkeit von den aktuell sichtbaren Controller implementieren können.

Verwandte Themen