Question Comment obtenir la largeur et la hauteur de l'écran dans iOS?


Comment peut-on obtenir les dimensions de l'écran dans iOS?

Actuellement, j'utilise:

lCurrentWidth = self.view.frame.size.width;
lCurrentHeight = self.view.frame.size.height;

dans viewWillAppear: et willAnimateRotationToInterfaceOrientation:duration:

La première fois que je reçois la taille de l'écran entier. La deuxième fois que je reçois l'écran moins la barre de navigation.


461
2018-04-15 13:46


origine


Réponses:


Comment peut-on obtenir les dimensions de l'écran dans iOS?

Le problème avec le code que vous avez posté est que vous comptez sur la taille de la vue pour correspondre à celle de l'écran, et comme vous avez vu que ce n'est pas toujours le cas. Si vous avez besoin de la taille de l'écran, vous devriez regarder l'objet qui représente l'écran lui-même, comme ceci:

CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenWidth = screenRect.size.width;
CGFloat screenHeight = screenRect.size.height;

Mise à jour pour la vue partagée: Dans les commentaires, Dmitry a demandé:

Comment puis-je obtenir la taille de l'écran dans la vue fractionnée?

Le code indiqué ci-dessus indique la taille de l'écran, même en mode écran partagé. Lorsque vous utilisez le mode écran partagé, la fenêtre de votre application change. Si le code ci-dessus ne vous donne pas les informations attendues, alors, comme pour l'OP, vous regardez le mauvais objet. Dans ce cas, cependant, vous devriez regarder la fenêtre au lieu de l'écran, comme ceci:

CGRect windowRect = self.view.window.frame;
CGFloat windowWidth = windowRect.size.width;
CGFloat windowHeight = windowRect.size.height;

1012
2018-04-15 14:26



Attention, [UIScreen mainScreen] contient également une barre d’état si vous souhaitez récupérer le cadre de votre application (à l’exclusion de la barre d’état).

+ (CGFloat) window_height   {
    return [UIScreen mainScreen].applicationFrame.size.height;
}

+ (CGFloat) window_width   {
    return [UIScreen mainScreen].applicationFrame.size.width;
}

61
2017-11-22 12:54



J'ai utilisé ces méthodes avant:

- (CGRect)getScreenFrameForCurrentOrientation {
    return [self getScreenFrameForOrientation:[UIApplication sharedApplication].statusBarOrientation];
}

- (CGRect)getScreenFrameForOrientation:(UIInterfaceOrientation)orientation {

    CGRect fullScreenRect = [[UIScreen mainScreen] bounds];

    // implicitly in Portrait orientation.
    if (UIInterfaceOrientationIsLandscape(orientation)) {
      CGRect temp = CGRectZero;
      temp.size.width = fullScreenRect.size.height;
      temp.size.height = fullScreenRect.size.width;
      fullScreenRect = temp;
    }

    if (![[UIApplication sharedApplication] statusBarHidden]) {
      CGFloat statusBarHeight = 20; // Needs a better solution, FYI statusBarFrame reports wrong in some cases..
      fullScreenRect.size.height -= statusBarHeight;
    }

    return fullScreenRect;
} 

39
2017-12-14 20:14



J'ai traduit certaines des réponses à Objective-C ci-dessus en code Swift. Chaque traduction est suivie d'une référence à la réponse originale.

Réponse principale

let screen = UIScreen.main.bounds
let screenWidth = screen.size.width
let screenHeight = screen.size.height

Réponse de fonction simple

func windowHeight() -> CGFloat {
    return UIScreen.mainScreen().applicationFrame.size.height
}

func windowWidth() -> CGFloat {
    return UIScreen.mainScreen().applicationFrame.size.width
}

Réponse à l'orientation du périphérique

var screenHeight : CGFloat
let statusBarOrientation = UIApplication.sharedApplication().statusBarOrientation
// it is important to do this after presentModalViewController:animated:
if (statusBarOrientation != UIInterfaceOrientation.Portrait
    && statusBarOrientation != UIInterfaceOrientation.PortraitUpsideDown){
    screenHeight = UIScreen.mainScreen().applicationFrame.size.width
} else {
    screenHeight = UIScreen.mainScreen().applicationFrame.size.height
}

Réponse de journal

let screenWidth = UIScreen.mainScreen().bounds.size.width
let screenHeight = UIScreen.mainScreen().bounds.size.height
println("width: \(screenWidth)")
println("height: \(screenHeight)")

38
2017-08-06 16:27



Je me rends compte que c'est un ancien post, mais parfois je le trouve utile pour #define des constantes comme celles-ci, donc je n'ai pas à m'en soucier:

#define DEVICE_SIZE [[[[UIApplication sharedApplication] keyWindow] rootViewController].view convertRect:[[UIScreen mainScreen] bounds] fromView:nil].size

La constante ci-dessus doit renvoyer la taille correcte, quelle que soit l'orientation du périphérique. Ensuite, obtenir les dimensions est aussi simple que:

lCurrentWidth = DEVICE_SIZE.width;
lCurrentHeight = DEVICE_SIZE.height;

15
2018-03-29 17:06



Il est très, très facile d'obtenir la taille de votre appareil aussi bien que prendre en compte l'orientation:

// 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];

13
2017-10-04 16:13



Nous devons également considérer l'orientation de l'appareil:

CGFloat screenHeight;
// it is important to do this after presentModalViewController:animated:
if ([[UIApplication sharedApplication] statusBarOrientation] == UIDeviceOrientationPortrait || [[UIApplication sharedApplication] statusBarOrientation] == UIDeviceOrientationPortraitUpsideDown){
    screenHeight = [UIScreen mainScreen].applicationFrame.size.height;
}
else{
    screenHeight = [UIScreen mainScreen].applicationFrame.size.width;
}

9
2018-05-17 11:34



NSLog(@"%.0f", [[UIScreen mainScreen] bounds].size.width);
NSLog(@"%.0f", [[UIScreen mainScreen] bounds].size.height);

8
2017-11-16 12:52



Ici j'ai mis à jour pour swift 3

applicationFrame  obsolète à partir d'iOS 9

Dans swift three ils ont supprimé () et ils ont changé peu de convention de nommage, vous pouvez vous référer ici Lien

func windowHeight() -> CGFloat {
    return UIScreen.main.bounds.size.height
}

func windowWidth() -> CGFloat {
    return UIScreen.main.bounds.size.width
}

4
2017-11-18 22:47



Si vous souhaitez une largeur / hauteur d'écran indépendamment de l'orientation du périphérique (idéal pour dimensionner les contrôleurs de vue Portrait uniquement en cours de lancement à partir d'orientations paysagères):

CGFloat screenWidthInPoints = [UIScreen mainScreen].nativeBounds.size.width/[UIScreen mainScreen].nativeScale;
CGFloat screenHeightInPoints = [UIScreen mainScreen].nativeBounds.size.height/[UIScreen mainScreen].nativeScale;

[UIScreen mainScreen] .nativeBounds <- De la documentation - Le rectangle englobant de l'écran physique, mesuré en pixels. Ce rectangle est basé sur le périphérique dans une orientation portrait. Cette valeur ne change pas lorsque l'appareil tourne.


3
2017-11-24 04:43



Voici un moyen rapide d'obtenir des tailles d'écran:

print(screenWidth)
print(screenHeight)

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


2
2018-04-04 05:17