IPhone / IPad: Comment obtenir la largeur de l'écran par programmation?

83

Salut, je me demande s'il existe un moyen d'obtenir la largeur par programme.

Je cherche quelque chose d'assez général pour accueillir iphone 3gs, iphone 4, ipad. En outre, la largeur doit changer en fonction du fait que l'appareil est en mode portrait ou paysage (pour ipad).

Quelqu'un sait comment faire ça ?? Je cherche depuis un moment ... merci!

Foreyez
la source
Vous recherchez la largeur de l'écran, la largeur de l'espace d'application disponible (sans la barre système) ou la largeur d'une vue particulière?
VdesmedT
hrmm je ne suis pas sûr. Je suppose que je voulais juste la largeur de l'appareil (c'est-à-dire dans l'ipad 768 pour la largeur du portrait et 1024 pour la largeur du paysage) mais self.view.bounds semblait satisfaire cela. voir mon commentaire ci
foreyez
Consultez cette réponse plus complète qui prend en compte l'orientation de l'appareil.
Drew Stephens
@DrewStephens Voir ma réponse ci-dessous qui prend en compte l'orientation et ne comporte que 3 lignes de code: D.
memmons

Réponses:

204

Jetez un œil à UIScreen .

par exemple.

CGFloat width = [UIScreen mainScreen].bounds.size.width;

Jetez un œil à la propriété applicationFrame si vous ne voulez pas que la barre d'état soit incluse (n'affectera pas la largeur).

MISE À JOUR: Il s'avère que UIScreen (-bounds ou -applicationFrame) ne prend pas en compte l'orientation actuelle de l'interface. Une approche plus correcte serait de demander à votre UIView ses limites - en supposant que cet UIView a été automatiquement tourné par son contrôleur de vue.

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    CGFloat width = CGRectGetWidth(self.view.bounds);
}

Si la vue n'est pas pivotée automatiquement par le contrôleur de vue, vous devrez vérifier l'orientation de l'interface pour déterminer quelle partie des limites de la vue représente la «largeur» et la «hauteur». Notez que la propriété frame vous donnera le rect de la vue dans l'espace de coordonnées de UIWindow qui (par défaut) ne prendra pas en compte l'orientation de l'interface.

Alan Rogers
la source
3
en fait, cela ne fonctionne pas lorsque l'ipad est orienté paysage .. c'est-à-dire que si mon simulateur fonctionne en paysage, il renvoie toujours 768 (au lieu de 1024). pensez-vous que je devrais avoir une instruction if qui vérifie l'orientation dans ce cas ou y a-t-il un meilleur moyen d'obtenir la largeur?
foreyez
Merde - on dirait que vous avez raison; J'ai mis à jour ma réponse avec d'autres idées.
Alan Rogers
J'ai fini par utiliser simplement "CGFloat width = CGRectGetWidth (self.view.bounds);" dans ma méthode (pas besoin de didRotateFromInterfaceOrientation) ... donc au moins self.view.bounds prend en compte l'orientation. Merci!!
foreyez
5
pour d'autres qui ont peut-être trébuché sur ce post plus ancien, j'ai trouvé que self.view.bounds n'est entièrement précis qu'à partir de didRotateFromInterfaceOrientation. Il sera également précis dans viewDidLoad et viewWillAppear si la vue est affichée dans son orientation cible initiale (comme spécifié dans IB). Si la vue est affichée dans une orientation différente de celle ciblée, viewDidLoad (et viewWillAppear) est appelé avant didRotateFromInterfaceOrientation et view.bounds sera incorrect
rimsky
Dans le cas d'iOS 6, et lorsque nous utilisons des contrôleurs modaux, le didRotateFromInterfaceOrientation ne sera pas appelé
Krishnan
12
CGRect screen = [[UIScreen mainScreen] bounds];
CGFloat width = CGRectGetWidth(screen);
//Bonus height.
CGFloat height = CGRectGetHeight(screen);

la source
10
ne tient pas compte de l'orientation
rimsky
6

Cela peut être fait en 3 lignes de code :

// grab the window frame and adjust it for orientation
UIView *rootView = [[[UIApplication sharedApplication] keyWindow] 
                                   rootViewController].view;
CGRect originalFrame = [[UIScreen mainScreen] bounds];
CGRect adjustedFrame = [rootView convertRect:originalFrame fromView:nil];
Memmons
la source
3
c'est proche, mais si un UIAlertView est affiché, ce sera la fenêtre clé et sa propriété rootViewController sera nulle
matt bezark
@mattbezark Vrai. Je considère cependant que c'est un cas d'angle. Il existe une alternative pour obtenir la vue racine - pas aussi claire que celle-ci, mais je posterai l'alternative au cas où quelqu'un serait intéressé.
memmons
@memmons un peu en retard à la fête mais je serais intéressé par votre solution alternative :)
alexgophermix
0

À partir d'iOS 9.0, il n'y a aucun moyen d'obtenir l'orientation de manière fiable. C'est le code que j'ai utilisé pour une application que je conçois uniquement pour le mode portrait, donc si l'application est ouverte en mode paysage, elle sera toujours précise:

screenHeight = [[UIScreen mainScreen] bounds].size.height;
screenWidth = [[UIScreen mainScreen] bounds].size.width;
if (screenWidth > screenHeight) {
    float tempHeight = screenWidth;
    screenWidth = screenHeight;
    screenHeight = tempHeight;
}
Policier
la source
0

Utilisez ce code, cela vous aidera

[[UIScreen mainScreen] bounds].size.height
[[UIScreen mainScreen] bounds].size.width
Shahzaib Maqbool
la source
0

utilisation:

NSLog(@"%f",[[UIScreen mainScreen] bounds].size.width) ;
pseudo
la source
-2

Voici un moyen Swift d'obtenir les tailles d'écran, cela prend également en compte l'orientation actuelle de l'interface:

var screenWidth: CGFloat {
    if UIInterfaceOrientationIsPortrait(screenOrientation) {
        return UIScreen.mainScreen().bounds.size.width
    } else {
        return UIScreen.mainScreen().bounds.size.height
    }
}
var screenHeight: CGFloat {
    if UIInterfaceOrientationIsPortrait(screenOrientation) {
        return UIScreen.mainScreen().bounds.size.height
    } else {
        return UIScreen.mainScreen().bounds.size.width
    }
}
var screenOrientation: UIInterfaceOrientation {
    return UIApplication.sharedApplication().statusBarOrientation
}

Ceux-ci sont inclus en tant que fonction standard dans:

https://github.com/goktugyil/EZSwiftExtensions

Esqarrouth
la source