2009-05-07 4 views
4

Meine App startet in Landscape-Modus korrekt und funktioniert super:Iphone Landschaftsmodus Umschaltung auf Portraite Modus auf das Laden neuer Controller

- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    if(interfaceOrientation == UIInterfaceOrientationPortrait) 
     return NO; 
    if(interfaceOrientation == UIInterfaceOrientationLandscapeRight || interfaceOrientation == UIInterfaceOrientationLandscapeLeft) 
     return YES; 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 

und aktualisiert Info.plist mit

UIInterfaceOrientation = UIInterfaceOrientationLandscapeRight 

Jetzt in meinem Haupt-Controller Ich schalte einen ViewController für einen anderen

characterController = [ [ CharacterController alloc ] init]; 
myCurrentViewController = characterController; 
self.view = myCurrentViewController.view ; 

aus und es lädt aber die orien Der Modus ist im Portrait-Modus. Wenn ich dann das iPhone gedreht habe, korrigiert es es in den Querformat-Modus. Irgendwelche Ideen, wie man Landschaftsorientierung beim Laden eines neuen viewControllers in meinen mainController behält?

Antwort

1

Ich glaube, Sie

- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 

in Ihrem CharacterController auch implementieren müssen.

+0

Es implementiert ist die Frage nicht, dass widerspiegelten. Ich habe die Frage aktualisiert –

-2

Wieder einmal fand ich meine eigene Antwort. LOL

Nachdem die neue Viewcontroller Laden

self.view = myCurrentViewController.view; 

Update-Controller die neue Viewcontroller auf Landschaft

self.view.transform = CGAffineTransformMakeRotation(-3.14 * (90)/180.0); 
self.view.bounds = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f); 
self.view.center = CGPointMake(160.0f, 240.0f); 
1

Gefunden eine andere Lösung zu orientieren:

[myCurrentViewController presentModalViewController: newController animated: NO]; 
7

Seien Sie sehr vorsichtig über Ihre self.view=otherVC.view Ansätze. Ein UIViewController soll eine einzelne Ansicht verwalten. Es ist nicht so konzipiert, dass seine Ansicht ausgelagert wird (deshalb funktionieren Ihre Orientierungsänderungen nicht). Dies ist in Fällen wie -didReceiveMemoryWarning wichtig, wenn Ihr ViewController nicht auf dem Bildschirm angezeigt wird. Es wird in Ruhe seine Ansicht ablegen, und wenn es wieder auf dem Bildschirm angezeigt wird, laden Sie die Ansicht von der NIB erneut (oder führen Sie -loadView erneut aus).

Ihr Ansatz presentModalViewController: ist etwas besser, obwohl es nicht funktioniert, wie eine modale Ansicht funktioniert. So kann jeder ViewController seine eigene Ansicht verwalten. Normalerweise würden Sie hier einen UITabBarController oder UINavigationController verwenden. Ich nehme an, Sie haben einen Grund, warum Sie das vermeiden.

Meine empfohlene Lösung wäre das Hinzufügen eines UIView zur Ansicht Ihres Hauptansicht-Controllers (als IBOutlet oder im Code). Sie tauschen , die Ansicht ein und aus, statt die Ansicht des UIViewControllers ein- und auszublenden. Ich würde wahrscheinlich weitermachen und UIViewController ableiten, um dies zu handhaben, mit Methoden, die nach UITabBarController modelliert sind.

@interface RNSwappableViewController : UIViewController 
{ 
    ... 
} 
@property(nonatomic, assign) id<RNSwappableViewControllerDelegate> delegate; 
@property(nonatomic) NSUInteger selectedIndex; 
@property(nonatomic, assign) UIViewController *selectedViewController 
@property(nonatomic, copy) NSArray *viewControllers; 
@end 

@protocol RNSwappableViewControllerDelegate : NSObject 
- (void)swappableViewController:(RNSwappableViewController *)swappableViewController didSelectViewController:(UIViewController *)viewController 
@end 
+0

Ja, nachdem ich mein Problem behoben und noch mehr gelesen habe, fand ich heraus, dass UINavigationController hätte verwendet werden sollen. –

0

Haben Sie das Problem, wo ShouldAutorotateToInterfaceOrientation mit UIInterfaceOrientationPortrait genannt wurde sogar anfangen, wenn das Telefon Landschaft war?

Ich habe eine App, die hauptsächlich portrait-only ist und mit einem View-Controller, den ich mit presentModalViewController erstelle, die ich möchte automatisch zu drehen, die ich gut funktionierte, aber wenn ich es öffnete, würde es immer im Hochformat beginnen. Der View-Controller schien die Ausrichtung des übergeordneten View-Controllers gegenüber dem Gerät zu bevorzugen.

Dies ist, was für mich gearbeitet, im View-Controller modale Ansicht:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation]; 

// if device orientation is one of these, don't care what our interface orientation is 
if (deviceOrientation == UIDeviceOrientationUnknown && deviceOrientation == UIDeviceOrientationFaceUp && deviceOrientation == UIDeviceOrientationFaceDown) 
    return YES; 

// otherwise only return YES for the ui orientation matching the current device orientation 
return (interfaceOrientation == deviceOrientation); 
} 
0

Ich war genau das gleiche Problem hat, außer ich die modal zu einem UITableViewController Zugabe wurde. Ich fand heraus, dass dies nur ein Problem war, wenn es von viewDidLoad aufgerufen wurde, da das Modal präsentiert wurde, bevor die Orientierungen vom Delegierten des View-Controllers bestätigt wurden.

Also ich habe gerade einen performSelector Aufruf mit einem Timer, aufgerufen von viewDidLoad. Jetzt lädt es in der richtigen Ausrichtung.

3

Ich habe den empfohlenen Code verwendet. Die Tabelle dreht sich tatsächlich. Die Titelleiste befindet sich jedoch weiterhin in der normalen Hochformatausrichtung und -position. Wie kann ich die Titelleiste neu positionieren?

// Benutzerdefinierte erscheinen, dass die Tableview dreht

- (void)viewDidAppear:(BOOL)animated 
{ 
    self.view.transform = CGAffineTransformMakeRotation(-3.14 * (90)/180.0); 
    self.view.bounds = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f); 
    self.view.center = CGPointMake(160.0f, 240.0f); 

} 
+0

Verwenden Sie stattdessen CGAffineTransformMakeRotation (M_PI_2) oder geben Sie einige Dezimalstellen bis 3.14 ein. Sonst ist die Drehung um 0,05 Grad aus und einige Elemente können gezackt sein, wenn sie gerendert werden. – Sten

Verwandte Themen