Puoi usare qualcosa di simile UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation)per determinare l'orientamento e quindi utilizzare le dimensioni di conseguenza.
TUTTAVIA, durante un cambio di orientamento come in UIViewController
- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
duration:(NSTimeInterval)duration
Usa l'orientamento passato toInterfaceOrientationpoiché lo statusBarOrientation di UIApplication punterà ancora al vecchio orientamento poiché non è ancora cambiato (poiché sei all'interno di un willgestore di eventi).
Sommario
Ci sono diversi post correlati a questo, ma ognuno di essi sembra indicare che devi:
- Guarda
[[UIScreen mainScreen] bounds]per ottenere le dimensioni,
- Controlla l'orientamento in cui ti trovi e
- Considera l'altezza della barra di stato (se visualizzata)
Collegamenti
Codice di lavoro
Di solito non vado così lontano, ma hai suscitato il mio interesse. Il codice seguente dovrebbe fare il trucco. Ho scritto una categoria su UIApplication. Ho aggiunto metodi di classe per ottenere currentSize o la dimensione in un determinato orientamento, che è ciò che chiameresti in UIViewController willRotateToInterfaceOrientation:duration:.
@interface UIApplication (AppDimensions)
+(CGSize) currentSize;
+(CGSize) sizeInOrientation:(UIInterfaceOrientation)orientation;
@end
@implementation UIApplication (AppDimensions)
+(CGSize) currentSize
{
return [UIApplication sizeInOrientation:[UIApplication sharedApplication].statusBarOrientation];
}
+(CGSize) sizeInOrientation:(UIInterfaceOrientation)orientation
{
CGSize size = [UIScreen mainScreen].bounds.size;
UIApplication *application = [UIApplication sharedApplication];
if (UIInterfaceOrientationIsLandscape(orientation))
{
size = CGSizeMake(size.height, size.width);
}
if (application.statusBarHidden == NO)
{
size.height -= MIN(application.statusBarFrame.size.width, application.statusBarFrame.size.height);
}
return size;
}
@end
Per utilizzare il codice semplice chiamata [UIApplication currentSize]. Inoltre, ho eseguito il codice sopra, quindi so che funziona e riporta le risposte corrette in tutti gli orientamenti. Notare che fattore nella barra di stato. È interessante notare che ho dovuto sottrarre il MIN dell'altezza e della larghezza della barra di stato.
Spero che questo ti aiuti. : D
Altri pensieri
Potresti ottenere le dimensioni guardando la rootViewControllerproprietà di UIWindow . L'ho esaminato in passato e riporta allo stesso modo le stesse dimensioni sia in verticale che in orizzontale, tranne per il fatto che riporta una trasformazione di rotazione:
(gdb) po [[[[UIApplication sharedApplication] keyWindow] rootViewController] view]
<UILayoutContainerView: 0xf7296f0; frame = (0 0; 320 480); trasformare = [0, -1, 1, 0, 0, 0]; autoresize = W + H; layer = <CALayer: 0xf729b80 >>
(gdb) po [[[[UIApplication sharedApplication] keyWindow] rootViewController] view]
<UILayoutContainerView: 0xf7296f0; frame = (0 0; 320 480); autoresize = W + H; layer = <CALayer: 0xf729b80 >>
Non sei sicuro di come funzioni la tua app, ma se non stai utilizzando un controller di navigazione di qualche tipo, potresti avere una vista UIV sotto la tua vista principale con l'altezza / larghezza massima del genitore e cresce / si restringe con il genitore. Poi si potrebbe fare: [[[[[[[UIApplication sharedApplication] keyWindow] rootViewController] view] subviews] objectAtIndex:0] frame]. Sembra piuttosto intenso su una riga, ma hai un'idea.
Tuttavia ... Sarebbe comunque meglio eseguire i 3 passaggi precedenti sotto il riepilogo. Inizia a fare scherzi con UIWindows e scoprirai cose strane, come mostrare un UIAlertView cambierà la finestra dei tasti di UIApplication in modo che punti a una nuova UIWindow creata da UIAlertView. Chi lo sapeva? L'ho fatto dopo aver trovato un bug affidandomi a keyWindow e dopo aver scoperto che era cambiato così!