1

我已经使用此代码来检测设备是否为 iPhone 5 以设置适当的 UI。

( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )

但是,即使应用程序在 iPhone 5c 中运行,它也会返回 0。我还提到了 如何检测 iPhone 5(宽屏设备)?但更新的代码仍然不起作用。请帮忙。

4

3 回答 3

4

好吧,一开始你也确实把 iPhone5S 认成了 iPhone 5,这不一样。我宁愿使用设备名称,因为您的宏可以随心所欲地扩展。

#import <sys/utsname.h>
NSString* deviceName()
{
    struct utsname systemInfo;
    uname(&systemInfo);
    NSString *result = [NSString stringWithCString:systemInfo.machine
                                          encoding:NSUTF8StringEncoding];
    return result;
}

#define isIPhone5  [deviceName() rangeOfString:@"iPhone5,"].location != NSNotFound
#define isIPhone5S [deviceName() rangeOfString:@"iPhone6,"].location != NSNotFound

设备列表在这里:

/*
 @"i386"      on the simulator
 @"iPod1,1"   on iPod Touch
 @"iPod2,1"   on iPod Touch Second Generation
 @"iPod3,1"   on iPod Touch Third Generation
 @"iPod4,1"   on iPod Touch Fourth Generation
 @"iPod5,1"   on iPod Touch Fifth Generation
 @"iPhone1,1" on iPhone
 @"iPhone1,2" on iPhone 3G
 @"iPhone2,1" on iPhone 3GS
 @"iPad1,1"   on iPad
 @"iPad2,1"   on iPad 2
 @"iPad3,1"   on 3rd Generation iPad
 @"iPad3,2":  on iPad 3(GSM+CDMA)
 @"iPad3,3":  on iPad 3(GSM)
 @"iPad3,4":  on iPad 4(WiFi)
 @"iPad3,5":  on iPad 4(GSM)
 @"iPad3,6":  on iPad 4(GSM+CDMA)
 @"iPhone3,1" on iPhone 4
 @"iPhone4,1" on iPhone 4S
 @"iPhone5,1" on iPhone 5
 @"iPad3,4"   on 4th Generation iPad
 @"iPad2,5"   on iPad Mini
 @"iPhone5,1" on iPhone 5(GSM)
 @"iPhone5,2" on iPhone 5(GSM+CDMA)
 @"iPhone5,3  on iPhone 5c(GSM)
 @"iPhone5,4" on iPhone 5c(GSM+CDMA)
 @"iPhone6,1" on iPhone 5s(GSM)
 @"iPhone6,2" on iPhone 5s(GSM+CDMA)
 */

我的方法与这里的帖子有关,但可以在前缀标题中轻松使用: 检测设备是否为 iPhone 5s


为确保您可以在每个文件中使用此宏,请按照以下步骤操作:创建一个新文件(我们将其称为“Helperfunctions”)

.h 文件包含函数的定义,仅此而已:

NSString* deviceName();

.m 文件包含给定的设备名称代码:

#import "Helperfunctions.h"
#import <sys/utsname.h>

NSString* deviceName()
{
    struct utsname systemInfo;
    uname(&systemInfo);
    NSString *result = [NSString stringWithCString:systemInfo.machine
                                          encoding:NSUTF8StringEncoding];
    return result;
}

在预编译的头文件中,您现在可以添加代码(或添加到另一个文件,您已经在 .pch 中导入,所以它看起来像:

//
//  Prefix header
//
//  The contents of this file are implicitly included at the beginning of every source file.
//

#import <Availability.h>

#ifndef __IPHONE_5_0
#warning "This project uses features only available in iOS SDK 5.0 and later."
#endif

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>

    #import "Helperfunctions.h"

    #define isIPhone5  [deviceName() rangeOfString:@"iPhone5,"].location != NSNotFound
    #define isIPhone5S [deviceName() rangeOfString:@"iPhone6,"].location != NSNotFound
#endif
于 2014-04-10T06:37:37.717 回答
2

或者,如果您想要类似于您已经在做的事情,为什么不只是:

BOOL iPhone5 = [[ UIScreen mainScreen ] bounds ].size.height >= 568 ;

于 2014-04-10T06:58:17.223 回答
1

您的应用是否具有 R4 启动图像(如果您使用资产目录)或 Default-568h@2x.png 启动图像?如果不是,它会认为它在 3.5 英寸屏幕上运行,无论它实际运行在什么设备上。

于 2014-04-10T16:29:00.967 回答