2012-04-12 9 views
1

Ich habe eine UITabBar mit 5 Tabs. Ich möchte nur Autorotation für einen UIViewController aktivieren, der tief in Tab 3 auf den Stack geschoben wird. Um es klar zu sagen: Tippe auf UITabBar, Punkt 3, und du erhältst die Tabellennummer 3 der Wurzel UIView, die nicht automatisch umdrehen soll. Tippen Sie auf und rufen Sie einen weiteren UIViewController auf, der auf den Stapel geschoben wird (über einen UINavigationController). Tippen Sie noch einmal und holen Sie einen weiteren UIViewController auf den Stapel. Nur hier sollte diese UIView automatisch rotieren.Autorotation nur einige der Registerkarten in einer UITabBar? (ios 5)

Die anderen 4 Registerkarten sollten sich überhaupt nicht drehen - weder die Stammansicht der Registerkarten noch eine der untergeordneten Ansichten der Registerkarten.

Kann mir jemand sagen, welchen Ansatz ich verwenden soll? Ich habe gelesen, dass jeder einzelne Tab "JA" antworten muss, um "AutorotateToInterfaceOrientation" zu bestätigen.

+0

prüfen diese http://stackoverflow.com/questions/2731136/view-controllers-inside-tab-bar-controller-not-auto-resizing-on-rotation – mChopsey

Antwort

2

In den einzelnen Ansichten shouldAutorotate... können Sie eine Methode im Stammansicht-Controller aufrufen, die überprüft, was gerade angezeigt wird. Wenn die Tiefenansicht für Registerkarte 3 angezeigt wird, gibt sie YES zurück, andernfalls NEIN, und die Ansichten werden wiederum gleich zurückgegeben.


Bearbeiten - mehr Details pro user798719 Wunsch:

Ihre Wurzel-View-Controller kennt Ansicht, die ist auf dem Display. Sie fügen dem Stammansicht-Controller - (BOOL) isDeepLevelTab3Displayed; eine Methode hinzu. Die Methode prüft, ob die Tiefenansicht für Registerkarte 3 angezeigt wird, und gibt in diesem Fall YES zurück, andernfalls NO.

jedes Teil shouldAutorotate… Methode des View-Controller einen ref an den Root-Controller erhalten wird, so dass es isDeepLevelTab3Displayed.

aufrufen Wenn Sie ein Navigations-Stil-Controller verwenden, können Sie die ref wie diese erhalten (self ist die Sub-Controller):

NSArray *arrayOfControllers = [self viewControllers]; 
UIViewController *rootController = [arrayOfControllers objectAtIndex:0]; // per UIViewController class ref, root controller is at index 0 

Oder Sie etwas in Ihrem Projekt wie dieses erhalten könnte:

YourProjectAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
UIViewController *rootController = appDelegate.rootController; // or appDelegate.intermediateClass1.intermClass2.rootController — however you set up your project 

Also jedes Sub-Controller würde dies tun:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { 
    UIViewController *rootController = [[self viewControllers] objectAtIndex:0]; 
    return [rootController isDeepLevelTab3Displayed]; 
} 

Daher jeder Subzentrale würde YES zurück, wenn die Autorotation passieren sollte, die Erfüllung der Anforderung, die Sie am Ende Ihrer Frage erwähnen.

Wenn jedoch alle Ihre Untersteuerungen Instanzen von UINavigationController sind, können Sie durch Aufruf von visibleViewController bestimmen, welche Ansicht gerade angezeigt wird. Dann brauchen Sie nur eine Möglichkeit, ihre Identität zu überprüfen.

Sie könnten nibName oder title, zum Beispiel der Controller überprüfen, gegen eine Konstante oder eine ganze Zahl Eigenschaft hinzufügen intControllerIdentity auf alle Ihre Controller und setzte sie in den initWithNibName… des Controllers Die integer-Eigenschaft Schema könnte am besten sein, weil sie gewonnen Wenn Sie später den nibName oder den Titel ändern, sind Sie davon nicht betroffen.

Sie Konstanten bis zu einem gewissen Klasse, deren h hinzufügen würde Datei von allen Steuerungen importiert wird (oder, wenn alle Controller Instanzen derselben Klasse sind, diese Konstanten h Datei setzen in dieser Klasse):

#define kFooController 1 
#define kBarController 2 
#define kRotatableController 3 

Und Sie es wie folgt festgelegt würden:

self.intControllerIdentity = kRotatableController; 

Und es wie folgt überprüfen:

if (self.intControllerIdentity == kRotatableController) 

Hoffe das hilft. Aber bewerten Sie dieses zusätzliche Detail mit einem kritischen Auge; Ich habe mit Autorotation gearbeitet, aber noch nicht mit Navigationscontrollern.

+0

+1 für gültige Option – Till

+0

Hallo, vielen Dank für Ihre Hilfe. Würde es Ihnen etwas ausmachen, Ihre Erklärung ein bisschen mehr für mich auszuarbeiten? Ich bin immer noch ein bisschen unklar. – user798719

+0

Sicher. Ich habe die Antwort bearbeitet, um weitere Details hinzuzufügen. – Wienke

Verwandte Themen