6

我一直在常量中使用下一行来区分设备并取回设备的编号。识别 iPhone 5 并仍保持单行格式的合适方法是什么?

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

谢谢

编辑:很多很好的答案,但我的目标是将它保持为所有设备的单行格式。

编辑: 根据评论,这个问题需要澄清一下。以下是要求:

  1. 根据 iOS 设备返回@"3"@"4"或的单行宏。@"5"
  2. 4 英寸设备(当前为 iPhone 5 和第 5 代 iPod touch)应该返回@"5".
  3. 所有 iPad 和所有剩余的视网膜 iPhone 和 iPod touch 都应该返回@"4"
  4. 所有剩余的非视网膜 iPhone 和 iPod touch 应返回@"3"
4

5 回答 5

3

根据您的问题,我假设您要识别硬件设备,而不是 iOS 版本。

/*
Erica Sadun, http://ericasadun.com
iPhone Developer's Cookbook, 6.x Edition
BSD License, Use at your own risk
*/

#include <sys/sysctl.h>

NSString* getSysInfoByName(char* typeSpecifier) {
    size_t size;
    sysctlbyname(typeSpecifier, NULL, &size, NULL, 0);
    char *answer = malloc(size);
    sysctlbyname(typeSpecifier, answer, &size, NULL, 0);
    NSString *results = [NSString stringWithCString:answer encoding: NSUTF8StringEncoding];
    free(answer);
    return results;
}

NSString* platform() {
    return getSysInfoByName("hw.machine");
}

在 .pch 中导入这些函数,然后您可以自由地调用这一行:

BOOL isIphone5 = [platform() hasPrefix:@"iPhone5"];

它适用于任何设备。有关返回的字符串列表,请参阅UIDevice-Hardware.m

于 2013-05-06T07:01:23.760 回答
2

.pch在项目文件中定义以下常量

#define IS_IPHONE5          ([[UIScreen mainScreen] bounds].size.width >= 568 || [[UIScreen mainScreen] bounds].size.height >= 568)?YES:NO
#define IS_IPHONE           (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)?YES:NO
#define IS_IPAD             (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)?YES:NO

#define DeviceType          ((IS_IPAD)?@"IPAD":(IS_IPHONE5)?@"IPHONE 5":@"IPHONE")

现在检查设备类型

NSLog(@"%@ %@",DeviceType,[DeviceType isEqualToString:@"IPAD"]?@"YES":@"NO");

使用以下序列来识别设备类型

if(IS_IPAD)
    NSLog(@"IPAD");
else if(IS_IPHONE5)
    NSLog(@"IPHONE 5");
else
    NSLog(@"IPHONE");
于 2013-05-06T07:00:53.830 回答
2

假设更新后的要求是正确的,以下应该可以工作:

#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")

这将@"5"适用于 4" 屏幕 iPhone 和 iPod touch。这将@"4"适用于所有 iPad 和视网膜 iPhone 和 iPod touch。它将@"3"适用于非视网膜 iPhone 和 iPod touch。

于 2013-05-07T16:05:31.593 回答
0

以编程方式识别不同 iOS 设备的最佳方法是它们的屏幕分辨率。我在我的应用程序中做了同样的事情,它工作得很好。请参考我的代码。

- (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;
}
于 2013-05-06T06:53:47.687 回答
0

作为示例,您可能会在cocos2d 框架中找到此代码:

-(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;
}

我希望这段代码有助于改变你的宏。

于 2013-05-07T09:30:12.950 回答