UIScreen applicationFrame ritorno rettangolo non corretto di avvio dell'applicazione del paesaggio (iPhone / iPad)

StackOverflow https://stackoverflow.com/questions/2664980

Domanda

Avendo difficoltà a raggiungere i limiti corretti per la mia applicazione iPad al momento del lancio in modalità orizzontale. Ho le chiavi corrette fissati nel mio file Info.plist, e il mio controller di vista lancio correttamente nel paesaggio (e ritratto, natch).

Nel mio metodo applicationDidFinishLaunching: sto chiamando un selettore, dopo un ritardo di 3 secondi, e che il metodo effettua una chiamata a [[UIScreen mainScreen] applicationFrame], ma mi sta restituendo un telaio verticale (cioè altezza> larghezza).

Qualcuno sa come risolvere questo problema? C'è odore di un insetto a me (se così ti FILE un radar), ma se è destinato comportamento, dove è documentato?

È stato utile?

Soluzione

Quando si sta tenendo l'iPad in orientamento orizzontale e lanciare un app, il controller della vista vede inizialmente limiti per una vista ritratto (anche se i rapporti orientamento orizzontale). Il controller di vista sarà quindi ottenere un messaggio di ruotare a orientamento orizzontale prima che venga visualizzato.

Altri suggerimenti

Non ho mai contare su [[UIScreen mainScreen] applicationFrame], soprattutto durante il lancio app.

Quando si creano viste nel codice, utilizzare il superview per impostare la cornice.

Se stai usando xibs con "elementi di interfaccia simulati" Saranno correttamente dimensionato e tutto funzionerà alla grande.

applicazioni basate UINavigationController

Nel caso di un'applicazione basata UINavigationController, afferrare il telaio direttamente da self.navigationController.view, non cercare di usare [self loadView] e self.view.superview. UINavigationController usa "nascosto" subviews per farlo di lavoro - in modo che il superview diretta non funziona

.

UINavigationController è speciale perché durante app lancio, il controller di navigazione ridimensiona le parere dopo loadView viene chiamato. Durante il ridimensionamento automatico calci in si finisce con un piccolo margine nella parte inferiore dello schermo.

Perché non UIScreen

[[UIScreen mainScreen] applicationFrame] non funziona correttamente (in particolare durante il lancio di app nel paesaggio). La mia esperienza è che la proprietà interfaceOrientation del viewcontroller non corrisponderà l'orientamento applicationFrame.

CGRect bounds = [[UIScreen mainScreen] bounds]; // portrait bounds
if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) {
    bounds.size = CGSizeMake(bounds.size.height, bounds.size.width);
}

Questo è il modo in cui ho la corretta CGRect quando il controller di vista è sul paesaggio:

CGRect landscapeBounds;
if (self.view.frame.size.width < self.view.frame.size.height)
    landscapeBounds = CGRectMake(self.view.frame.origin.y, self.view.frame.origin.x, self.view.frame.size.height, self.view.frame.size.width);
else
    landscapeBounds = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height);

Questo è come progettato. Si dovrebbe interrogare le dimensioni del vostro superview e regolare, se necessario.

[[UIScreen mainScreen] applicationFrame] restituirà sempre il rettangolo ritratto, anche se l'applicazione è in modalità orizzontale. Questo è legato al fatto che UIWindow non in realtà ruota, ma cambia solo la trasformazione di rootViewController.view invece.

Per essere sicuri, è possibile stampare l'oggetto vista radici in modalità verticale e orizzontale, e vedrete qualcosa di simile:

Ritratto:

<UIView: 0x96290e0; frame = (0 20; 768 1004); ...

Paesaggio:

<UIView: 0x96290e0; frame = (0 20; 768 1004); transform = [0, 1, -1, 0, 0, 0]; ...

Quindi, aggiungere un'immagine di lancio e dargli la -568h suffisso, secondo le guide di Apple.

Non capisco perché qualcuno con una mente sana renderebbe un'impostazione del sistema dipende da una grafica; ma ho appena provato ed ha funzionato.

Ecco il posto che mi ha insegnato, dopo una rapida ricerca non ho visto questa risposta di cui sopra, pensato che sarebbe utile a qualcuno.

S

ho ottenuto in stesso problema quando respinge vista con dismissViewControllerAnimated a Cordova plugin. Ho modificato il codice per il metodo singingAtom viewWillAppear in MainViewController, che ha ottenuto ridimensionata dopo che respinge vista modale:

- (void)viewWillAppear:(BOOL)animated
    {
    CGRect appFrame = [[UIScreen mainScreen] applicationFrame];
    UIDeviceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    if (UIDeviceOrientationLandscapeLeft == orientation || 
        UIDeviceOrientationLandscapeRight == orientation)
            {
            if (appFrame.size.width < appFrame.size.height)
                {
                appFrame = CGRectMake(appFrame.origin.y, appFrame.origin.x, appFrame.size.height, appFrame.size.width);
                }
        }
    self.view.frame = appFrame;
    [super viewWillAppear:animated];
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top