Vous pouvez utiliser quelque chose comme UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation)
pour déterminer l'orientation et ensuite utiliser les dimensions en conséquence.
CEPENDANT, lors d'un changement d'orientation comme dans UIViewController de l'
- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
duration:(NSTimeInterval)duration
L'utilisation de l'orientation adoptée en toInterfaceOrientation
depuis le UIApplication de statusBarOrientation sera pointent toujours vers l'ancien orientation, car il n'a pas encore changé (puisque vous êtes à l'intérieur d'un will
gestionnaire d'événement).
Résumé
Il y a plusieurs postes liés à cela, mais chacun d'entre eux semblent indiquer que vous avez à:
- Regardez -
[[UIScreen mainScreen] bounds]
pour obtenir les dimensions,
- Vérifiez que l'orientation que vous êtes, et
- Compte pour la barre d'état de la hauteur (si indiqué)
Liens
Code De Travail
J'ai l'habitude de ne pas aller aussi loin, mais vous a piqué mon intérêt. Le code suivant devrait faire l'affaire. J'ai écrit une Catégorie sur UIApplication. J'ai ajouté les méthodes de la classe pour obtenir le currentSize ou la taille dans une orientation, qui est ce que vous appelez dans UIViewController de l' 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
Pour utiliser le code simple appel [UIApplication currentSize]
. Aussi, j'ai couru le code ci-dessus, donc je sais que ça fonctionne et rapporte les réponses correctes dans toutes les orientations. Notez que le facteur I dans la barre d'état. Il est intéressant de noter que j'avais pour soustraire le MIN de la barre d'état de la hauteur et de la largeur.
Espérons que cette aide. :D
D'autres pensées
Vous pourriez obtenir les dimensions en regardant le UIWindow de l' rootViewController
de la propriété. J'ai regardé dans le passé et de la même manière les rapports les mêmes dimensions à la fois portrait et paysage à l'exception des rapports d'avoir une rotation de transformation:
(gdb) po [[[[UIApplication sharedApplication] keyWindow]
rootViewController]]
<UILayoutContainerView: 0xf7296f0; frame =
(0 0; 320 480); transformation = [0, -1, 1, 0, 0, 0]; autoresize = W+H;
couche = <CALayer: 0xf729b80>>
(gdb) po [[[[UIApplication
sharedApplication] keyWindow] rootViewController]]
<UILayoutContainerView: 0xf7296f0; frame = (0 0; 320 480); autoresize
= W+H; couche = <CALayer: 0xf729b80>>
Vous ne savez pas comment votre application fonctionne, mais si vous n'êtes pas à l'aide d'une manette de navigation d'un certain type, vous pourriez avoir une UIView sous votre vue principale avec le max de hauteur / largeur de parent et augmente / réduit avec les parents. Alors que vous pourriez faire: [[[[[[[UIApplication sharedApplication] keyWindow] rootViewController] view] subviews] objectAtIndex:0] frame]
. Cela semble assez intense sur une seule ligne, mais vous obtenez l'idée.
Cependant... Il serait encore mieux de le faire au-dessus de 3 étapes dans le résumé. Commencer à jouer avec UIWindows et vous verrez des choses bizarres, comme montrer une UIAlertView va changer UIApplication de keywindow au point un nouveau UIWindow que le UIAlertView créé. Qui le savait? Je l'ai fait après avoir trouvé un bug en s'appuyant sur keyWindow et de découvrir que il a changé comme ça!