Vous pouvez utiliser quelque chose comme UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation)pour déterminer l'orientation, puis utiliser les dimensions en conséquence.
TOUTEFOIS, lors d'un changement d'orientation comme dans UIViewController
- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
duration:(NSTimeInterval)duration
Utiliser l'orientation transmise toInterfaceOrientation car statusBarOrientation de l'UIApplication pointera toujours vers l'ancienne orientation car elle n'a pas encore changé (puisque vous êtes dans un willgestionnaire d'événements).
Résumé
Il y a plusieurs articles liés à cela, mais chacun d'eux semble indiquer que vous devez:
- Regarder
[[UIScreen mainScreen] bounds] pour obtenir les dimensions,
- Vérifiez dans quelle orientation vous vous trouvez et
- Tenez compte de la hauteur de la barre d'état (si affichée)
Liens
Code de travail
Je ne vais généralement pas aussi loin, mais vous avez piqué mon intérêt. Le code suivant devrait faire l'affaire. J'ai écrit une catégorie sur UIApplication. J'ai ajouté des méthodes de classe pour obtenir le currentSize ou la taille dans une orientation donnée, ce que vous appelleriez dans 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
Pour utiliser le code appel simple [UIApplication currentSize]. En outre, j'ai exécuté le code ci-dessus, donc je sais que cela fonctionne et renvoie les bonnes réponses dans toutes les orientations. Notez que je prends en compte la barre d'état. Fait intéressant, j'ai dû soustraire le MIN de la hauteur et de la largeur de la barre d'état.
J'espère que cela t'aides. :RÉ
D'autres pensées
Vous pouvez obtenir les dimensions en regardant la rootViewControllerpropriété UIWindow . J'ai regardé cela dans le passé et il rapporte de la même manière les mêmes dimensions en portrait et en paysage, sauf qu'il rapporte avoir une transformation de rotation:
(gdb) po [[[[UIApplication sharedApplication] keyWindow] rootViewController] vue]
<UILayoutContainerView: 0xf7296f0; cadre = (0 0; 320 480); transform = [0, -1, 1, 0, 0, 0]; autoresize = W + H; layer = <CALayer: 0xf729b80 >>
(gdb) po [[[[UIApplication sharedApplication] keyWindow] rootViewController] vue]
<UILayoutContainerView: 0xf7296f0; cadre = (0 0; 320 480); autoresize = W + H; layer = <CALayer: 0xf729b80 >>
Vous ne savez pas comment votre application fonctionne, mais si vous n'utilisez pas de contrôleur de navigation, vous pourriez avoir un UIView sous votre vue principale avec la hauteur / largeur maximale du parent et grandir / rétrécir avec le parent. Ensuite, vous pouvez faire:[[[[[[[UIApplication sharedApplication] keyWindow] rootViewController] view] subviews] objectAtIndex:0] frame] . Cela semble assez intense sur une seule ligne, mais vous voyez l'idée.
Cependant ... Il serait toujours préférable de faire les 3 étapes ci-dessus sous le résumé. Commencez à jouer avec UIWindows et vous découvrirez des trucs étranges, comme montrer un UIAlertView changera la fenêtre de clé d'UIApplication pour pointer vers une nouvelle UIWindow créée par UIAlertView. Qui savait? Je l'ai fait après avoir trouvé un bogue en s'appuyant sur keyWindow et découvert qu'il avait changé comme ça!