Frage

Ich kann sehen, dass dies etwas ist, das eine Menge Leute beunruhigend ist: /

Ich habe eine UITabBarController, die 4 Viewcontrollers, die alle vom Typ UINavigationController. Einer der navigationControllers bekommt ein Viewcontroller auf seinen Stapel geschoben, diese Viewcontroller sollte im Querformat / Orientierung dargestellt werden.

Der Viewcontroller ist eine grafische Darstellung ist es der absolut einzige Ort in der App, wo Landschaft Sinn macht. (Ich verstecke die UITabBar wenn dies nicht dargestellt ist, den Benutzer führen zu glauben, dass dies überall funktionieren wird)

Um einen UITabBarController reagiert richtig auf Veränderungen in der Orientierung machen alle ihre Viewcontrollers müssen den gleichen Wert aus dem Delegatmethode zurückzukehren:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

So, dieses Verhalten zu empfangen ich diese Methode implementiert haben in allen Viewcontrollers zum UITabBarController Zugehörigkeit:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    BOOL canRotate = [defaults boolForKey:@"can_rotate"];

    return canRotate;
}

Der „Trick“ ist jetzt, dass, wenn meine Dose-be-Landschaft Viewcontroller geschoben ich dies tun:

- (void) viewWillAppear:(BOOL)animated {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setBool:YES forKey:@"can_rotate"];
    [defaults synchronize];

}

und wenn es geknallt ist, tue ich dies:

- (void) viewWillDisappear:(BOOL)animated {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setBool:NO forKey:@"can_rotate"];
    [defaults synchronize];

}

Das funktioniert wirklich gut. Wenn die Viewcontroller auf dem Stapel ist, kann ich das Gerät drehen und die Ansicht folgt.

Das Problem ist jedoch, dass, wenn der Benutzer die Schaltfläche „Zurück“ auf der Navigationsleiste tippt, während im Landscape-Modus, so dass die Viewcontroller zum vorherigen Viewcontroller Knallen, das „alte“ Viewcontroller natürlich auch im Querformat. Um alles noch schlimmer zu machen, weil ich die BOOL nein, diese „alte“ Viewcontroller liegt, kann nicht zurückdrehen, wenn ich drehen Sie das Gerät Portrait-Modus.

Gibt es eine Möglichkeit zu aktualisieren alles so, dass keiner meiner anderen Viewcontrollers im Querformat sein wird, wenn ich den Pop-Dose-be-in-Landscape-Modus Viewcontroller?

Ich bin ein bisschen besorgt, dass, wenn diese von Landschaft zu Portrait getan werden könnte es auch von Hoch- auf Querformat möglich sein sollte, wodurch meine unnötig „Hack“ .. aber wenn es nicht kann, dann bin ich wieder Platz eins : /

Hope Ich bin in der Nähe und dass jemand könnte mir helfen, dorthin zu gelangen, dank:)

War es hilfreich?

Lösung

Ich glaube, ich kann die ganze Sache vereinfachen ....

- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation {
return NO;
}

-(void) viewDidAppear:(BOOL)animated { [UIView beginAnimations:@"View Flip" context:nil]; [UIView setAnimationDuration:0.5f]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

    self.view.transform = CGAffineTransformIdentity;
    self.view.transform = CGAffineTransformMakeRotation(90.0*0.0174532925);
    self.view.bounds = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f);
    self.view.center = CGPointMake(160.0f, 240.0f);

// [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeRight;

[UIView commitAnimations];
[super viewDidAppear:animated];

}

Im Moment Auto dreht sich, aber Sie dann manuell drehen die Ansicht, die Sie bewegt werden soll. Wenn Sie Unterstützung für die Tastatur nicht Sie in der Ansicht benötigen brauchen nicht die statusBarOrientation zu ändern.

Wenn Sie nicht immer, dass Ansicht gedreht wollen, dann müssen Sie ein etwas härteres Problem - Sie könnten die Beschleunigungs-Werte Abbildung überprüfen mögen aus dem Weg rund um das Telefon (oder es könnte möglich sein, implizieren, welche Art und Weise das Telefon durch Anrufe shouldAutotateToInterfaceOrientation und dann rufen Sie einfach den Code umwandeln, wie und wann Sie müssen eingeschaltet worden ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top