2013-10-21 10 views
9

Ich habe viele Antworten auf SO gelesen, aber ich kann nicht scheinen Autorotation arbeiten auf iOS7.Behandlung Autorotation für eine Ansicht Controller in iOS7

Ich brauche nur einen View-Controller zum Rotieren, also möchte ich keine Rotationseinstellungen in meiner Info.plist einstellen.

Wie ich die Dokumentation von Apple verstehe, kann ein einzelner View-Controller globale Rotationseinstellungen überschreiben (aus Info.plist), indem einfach zwei Methoden überschrieben werden. Info.plist ist auf nur Portrait zu ermöglichen, und mein View-Controller implementiert die folgenden Methoden:

- (NSUInteger)supportedInterfaceOrientations 
{ 
    NSLog(@"%s", __PRETTY_FUNCTION__); 
    return UIInterfaceOrientationMaskAllButUpsideDown; 
} 

- (BOOL)shouldAutorotate 
{ 
    NSLog(@"%s", __PRETTY_FUNCTION__); 
    return true; 
} 

ich diese NSLog Aussagen bei einer Drehung bin zu sehen, aber nichts dreht.

Wenn ich Info.plist mit den richtigen Rotationseinstellungen konfiguriere, wird sich meine Ansicht drehen, aber nicht, wenn ich mich auf meinen View-Controller verlasse.

Nicht sicher, ob es wichtig ist, aber die Ansicht, die ich versuche zu drehen, stammt von einer .xib, die das automatische Layout verwendet.

Auch mein ViewController wird modal präsentiert und ist in einem Navigationscontroller enthalten. Ich habe versucht, nur den View-Controller zu präsentieren und das funktioniert nicht. Ich habe auch versucht, adding a category to UINavigationController zu bekommen, es ist Autorotationsrichtungen von es ist topViewController.

+0

Gleiches Problem; Außerdem möchte ich, dass meine App iOS5-kompatibel ist, sodass ich supportedInterfaceOrientations nicht verwenden kann. Ich verwende die anderen beiden Funktionen: shouldAutorotate (NO zurückgeben) und shouldAutorotateToInterfaceOrientation (obwohl veraltet). Sie werden nicht einmal genannt! Es scheint, dass es keinen Ausweg gibt! –

+0

Ich habe endlich aufgegeben ... überprüfte meine xib, so dass die Ansicht in einer einigermaßen vernünftigen Weise auch in Querformat-Orientierung erscheint ... :-( –

Antwort

7

Sie müssen den plist Wert auf alle möglichen Werte setzen, so dass sie dann begrenzen, wie Sie sehen, passen (in der Navigation-Controller und TabBar Controller der UIViewController Klasse Beschreibung:.

In iOS 6 und höher, Ihre App unterstützt die in der Info.plist-Datei Ihrer App definierten Schnittstellenorientierungen . Ein View-Controller kann die Methode supportedInterfaceOrientations mit überschreiben, um die Liste der unterstützten Orientierungen zu begrenzen.In der Regel ruft das System diese Methode nur auf dem Root-View-Controller des Fenster oder ein View-Controller präsentiert, um das gesamte zu füllen Bildschirm; Kindersicht-Controller verwenden den -Teil des Fensters, das für sie von der übergeordneten Ansicht Controller bereitgestellt wird, und sind nicht mehr direkt an Entscheidungen darüber beteiligt, welche Rotationen unterstützt werden. Der Schnittpunkt der Orientierungsmaske der App-Orientierung und der Ausrichtungsmaske des Ansichtscontrollers wird verwendet, um zu bestimmen, in welche Ausrichtungen ein View-Controller gedreht werden kann.

+0

Also legen Sie die shootautorotate und unterstützte interfaceorientierungen in den View-Controller vor dem, den Sie wollen einen bestimmten Weg drehen oder was? – jgvb

17

In meinem Fall hatte ich bereits eine neue iOS7 App mit etwa 30 View Controllern erstellt. Ich brauchte eine automatische Rotation mit nur einem Modal View Controller. Ich wollte die bereits vorhandenen View-Controller nicht aktualisieren müssen.

habe ich die Orientierungen ich in dem plist wollte:

@implementation UIViewController (rotate) 
    -(BOOL)shouldAutorotate { 
     return NO; 
    } 
@end 

dann in der Einzel modal View-Controller-I:

select orientations

Dann eine Kategorie in AppDelegate auf UIViewController ich hinzugefügt WOLLTE drehen Ich habe diese Methode hinzugefügt:

-(BOOL)shouldAutorotate { 
     return YES; 
} 

Ich entdeckte auch, dass, wenn mein View-Controller kein modaler VC wäre, ich stattdessen Kategoriemethoden auf UINavigationController für alle VCs, die auf den Root-View-Controller folgten, als Teil des Navigationsstapels von View-Controllern hinzufügen müsste - ähnlich zu diesem: https://stackoverflow.com/a/20283331/396429

+5

Sie sollten keine Kategorien zum Überschreiben von Methoden verwenden. Der saubere Weg, genau dasselbe zu tun, ist das Erstellen einer Basisklasse für alle Ihre UIViewControllers und das Überschreiben der Methode dort. – Stoto

+0

Der springende Punkt meiner Antwort ist zu zeigen, wie das Ziel ohne Subklassen UIViewController erreichbar ist. In einigen Fällen ist es nicht praktikabel ist, kann der ganze Sinn der Antwort falsch ist, Kategorie nicht dafür verwendet werden, um zu tun, so –

+3

@Nate, da Ihr Fall eine besondere ist, wenn es funktioniert. Wenn Sie eine Methode überschreiben, die eine Kategorie verwendet, gibt es keine Garantie, dass sie sie tatsächlich überschreibt, sie kann trotzdem die alte auswählen. – igrek

1

Ich habe solches Problem konfrontiert - hatte nur eine Landschaftsansicht in meiner App. Ich habe unten Code verwendet, um das zu behandeln.

#import "objc/message.h" 
-(void)viewWillAppear:(BOOL)animated{ 

objc_msgSend([UIDevice currentDevice], @selector(setOrientation:), UIInterfaceOrientationLandscapeLeft); 
} 
+1

Love it! Hack and Slash – Burf2000

16

Einfach aber es funktioniert sehr gut. 7.1 IOS und 8

AppDelegate.h

@property() BOOL restrictRotation; 

AppDelegate.m

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
{ 
if(self.restrictRotation) 
    return UIInterfaceOrientationMaskPortrait; 
else 
    return UIInterfaceOrientationMaskAll; 
} 

Viewcontroller

-(void) restrictRotation:(BOOL) restriction 
{ 
    AppDelegate* appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate; 
    appDelegate.restrictRotation = restriction; 
} 

viewDidLoad

[self restrictRotation:YES]; or NO 
+0

Das ist die clevere Lösung ist i um dort zu finden. i kann hinzufügen, dass, wenn im selben Stapel, ein View-Controller nicht eingeschränkt ist, sollte der Rest der View-Controller hat [self restrictRotation: YES]; im viewWillAppear (für, wenn Sie Taste zurückzudrängen.) danke Alan! du bist der beste. –

0

Ich weiß, das ist alt, aber ich landete in einer einzigartigen Situation, wo wir 50 + ViewController über die ganze App, die ich abgelehnt habe, zu ändern und unterstützen die gleiche Ausrichtung in allen von ihnen aber eins oder 2. Das bringt Ich zu meiner Antwort. Ich habe eine UIViewController-Kategorie erstellt, die überschreibt - (BOOL) sollteAutorotate, um abhängig vom Gerätetyp usw. NO oder YES zurückzugeben (dies kann auch mit unterstützten Schnittstellenausrichtungen geschehen). Dann auf den ViewControllern wollte ich mehr als nur Porträt unterstützen, ich swizzled shouldAutorotate, um JA zurückzugeben. Dann zwang die Ausrichtung ändern, wenn der Blick auf den übergeordneten Viewcontrollers viewWillAppear Methode des Feldes verwiesen werden:

[[UIDevice currentDevice] setValue:@(UIInterfaceOrientationPortrait) forKey:@"orientation"].

Wenn alles gesagt und getan war, habe ich alles erreicht, ich auf ein paar Viewcontrollers mit < 30 Zeilen Code wollte mit ein Makro zum Swizzling. Hätte ich es getan, indem ich shouldAutorotate und supportedInterfaceOrientations auf allen VCs in der Anwendung ersetzt hätte, hätte ich ~ 250 zusätzliche Codezeilen. und eine Menge grunzender Arbeit, die es in erster Linie hinzufügt.

Verwandte Themen