2012-11-08 12 views
5

Powiel możliwe:
“Incorrect” frame/window size after re-orientation in iPhoneiOS 6 Obrót Bug: Okna i ramy głównej View Controller nie zmienia się pomimo obrotów

Próbuję rozwiązać bardzo frustrujący problem z aplikacją - w trakcie badania Mogłem znaleźć błąd w iOS:

Po obróceniu iPada widok obraca się, ale jego ramka się nie zmienia. Używam timera, który wyświetla co sekundę szerokość i wysokość mojego widoku i chociaż widzę, że widok obraca się wizualnie, ramka pozostaje "768 x 1024" bez względu na wszystko.

Od docs Apple:

Gdy interfejs użytkownika obraca, okno jest zmieniany, aby dopasować nową orientację. Okno dostosowuje ramkę kontrolera widoku głównego do nowego rozmiaru, a ten rozmiar z kolei jest propagowany w dół hierarchii widoków do innych widoków.

To jest dokładnie to, co się nie dzieje i powoduje wiele kłopotów. Czy ktoś wie, jak naprawić rotację, aby ramka się zmieniła?

Kroki do odtworzenia:

  1. Utwórz nowy pusty projekt
  2. dodać kostnego UIViewController jako widoku głównego
  3. ustawić timer do wydrukowania szerokości ramy korzenia widok kontrolera i wysokość
  4. Uruchom aplikację i obróć ją dookoła. Oto mój kod mam testowanie z:
 
- (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 i http://przepełnienie stosu.com/questions/11150495/ios-uiview-get-frame-after-rotation – Bot

Odpowiedz

0

nie błąd. To, czego chcesz, to użyć bounds zamiast

Pomyśl o tym w ten sposób. Po obróceniu urządzenia urządzenie nie zmienia rozmiaru ekranu. Pozostaje bez zmian, jednak widok się zmienia. Dlatego właśnie chcesz użyć granic.

+0

Zdecydowanie przeciwdziałają dokumentom Apple iOS 6, które mówią "dostosuj ramkę kontrolera widoku głównego" – user441669

+0

@ user441669 Istnieje wiele zduplikowanych pytań, które Podkreśl to bardzo. – Bot

0

Można użyć stan paska stanu

[[UIApplication sharedApplication] statusBarOrientation] 

z if, można wiedzieć, jeśli ekran jest pozioma lub pionowa

1

Czy spróbować umieścić UIViewController Wewnątrz Zamiast tego UINavigationController? Miałem podobny problem i naprawiłem go. Klasa UINavigationController wydaje się obsługiwać lepsze obroty niż UIViewController.

spróbować czegoś takiego:

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

Dzięki, spróbuję tego jutro – user441669

+1

Chcę ci podziękować. Szukałem przez 2 dni w Internecie, aby dowiedzieć się, czy gdziekolwiek ktoś mógłby wyjaśnić, dlaczego moja aplikacja 5.1 całkowicie zepsuła się w wersji 6.1. Dostawałem czarny pasek między nawigacją a UIView, a pasek nawigacji NIE obracał się, podczas gdy reszta widoku obracała się. Ta prosta magiczna linia: \t self.window.navigationController = self.navigationController; w AppDelegate naprawiono to dla mnie! Jeszcze raz bardzo ci dziękuję ! –

Powiązane problemy