2014-09-25 14 views
17

Ho un'applicazione vuota e non sono coinvolti storyboard o xib. Voglio avere una barra di stato nascosta e supportare solo l'orientamento orizzontale. Ancora una volta, non voglio apportare tali modifiche solo all'interno del codice e non toccare Info.plist.UIWindow con dimensioni errate quando si utilizza l'orientamento orizzontale

Problema

creo un UIWindow con un controller che dice che l'unico orientamento supportato è paesaggio. In tal caso, la mia UIWindow viene creata nella dimensione della modalità verticale e non ruota. Il risultato atteso sarebbe uno schermo completamente ciano.

Broken UIWindow

Questo è il mio delegato:

#import "AppDelegate.h" 
#import "AppViewController.h" 

@implementation AppDelegate 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 
    self.window.backgroundColor = [UIColor cyanColor]; 
    self.window.rootViewController = [[AppViewController alloc] init]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

@end 

Questo è il mio controller:

#import "AppViewController.h" 

@implementation AppViewController 

- (BOOL)shouldAutorotate { 
    return YES; 
} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { 
    return UIInterfaceOrientationLandscapeLeft; 
} 

- (BOOL)prefersStatusBarHidden { 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations { 
    return UIInterfaceOrientationMaskLandscape; 
} 

@end 

Quello che ho provato finora

Se ho impostato il RootViewController dopo chiamando makeKeyAndVisible tutto sembra funzionare inizialmente.

self.window.backgroundColor = [UIColor cyanColor]; 
[self.window makeKeyAndVisible]; 
self.window.rootViewController = [[AppViewController alloc] init]; 

Ci sono ancora alcuni problemi. Prima di tutto non mi piace perché sembra molto fragile. Secondo problema è che in un'applicazione più complessa che fissa un GLKViewController come RootViewController ottengo il seguente risultato (atteso non sarebbe un'area nera a sinistra):

Broken GLKViewController

Sembra che la barra di stato non è nascosto abbastanza presto. Diversi sistemi di riconoscimento gesto sono attivi e in GLKViewController e cliccando sull'area nero produce il seguente messaggio di registro:

2014-09-25 13: 20: 42,170 StackOverflowExample [6971: 107907] Finestra nil inatteso _UIApplicationHandleEventFromQueueEvent, _windowServerHitTestWindow: UIClassicWindow: 0x7fa20b805e00; frame = (0 0; 375 667); userInteractionEnabled = NO; gestureRecognizers = NSArray: 0x7fa20b80a620; strato = UIWindowLayer: 0x7fa20b806890

Ho anche eseguito vari altri cambiamenti, come allegare un UIViewController vuoto e aggiungendo il mio vista come una sotto-view. In quel caso la mia vista sembra corretta ma la finestra sta ancora usando le dimensioni sbagliate.

Tutto gira correttamente se non sovrascrivo i metodi supportati InterfacciaOrientamenti nel mio controller di visualizzazione. Ma ovviamente non è quello che voglio.

risposta

24

Quando si esegue paesaggio app dalla ritratto modalità UIScreen ha ritratto limiti in iOS 8 (solo se non avete questa applicazione nel pannello interruttori app, come iOS 8 fa qualche cache). Anche la visualizzazione della finestra con makeKeyAndVisible non modifica la sua cornice. Ma cambia [UIScreen mainScreen].bounds secondo l'orientamento disponibile AppViewController.

#import "AppDelegate.h" 
#import "AppViewController.h" 

@implementation AppDelegate 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    // Portrait bounds at this point 
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 

    self.window.backgroundColor = [UIColor cyanColor]; 
    self.window.rootViewController = [[AppViewController alloc] init]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

@end 

Quindi cambiamo telaio della finestra dopo [self.window makeKeyAndVisible]

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    self.window = [UIWindow new]; 
    self.window.backgroundColor = [UIColor cyanColor]; 
    self.window.rootViewController = [[AppViewController alloc] init]; 
    [self.window makeKeyAndVisible]; 

    // Here it is 
    self.window.frame = [UIScreen mainScreen].bounds; 
    return YES; 
} 

penso che sia iOS 8 bug.

+1

Grazie per aver condiviso. Ho passato molte ore a cercare di capire come farlo. –

+0

Con iOS8.1 e utilizzando Swift ho dovuto aggiungere una piccola frazione alla larghezza e all'altezza di UIWindow per risolvere il mio problema come fatto qui: http://stackoverflow.com/a/26452679/190599 – CodeReaper

+0

Funziona alla grande, grazie a sacco. –

0

Il problema è risolto quando si aggiunge una schermata di avvio, che si può fare solo con l'aggiunta di una proprietà in più per l'info.plist

ha avuto questo problema me stesso, non sono sicuro se è possibile aggiungerlo tramite il codice però, ho solo riuscito a farlo funzionare con file Info.plist + lancio xib schermo

<key>UILaunchStoryboardName</key> 
<string>Launch Screen</string> 

In realtà non credo che si deve aggiungere un file XI ter, se solo la chiave (con qualsiasi valore) è disponibile nel plist dovrebbe funzionare.

+0

Purtroppo non l'ho fatto per me. –

8

Ho avuto un problema simile, per un'app ritratto.

ho risolto il problema impostando barra di stato orientamento prima un'istanza UIWindow

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Init my stuff 
    // ... 

    // Prepare window 
    [application setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO]; // prevent start orientation bug 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

Nel tuo caso, si dovrebbe usare UIInterfaceOrienationLandscapeLeft (o destro) nel metodo setStatusBarOrientation:animated:.

Spero che ti aiuti.

+0

geniale! Nessuna delle altre soluzioni ha funzionato – RawMean

0

Nessuna delle soluzioni pubblicate qui o altrove ha funzionato per me.

Tuttavia, ho trovato che questo problema non si verifica apparentemente con Storyboard, quindi una soluzione alternativa è quella di allontanarsi da Xibs. (Questo fatto rende purtroppo improbabile che Apple prenderà seriamente il problema.)

Problemi correlati