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 will
gestionnaire 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 rootViewController
proprié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!
applicationFrame
place debounds
(sur UIScreen), vous n'avez pas à soustraire la hauteur de la barre d'état.mainScreen().bounds.size
est devenu dépendant de l'orientation à partir d'iOS 8Ceci est mon code de solution! Cette méthode peut s'ajouter au Categroy de la classe NSObject, ou vous pouvez définir une classe UIViewController personnalisée Top et laisser tous vos autres UIViewControllers l'hériter.
Notez , après IOS8, comme le dit le document Apple de la propriété bounds d'UIScreen :
Donc, pour tenir compte de la compatibilité, nous devons détecter la version IOS et effectuer le changement comme ci-dessous:
la source
Voici une macro pratique:
la source
Dans iOS 8+, vous devez utiliser la
viewWillTransitionToSize:withTransitionCoordinator
méthode:Cela remplace la méthode d'animation obsolète qui ne donnait aucune information sur la taille:
la source
À partir d'iOS 8, les limites de l'écran sont désormais renvoyées correctement pour l'orientation actuelle. Cela signifie qu'un iPad en orientation paysage [UIScreen mainScreen] .bounds renverrait 768 sur iOS <= 7 et 1024 sur iOS 8.
Ce qui suit renvoie la hauteur et la largeur correctes sur toutes les versions publiées.
la source
si vous voulez la taille dépendante de l'orientation et que vous avez une vue, vous pouvez simplement utiliser:
la source
Je l' ai écrit pour la catégorie
UIScreen
, qui fonctionne sur toutes les versions iOS, vous pouvez donc l' utiliser comme ceci:[[UIScreen mainScreen] currentScreenSize]
.la source
Voici un moyen Swift d'obtenir des tailles d'écran dépendant de l'orientation:
Ceux-ci sont inclus en tant que fonction standard dans un de mes projets:
https://github.com/goktugyil/EZSwiftExtensions
la source
la source
Cependant, sur iOS 8.0.2:
la source
utilisez -> setNeedsDisplay () pour la vue que vous souhaitez redimensionner.
la source