6
votes

identifier les iphones 3, 4 et 5 dans le même #define

J'utilise la ligne suivante dans mes constantes différencier les périphériques et récupérer le numéro de l'appareil. Quel est le moyen approprié d'identifier l'iPhone 5 et de le garder toujours dans un format d'une ligne?

#define iPhoneType [[UIScreen mainScreen] scale]==2 || [UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad ? @"4" : @"3"


9 commentaires

Pourquoi ne pas écrire une méthode et l'utiliser, ou appelez-le dans le #define?


Stackoverflow.com/questions/1108859 / ...


Quel est votre objectif ici? La ligne que vous avez postée signifie "S'il s'agit d'un périphérique de rétine ou d'un iPad, renvoie 4 autrement retour 3". Qu'est-ce que ça veut dire? Vous devez clarifier votre question avec plus de détails sur la valeur que vous souhaitez revenir pour quels cas.


Je veux le garder à une ligne. Si iPhone 3 retour @ "3", si iPhone 4 ou iPad retourner @ "4" si iPhone 5 retour @ "5"


Cela semble être la mauvaise chose à tester. Que se passe-t-il lorsque l'iPhone 6 est libéré? Vous devez probablement être testé pour la fonctionnalité spécifique dont vous avez besoin, telles que l'affichage de la rétine ou la résolution de la caméra.


@Exec_bad_access maintenant je suis plus confus. Pourquoi traiteriez-vous tous les iPad et l'iPhone 4 (qu'en est-il des 4s?) La même chose? Qu'en est-il des touches iPod? Quel est votre véritable objectif? Que faites-vous avec les 3, 4 et 5 que vous essayez d'obtenir? Il y a probablement un meilleur moyen de faire ce dont vous avez besoin.


Les numéros sont attachés à une URL afin d'obtenir la bonne image pour l'appareil. En ce moment, je traite des iPads les mêmes que l'iPhone 4 Res (je sais que ce n'est pas correct, mais ce sont les résolutions fournies par le client)


@Exec_bad_access j'ai édité votre question pour clarifier les exigences. Sont-ils correct? Est-ce ce que vous voulez vraiment?


Exactement ce que je veux, merci. Votre réponse a l'air bien, je vais vérifier quand je suis sur mon Mac.


5 Réponses :


0
votes

Le meilleur moyen d'identifier les différents périphériques iOS de manière programmatique est leur résolution de l'écran. J'ai fait la même chose dans mon application, cela fonctionne bien. Veuillez vous référer mon code.

- (NSString *) getDeviceScreenWidth
{
    CGRect screenBounds = [[UIScreen mainScreen] bounds];
    CGFloat width = CGRectGetWidth(screenBounds);
    NSNumber* number = [NSNumber numberWithFloat:width];
    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
    [numberFormatter setNumberStyle:kCFNumberFormatterDecimalStyle];
    NSString* commaString = [numberFormatter stringForObjectValue:number];
    NSString *screenWidth = [NSString stringWithFormat:@"%@",commaString];
    NSLog(@"screen Width is: %@",screenWidth);
    return screenWidth;
}

- (NSString *) getDeviceScreenHeight
{
    CGRect screenBounds = [[UIScreen mainScreen] bounds];
    CGFloat height = CGRectGetHeight(screenBounds);
    NSNumber* number = [NSNumber numberWithFloat:height];
    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
    [numberFormatter setNumberStyle:kCFNumberFormatterDecimalStyle];
    NSString* commaString = [numberFormatter stringForObjectValue:number];
    NSString *screenHeight = [NSString stringWithFormat:@"%@",commaString];
    NSLog(@"screen height is: %@",screenHeight);
    return screenHeight;
}


9 commentaires

C'est loin de la "meilleure façon" d'identifier différents appareils iOS. Les iPhone 5 et 5ème Gen IPod Touch ont la même résolution. Chaque iPhone avant l'iPhone 5 et chaque iPod touch avant que le 5ème général ait la même résolution. Chaque iPad donnera la même largeur et la même hauteur (puisqu'ils sont mesurés en points).


Selon la question, j'ai raison parce que la question est d'identifier l'iPhone 3,4,5 non iPod et iPad. Mais pour plus d'informations, le code ci-dessus fonctionne pour iPhone et iPad dans tous les cas de l'ancien à la dernière nouvelle.


@Pranav Il y a beaucoup de façons de le faire, tels que la manière dont Dipen Panchasara l'a fait, et rmaddy Le premier commentaire est également correct. Ceci est peut-être pourquoi vous avez reçu les 2 bowvotes. En outre, ce n'est pas le cas où près de 1 ligne comme l'utilisateur a demandé, donc il ne répond pas à la question.


@Popeye merci ..non un comme vous ici qui clarifiez .. encore merci..some d'ici sont montrant leur colère par les bowvotes et certains d'ici sont par des bowvotes techniquement ..


Mais si vous aimez ma réponse et si c'est possible, ce qui est possible que de me rendre heureux en optimisant cette réponse.


@Pranav Il est toujours bon de laisser une raison de la Downvote afin que vous puissiez améliorer / corriger ou simplement y travailler à l'avenir, parfois même s'il peut être difficile de donner une raison lorsque des réponses ou des questions ne sont pas très bonnes et certaines vont simplement signaler comme non une réponse ou quelque chose comme ça. Pour être honnête, votre réponse m'a confondu un peu, et je ne comprends pas pourquoi vous le feriez de cette façon lorsque vous pouviez le faire Dipen Panchasara Way et c'est tellement plus simple. Je ne sais pas si cela mérite un bowvote, mais je sais que je ne peux pas me ramener à une upvote désolé.


@ Popeye..matanks..ettez simplement Kissing pour UPVote..today J'ai appris une nouvelle chose pour identifier différents appareils iOS .. mais pour clarification dans ma réponse, je reçois la hauteur de l'écran et la largeur du format de la chaîne ...


@Pranav La question originale n'a aucun sens, cela ne peut vraiment pas être très bien répondu, peu importe quoi. Au minimum, la question semble être de déterminer quel périphérique l'utilisateur a. Votre réponse ne fait pas ça. Toute votre réponse est fournie deux méthodes très compliquées qui renvoient la largeur de l'écran actuelle ou la hauteur en tant que chaînes. Les iPhone 3, 3G, 4, 4s et 5 ont tous la même largeur d'écran. Tous les iPhones sauf l'iPhone 5 auront la même hauteur. Alors, comment votre réponse aide-t-elle à résoudre la question originale? Et votre réponse donne différents résultats dans différents pays.


@RMADDY OUI..MANKS RMADDY..NICE Pour discuter avec vous..et aussi merci Popeye..plusez-moi en contact avec moi sur Stackoverflow .... Merci beaucoup



2
votes

Définissez les constantes suivantes dans .pch code> fichier de votre projet xxx pré>

Vérifiez maintenant le type de périphérique p>

if(IS_IPAD)
    NSLog(@"IPAD");
else if(IS_IPHONE5)
    NSLog(@"IPHONE 5");
else
    NSLog(@"IPHONE");


3 commentaires

La macro IS_IPHONE5 est incorrecte. La taille de l'écran sur l'iPhone 5 est 320x568. Puisque vous vérifiez déjà la hauteur étant> = 568, il n'est pas question de vérifier également s'il est> = 1136. De plus, cette macro retournera true sur tous les iPad car leurs hauteurs sont de 768.


@RMADDY STI Pour l'affichage de la rétine et son par erreur, j'ai besoin de comparer la largeur de l'écran de paysage. Merci pour Pin me dirigeant.!


La rétine ou non, la limite de l'écran est rapportée en points, pas de pixels. Donc, vous n'obtiendrez jamais 1136 comme la hauteur. Vous obtiendrez 480 pour 3,5 "périphériques et 568 pour les appareils 4". Et une macro nommée is_iphone5 ne doit pas nécessiter que vous appelez d'abord d'autres macro.



3
votes

Selon votre question, je suppose que vous souhaitez identifier le périphérique matériel, pas la version iOS. xxx

importer ces fonctions dans le fichier .pch, vous êtes libre d'appeler ceci Une doublure: xxx

Ça fonctionne pour n'importe quel périphérique. Voir uidevice-matériel.m pour une liste des chaînes retournées.


0 commentaires

0
votes

En tant qu'échantillon, vous pouvez trouver ce code dans COCOS2D Cadre :

-(NSInteger) runningDevice
{
    NSInteger ret=-1;

#ifdef __CC_PLATFORM_IOS

    if( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    {
        ret = (CC_CONTENT_SCALE_FACTOR() == 2) ? kCCDeviceiPadRetinaDisplay : kCCDeviceiPad;
    }
    else if( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone )
    {
        // From http://stackoverflow.com/a/12535566
        BOOL isiPhone5 = CGSizeEqualToSize([[UIScreen mainScreen] preferredMode].size,CGSizeMake(640, 1136));

        if( CC_CONTENT_SCALE_FACTOR() == 2 ) {
            ret = isiPhone5 ? kCCDeviceiPhone5RetinaDisplay : kCCDeviceiPhoneRetinaDisplay;
        } else
            ret = isiPhone5 ? kCCDeviceiPhone5 : kCCDeviceiPhone;
    }

#elif defined(__CC_PLATFORM_MAC)

    // XXX: Add here support for Mac Retina Display
    ret = kCCDeviceMac;

#endif // __CC_PLATFORM_MAC

    return ret;
}


0 commentaires

2
votes

En supposant que les exigences mises à jour sont correctes, les éléments suivants doivent fonctionner:

#define iPhoneType (fabs((double)[UIScreen mainScreen].bounds.size.height - (double)568) < DBL_EPSILON) ? @"5" : ([UIScreen mainScreen].scale==2 || UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ? @"4" : @"3")


0 commentaires