2012-11-08 8 views
5

Mögliche Duplizieren:
“Incorrect” frame/window size after re-orientation in iPhoneiOS 6 Rotation Bug: Fenster und Root-View-Controller-Rahmen nicht ändern trotz Rotation

Ich versuche, ein sehr frustrierendes Problem mit einer App zu lösen von mir - beim Studieren habe ich vielleicht einen Bug in iOS gefunden:

Wenn Sie das iPad drehen, dreht sich die Ansicht, aber der Rahmen ändert sich nicht. Ich benutze einen Timer, der die Breite und Höhe meiner Ansicht jede Sekunde ausgibt, und obwohl ich die Ansicht visuell drehen kann, bleibt der Rahmen "768x1024" egal was.

Von Apple docs:

Wenn die Benutzeroberfläche dreht, wird das Fenster mit der neuen Ausrichtung angepasst angepasst. Das Fenster passt den Rahmen seines Stammansicht-Controllers an die neue Größe an, und diese Größe wird wiederum in der Ansichtshierarchie an andere Ansichten weitergegeben.

Dies ist genau das, was nicht passiert, und es verursacht mir alle möglichen Probleme. Kann jemand Rotation reparieren, so dass sich der Rahmen ändert?

Schritte zum Reproduzieren:

  1. Erstellen Sie ein neues leeres Projekt
  2. Stellen Sie einen Timer ein Knochen UIViewController als Root-Ansicht hinzufügen aus der Root-Ansicht-Controller des Rahmenbreite und Höhe drucken
  3. Führen Sie Ihre App aus und drehen Sie sie um. Hier ist mein Code Ich teste mit:
 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    self.window.rootViewController = [[UIViewController alloc] init]; 

    NSLog(@"%fx%f", self.window.rootViewController.view.frame.size.width, self.window.rootViewController.view.frame.size.height); 

    // Add a label to confirm orientation 
    UILabel *orientationLabel = [[UILabel alloc] initWithFrame:CGRectMake(10,10,100,30)]; 
    orientationLabel.text = @"Top Left"; 
    [self.window.rootViewController.view addSubview: orientationLabel]; 

    [NSTimer scheduledTimerWithTimeInterval:.3 target:self selector:@selector(testScale) userInfo:nil repeats:YES]; 

    self.window.backgroundColor = [UIColor whiteColor]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 
 
- (void) testScale { 
    NSLog(@"%fx%f", self.window.rootViewController.view.frame.size.width, self.window.rootViewController.view.frame.size.height); 
} 
+0

Duplikat http://stackoverflow.com/questions/2686882/incorrect-frame-window-size-after-re-orientation-in-iphone und http://Paketüberfluss.com/questions/11150495/ios-uiview-get-frame-nach-rotation – Bot

Antwort

0

kein Bug. Was Sie wollen, ist zu verwenden bounds anstelle von frame

Denken Sie daran auf diese Weise. Wenn Sie Ihr Gerät drehen, ändert das Gerät seine Bildschirmgröße nicht. Es bleibt gleich, aber die Aussicht ändert sich. Aus diesem Grund sollten Sie Grenzen verwenden.

+0

Es scheint explizit die Apple iOS 6 Dokumente entgegenzuwirken, die sagen, "passt den Rahmen seiner Root-View-Controller" – user441669

+0

@ user441669 gibt es zahlreiche doppelte Fragen, die sage genau das. – Bot

0

können Sie den Zustand der Statusleiste verwenden

[[UIApplication sharedApplication] statusBarOrientation] 

mit einem if-Anweisung, wissen Sie, wenn der Bildschirm Landschaft oder Portrait ist

1

Haben Sie versucht, Ihre UIViewController innen ein setzen UINavigationController stattdessen? Ich hatte ein ähnliches Problem und es hat es behoben. Die UINavigationController-Klasse scheint bessere Rotationen als UIViewController zu behandeln.

versuchen, etwas wie folgt aus:

UIViewController *myViewController = [[UIViewController alloc] init]; 
UINavigationController *myNavigationController = [[UINavigationController alloc] initWithRootViewController:myViewController]; 
self.window.rootViewController = myNavigationController; 
+0

Danke, ich werde das morgen versuchen – user441669

+1

Ich will dir danken. Ich habe seit zwei Tagen online gesucht, um zu finden, ob irgendjemand irgendjemand erklären könnte, warum meine 5.1-App in 6.1 komplett zusammengebrochen ist. Ich bekam einen schwarzen Balken zwischen navigationBar und UIView, und navigationBar rotierte NICHT, während der Rest der Ansicht rotierte. Diese einfache magische Zeile: \t self.window.navigationController = self.navigationController; in AppDelegate repariert es für mich! Nochmals vielen Dank! –