dans l'application iPhone Comment détecter la résolution d'écran de l'appareil

130

Dans l'application iPhone, lors de l'exécution de l'application sur l'appareil Comment détecter la résolution d'écran de l'appareil sur lequel l'application s'exécute?

ios
la source

Réponses:

349
CGRect screenBounds = [[UIScreen mainScreen] bounds];

Cela vous donnera la résolution entière de l'écran en points, donc ce serait généralement 320x480 pour les iPhones. Même si l'iPhone4 a une taille d'écran beaucoup plus grande, iOS restitue 320x480 au lieu de 640x960. Ceci est principalement dû à la rupture des anciennes applications.

CGFloat screenScale = [[UIScreen mainScreen] scale];

Cela vous donnera l'échelle de l'écran. Pour tous les appareils qui n'ont pas d'écrans Retina, cela renverra un 1.0f, tandis que les appareils Retina Display donneront un 2.0f et l'iPhone 6 Plus (Retina HD) donnera un 3.0f.

Maintenant, si vous souhaitez obtenir la largeur et la hauteur des pixels de l'écran de l'appareil iOS, il vous suffit de faire une chose simple.

CGSize screenSize = CGSizeMake(screenBounds.size.width * screenScale, screenBounds.size.height * screenScale);

En multipliant par l'échelle de l'écran, vous obtenez la résolution réelle en pixels.

Une bonne lecture sur la différence entre les points et les pixels dans iOS peut être lue ici .

EDIT: (Version pour Swift)

let screenBounds = UIScreen.main.bounds
let screenScale = UIScreen.main.scale
let screenSize = CGSize(width: screenBounds.size.width * screenScale, height: screenBounds.size.height * screenScale)
James Linnell
la source
4
Sauf que ce n'est pas tout à fait la résolution du «pixel réel» dans le cas de l'iPhone 6 Plus. C'est la résolution à laquelle tout est rendu (sauf OpenGL) dans le code, avec une échelle 3x, mais qui est ensuite sous-échantillonnée en interne à la résolution native de l'écran de 1080 x 1920. Une des nombreuses bonnes explications sur le lien
RobP
Malheureusement, cela ne vous donnera pas les "vraies" dimensions des éléments à l'écran, puisque les notions d'Apple de "points" et "d'échelle" ne sont qu'une approximation. (Voir les spécifications sur iPhone vs iPad vs iPad mini.) Probablement pour réduire le nombre de combinaisons différentes qui existent. Je pense que l'iPhone 6 Plus est particulièrement loin.
ToolmakerSteve
En fait 6+ pas trop loin: hauteur 736 pts / 160 (pt / in) = 4,60 "hauteur logique; hauteur réelle de l'écran est 4,79"; Erreur de 5%. L'iPad est beaucoup plus éloigné: hauteur 1024 pts / 160 (pt / in) = 6,40 "hauteur logique; hauteur réelle de l'écran est 7,76"; 20% d'erreur. iPad mini est OK; il correspond à la densité d'origine de l'iPhone. Dans la plupart des cas, cela signifie qu'il faut tester le logiciel iPad sur iPad mini (pour s'assurer qu'il est utilisable), puis ignorer simplement le fait que la plupart des iPad agrandissent l'image de 20% (par rapport à l'iPhone ou à l'iPad mini).
ToolmakerSteve
1
@RobP alors comment résolvez-vous cela pour l'iPhone 6 Plus?
Crashalot
1
@Crashalot ne sais pas ce que vous entendez par «résoudre ça»? Cela dépend de l'objectif que vous avez en tête lorsque vous obtenez la résolution d'écran. En ce qui concerne les programmeurs, la réponse de Jman012 est correcte et vous effectuez un rendu dans un espace de 1242x2208 ou 2208x1242. Heck, c'est même la résolution à laquelle nous fournissons les images de lancement. Le fait que le matériel échantillonne ensuite cette image et l'affiche sur un écran physique avec un nombre de pixels plus petit serait un `` détail d'implémentation '' dont notre code ne devrait même pas être conscient.
RobP
21

La classe UIScreen vous permet de trouver la résolution de l'écran en points et pixels.

Les résolutions d'écran sont mesurées en points ou pixels. Il ne doit jamais être confondu avec la taille de l'écran. Une taille d'écran plus petite peut avoir une résolution plus élevée.

'Bounds.width' de UIScreen renvoie la taille rectangulaire en points entrez la description de l'image ici

'NativeBounds.width' de UIScreen renvoie une taille rectangulaire en pixels. Cette valeur est détectée comme PPI (point par pouce). Affiche la netteté et la clarté de l'image sur un appareil. entrez la description de l'image ici

Vous pouvez utiliser la classe UIScreen pour détecter toutes ces valeurs.

Swift3

// Normal Screen Bounds - Detect Screen size in Points.
let width = UIScreen.main.bounds.width
let height = UIScreen.main.bounds.height
print("\n width:\(width) \n height:\(height)")

// Native Bounds - Detect Screen size in Pixels.
let nWidth = UIScreen.main.nativeBounds.width
let nHeight = UIScreen.main.nativeBounds.height
print("\n Native Width:\(nWidth) \n Native Height:\(nHeight)")

Console

width:736.0 
height:414.0

Native Width:1080.0 
Native Height:1920.0

Swift 2.x

//Normal Bounds - Detect Screen size in Points.
    let width  = UIScreen.mainScreen.bounds.width
    let height = UIScreen.mainScreen.bounds.height

// Native Bounds - Detect Screen size in Pixels.
    let nWidth  = UIScreen.mainScreen.nativeBounds.width
    let nHeight = UIScreen.mainScreen.nativeBounds.height

Objectif c

// Normal Bounds - Detect Screen size in Points.
CGFloat *width  = [UIScreen mainScreen].bounds.size.width;
CGFloat *height = [UIScreen mainScreen].bounds.size.height;

// Native Bounds - Detect Screen size in Pixels.
CGFloat *width  = [UIScreen mainScreen].nativeBounds.size.width
CGFloat *height = [UIScreen mainScreen].nativeBounds.size.width
Taimur Ajmal
la source
8

Utilisez-le dans App Delegate: j'utilise le storyboard

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {

    CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;

    //----------------HERE WE SETUP FOR IPHONE 4/4s/iPod----------------------

    if(iOSDeviceScreenSize.height == 480){          

        UIStoryboard *iPhone35Storyboard = [UIStoryboard storyboardWithName:@"iPhone" bundle:nil];

        // Instantiate the initial view controller object from the storyboard
        UIViewController *initialViewController = [iPhone35Storyboard instantiateInitialViewController];

        // Instantiate a UIWindow object and initialize it with the screen size of the iOS device
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

        // Set the initial view controller to be the root view controller of the window object
        self.window.rootViewController  = initialViewController;

        // Set the window object to be the key window and show it
        [self.window makeKeyAndVisible];

        iphone=@"4";

        NSLog(@"iPhone 4: %f", iOSDeviceScreenSize.height);

    }

    //----------------HERE WE SETUP FOR IPHONE 5----------------------

    if(iOSDeviceScreenSize.height == 568){

        // Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone4
        UIStoryboard *iPhone4Storyboard = [UIStoryboard storyboardWithName:@"iPhone5" bundle:nil];

        // Instantiate the initial view controller object from the storyboard
        UIViewController *initialViewController = [iPhone4Storyboard instantiateInitialViewController];

        // Instantiate a UIWindow object and initialize it with the screen size of the iOS device
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

        // Set the initial view controller to be the root view controller of the window object
        self.window.rootViewController  = initialViewController;

        // Set the window object to be the key window and show it
        [self.window makeKeyAndVisible];

         NSLog(@"iPhone 5: %f", iOSDeviceScreenSize.height);
        iphone=@"5";
    }

} else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    // NSLog(@"wqweqe");
    storyboard = [UIStoryboard storyboardWithName:@"iPad" bundle:nil];

}

 return YES;
 }
ios_av
la source
5

Pour iOS 8, nous pouvons simplement utiliser ceci [UIScreen mainScreen].nativeBounds, comme ça:

- (NSInteger)resolutionX
{
    return CGRectGetWidth([UIScreen mainScreen].nativeBounds);
}

- (NSInteger)resolutionY
{
    return CGRectGetHeight([UIScreen mainScreen].nativeBounds);
}
boog
la source
4

Consultez la référence UIScreen: http://developer.apple.com/library/ios/#documentation/uikit/reference/UIScreen_Class/Reference/UIScreen.html

if([[UIScreen mainScreen] respondsToSelector:NSSelectorFromString(@"scale")])
{
    if ([[UIScreen mainScreen] scale] < 1.1)
        NSLog(@"Standard Resolution Device");

    if ([[UIScreen mainScreen] scale] > 1.9)
        NSLog(@"High Resolution Device");
}
Constantin
la source
merci pour la réponse si je le mets dans NSLog (@ "% d", [[UIScreen mainScreen] échelle]); il donne 0 ...... et NSLog (@ "% @", [[UIScreen mainScreen] échelle]); il ne donne aucun Pls laissez-moi savoir comment obtenir une résolution d'écran ou comment tester s'il donne une résolution correcte tout en l'exécutant sur un simulateur
ios
2
essayezNSLog(@"%f",[[UIScreen mainScreen] scale]);
vikingosegundo
0

Utilisez ce code, il vous aidera à obtenir la résolution d'écran de tout type d'appareil

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