首页 文章

如何检测iPhone 5(宽屏设备)?

提问于
浏览
296

我刚刚升级到XCode 4.5 GM,发现你现在可以将“4”Retina'大小应用到故事板中的视图控制器 .

现在,如果我想创建一个在iPhone 4和5上运行的应用程序,当然我必须构建每个窗口两次,但我还必须检测用户是否有一个3.5“或4”屏幕的iPhone,然后应用视图 .

我该怎么办?

24 回答

  • 11
    +(BOOL)isDeviceiPhone5
    {
        BOOL iPhone5 = FALSE;
    
        CGRect screenBounds = [[UIScreen mainScreen] bounds];
        if (screenBounds.size.height == 568)
        {
            // code for 4-inch screen
            iPhone5 = TRUE;
        }
        else
        {
            iPhone5 = FALSE;
            // code for 3.5-inch screen
        }
        return iPhone5;
    
    }
    
  • 2
    CGFloat height = [UIScreen mainScreen].bounds.size.height;
    
    NSLog(@"screen soze is %f",height);
    
      if (height>550) {
    
              // 4" screen-do some thing
         }
    
      else if (height<500) {
    
            // 3.5 " screen- do some thing
    
         }
    
  • 2

    在如此多的层面上依赖于大小是错误的 . 我们问系统怎么样?

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

    取自Best way to detect hardware type, iPhone4 or iPhone5?,edzio27回答 .

  • 2

    这样您就可以检测设备系列 .

    #import <sys/utsname.h>
        NSString* deviceName()
        {
            struct utsname systemInformation;
            uname(&systemInformation);
            NSString *result = [NSString stringWithCString:systemInformation.machine
                                                  encoding:NSUTF8StringEncoding];
            return result;
        }
    
        #define isIPhone5  [deviceName() rangeOfString:@"iPhone5,"].location != NSNotFound
        #define isIPhone5S [deviceName() rangeOfString:@"iPhone6,"].location != NSNotFound
    
  • -2

    在Swift,iOS 8项目中,我喜欢在 UIScreen 上进行扩展,如:

    extension UIScreen {
    
        var isPhone4: Bool {
            return self.nativeBounds.size.height == 960;
        }
    
        var isPhone5: Bool {
            return self.nativeBounds.size.height == 1136;
        }
    
        var isPhone6: Bool {
            return self.nativeBounds.size.height == 1334;
        }
    
        var isPhone6Plus: Bool {
            return self.nativeBounds.size.height == 2208;
        }
    
    }
    

    (注意: nativeBounds 以像素为单位) .

    然后代码就像:

    if UIScreen.mainScreen().isPhone4 {
        // do smth on the smallest screen
    }
    

    因此代码清楚地表明这是对主屏幕的检查,而不是对设备模型的检查 .

  • 5

    借用Samrat Mazumdar的答案,这是一种估算设备屏幕尺寸的简短方法 . 它适用于最新的设备,但未来可能会失败(因为所有猜测方法都可能) . 如果镜像设备也会感到困惑(返回设备的屏幕大小,而不是镜像的屏幕大小)

    #define SCREEN_SIZE_IPHONE_CLASSIC 3.5
    #define SCREEN_SIZE_IPHONE_TALL 4.0
    #define SCREEN_SIZE_IPAD_CLASSIC 9.7
    
    + (CGFloat)screenPhysicalSize
    {
        if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
        {
            CGSize result = [[UIScreen mainScreen] bounds].size;
            if (result.height < 500)
                return SCREEN_SIZE_IPHONE_CLASSIC;  // iPhone 4S / 4th Gen iPod Touch or earlier
            else
                return SCREEN_SIZE_IPHONE_TALL;  // iPhone 5
        }
        else
        {
            return SCREEN_SIZE_IPAD_CLASSIC; // iPad
        }
    }
    
  • 1

    首先,您不应重建所有视图以适应新屏幕,也不应对不同屏幕尺寸使用不同视图 .

    使用iOS的 auto-resizing 功能,以便您的视图可以调整,并适应任何屏幕大小 .

    这不是很难,请阅读some documentation . 它会为你节省很多时间 .

    iOS 6还提供了相关的新功能,但目前仍在NDA下 .
    如果您可以访问它,请务必阅读Apple Developer网站上的API changelog .

    Edit :由于iOS 6现已用完,请检查新的AutoLayout功能 .

    也就是说,如果你真的需要检测iPhone 5,你可以简单地依靠screen size .

    [ [ UIScreen mainScreen ] bounds ].size.height
    

    iPhone 5的屏幕高度为568 .
    您可以想象一个宏,以简化所有这些:

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

    在比较浮点时,使用 fabs 与epsilon可以防止精度错误,如H2CO3的评论中所指出的那样 .

    所以从现在开始,你可以在标准的if / else语句中使用它:

    if( IS_IPHONE_5 )
    {}
    else
    {}
    

    Edit - Better detection

    正如一些人所说,这只是 detect a widescreen ,而不是真正的iPhone 5 .

    iPod touch的下一个版本也可能有这样的屏幕,所以我们可能会使用另一组宏 .

    让我们重命名原始宏 IS_WIDESCREEN

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

    让我们添加模型检测宏:

    #define IS_IPHONE ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPhone" ] )
    #define IS_IPOD   ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPod touch" ] )
    

    这样,我们可以确保我们有一个宽屏的iPhone型号 AND ,我们可以重新定义 IS_IPHONE_5 宏:

    #define IS_IPHONE_5 ( IS_IPHONE && IS_WIDESCREEN )
    

    另请注意,正如@ LearnCocos2D所述,如果应用程序未针对iPhone 5屏幕进行优化(缺少Default-568h@2x.png图像),则此宏将无法工作,因为屏幕大小仍为320x480一件事 .

    我不认为这可能是一个问题,因为我不明白为什么我们想要在非优化的应用程序中检测iPhone 5 .

    IMPORTANT - iOS 8 support

    在iOS 8上, UIScreen 类的 bounds 属性现在反映了 device orientation .
    很明显,以前的代码不会开箱即用 .

    为了解决这个问题,您可以简单地使用新的 nativeBounds 属性,而不是 bounds ,因为它基于纵向模式赢得了't change with the orientation, and as it' .
    请注意, nativeBounds 的尺寸以像素为单位测量,因此对于iPhone 5,高度将为 1136 而不是568 .

    如果您还要定位iOS 7或更低版本,请务必使用功能检测,因为在iOS 8之前调用 nativeBounds 会导致您的应用崩溃:

    if( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] )
    {
        /* Detect using nativeBounds - iOS 8 and greater */
    }
    else
    {
        /* Detect using bounds - iOS 7 and lower */
    }
    

    您可以通过以下方式调整以前的宏:

    #define IS_WIDESCREEN_IOS7 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
    #define IS_WIDESCREEN_IOS8 ( fabs( ( double )[ [ UIScreen mainScreen ] nativeBounds ].size.height - ( double )1136 ) < DBL_EPSILON )
    #define IS_WIDESCREEN      ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_WIDESCREEN_IOS8 : IS_WIDESCREEN_IOS7 )
    

    显然,如果您需要检测iPhone 6或6 Plus,请使用相应的屏幕尺寸 .

    Final note

    意见和建议已纳入本文 .
    感谢大家 .

  • 1

    我认为如果这个宏在设备和模拟器中工作应该是好的,下面是解决方案 .

    #define IS_WIDESCREEN (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)568) < DBL_EPSILON)
    #define IS_IPHONE (([[[UIDevice currentDevice] model] isEqualToString:@"iPhone"]) || ([[[UIDevice currentDevice] model] isEqualToString: @"iPhone Simulator"]))
    #define IS_IPOD   ([[[UIDevice currentDevice]model] isEqualToString:@"iPod touch"])
    #define IS_IPHONE_5 ((IS_IPHONE || IS_IPOD) && IS_WIDESCREEN)
    
  • 27

    针对SDK和OS的任何组合进行测试和设计:

    斯威夫特

    Added iPad types. iPad 2 and iPad mini are non-retina iPads. While iPad Mini 2 & above, iPad 3, 4, iPad Air, Air 2, Air 3, and iPad Pro 9.7 have same logical resolution of 1024. iPad Pro has maxLength of 1366. Reference

    import UIKit
    
    public enum DisplayType {
        case unknown
        case iphone4
        case iphone5
        case iphone6
        case iphone6plus
        case iPadNonRetina
        case iPad
        case iPadProBig
        static let iphone7 = iphone6
        static let iphone7plus = iphone6plus
    }
    
    public final class Display {
        class var width:CGFloat { return UIScreen.main.bounds.size.width }
        class var height:CGFloat { return UIScreen.main.bounds.size.height }
        class var maxLength:CGFloat { return max(width, height) }
        class var minLength:CGFloat { return min(width, height) }
        class var zoomed:Bool { return UIScreen.main.nativeScale >= UIScreen.main.scale }
        class var retina:Bool { return UIScreen.main.scale >= 2.0 }
        class var phone:Bool { return UIDevice.current.userInterfaceIdiom == .phone }
        class var pad:Bool { return UIDevice.current.userInterfaceIdiom == .pad }
        class var carplay:Bool { return UIDevice.current.userInterfaceIdiom == .carPlay }
        class var tv:Bool { return UIDevice.current.userInterfaceIdiom == .tv }
        class var typeIsLike:DisplayType {
            if phone && maxLength < 568 {
                return .iphone4
            }
            else if phone && maxLength == 568 {
                    return .iphone5
            }
            else if phone && maxLength == 667 {
                return .iphone6
            }
            else if phone && maxLength == 736 {
                return .iphone6plus
            }
            else if pad && !retina {
                return .iPadNonRetina
            }
            else if pad && retina && maxLength == 1024 {
                return .iPad
            }
            else if pad && maxLength == 1366 {
                return .iPadProBig
            }
            return .unknown
        }
    }
    

    看到它在行动https://gist.github.com/hfossli/bc93d924649de881ee2882457f14e346

    注意:如果是iPhone 6处于缩放模式,UI是iPhone 5的放大版本 . 这些功能不是确定设备类型,而是显示模式因此iPhone 5是此示例中的期望结果 .

    Objective-C

    #define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    #define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
    #define IS_RETINA ([[UIScreen mainScreen] scale] >= 2.0)
    
    #define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
    #define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)
    #define SCREEN_MAX_LENGTH (MAX(SCREEN_WIDTH, SCREEN_HEIGHT))
    #define SCREEN_MIN_LENGTH (MIN(SCREEN_WIDTH, SCREEN_HEIGHT))
    #define IS_ZOOMED (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)
    
    #define IS_IPHONE_4_OR_LESS (IS_IPHONE && SCREEN_MAX_LENGTH < 568.0)
    #define IS_IPHONE_5 (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0)
    #define IS_IPHONE_6 (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0)
    #define IS_IPHONE_6P (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)
    

    用法:http://pastie.org/9687735

    注意:如果是iPhone 6处于缩放模式,UI是iPhone 5的放大版本 . 这些功能不是确定设备类型,而是显示模式因此iPhone 5是此示例中的期望结果 .

  • 0

    真的很简单的解决方案

    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
    {
        CGSize result = [[UIScreen mainScreen] bounds].size;
        if(result.height == 480)
        {
            // iPhone Classic
        }
        if(result.height == 568)
        {
            // iPhone 5
        }
    }
    
  • 232

    我们现在需要考虑iPhone 6和6Plus屏幕尺寸 . 这是一个更新的答案

    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
    {
        //its iPhone. Find out which one?
    
        CGSize result = [[UIScreen mainScreen] bounds].size;
        if(result.height == 480)
        {
            // iPhone Classic
        }
        else if(result.height == 568)
        {
            // iPhone 5
        }
        else if(result.height == 667)
        {
            // iPhone 6
        }
       else if(result.height == 736)
        {
            // iPhone 6 Plus
        }
    }
    else
    {
         //its iPad
    }
    

    一些有用的信息

    iPhone 6 Plus   736x414 points  2208x1242 pixels    3x scale    1920x1080 physical pixels   401 physical ppi    5.5"
    iPhone 6        667x375 points  1334x750 pixels     2x scale    1334x750 physical pixels    326 physical ppi    4.7"
    iPhone 5        568x320 points  1136x640 pixels     2x scale    1136x640 physical pixels    326 physical ppi    4.0"
    iPhone 4        480x320 points  960x640 pixels      2x scale    960x640 physical pixels     326 physical ppi    3.5"
    iPhone 3GS      480x320 points  480x320 pixels      1x scale    480x320 physical pixels     163 physical ppi    3.5"
    
  • 1

    我已经冒昧地将Macmade的宏放入C函数中,并将其命名为正确,因为它检测到 widescreen availability 而不一定是iPhone 5 .

    该宏也不包括 Default-568h@2x.png . 如果没有新的默认图像,iPhone 5将报告常规的480x320屏幕尺寸(以磅为单位) . 因此,检查不仅适用于宽屏可用性,还适用于 widescreen mode being enabled .

    BOOL isWidescreenEnabled()
    {
        return (BOOL)(fabs((double)[UIScreen mainScreen].bounds.size.height - 
                                                   (double)568) < DBL_EPSILON);
    }
    
  • 1

    这是我们的代码, test passed on ios7/ios8 for iphone4,iphone5,ipad,iphone6,iphone6p, no matter on devices or simulator:

    #define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    #define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) // iPhone and       iPod touch style UI
    
    #define IS_IPHONE_5_IOS7 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0f)
    #define IS_IPHONE_6_IOS7 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0f)
    #define IS_IPHONE_6P_IOS7 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0f)
    #define IS_IPHONE_4_AND_OLDER_IOS7 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height < 568.0f)
    
    #define IS_IPHONE_5_IOS8 (IS_IPHONE && ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) == 568.0f)
    #define IS_IPHONE_6_IOS8 (IS_IPHONE && ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) == 667.0f)
    #define IS_IPHONE_6P_IOS8 (IS_IPHONE && ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) == 736.0f)
    #define IS_IPHONE_4_AND_OLDER_IOS8 (IS_IPHONE && ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) < 568.0f)
    
    #define IS_IPHONE_5 ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_IPHONE_5_IOS8 : IS_IPHONE_5_IOS7 )
    #define IS_IPHONE_6 ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_IPHONE_6_IOS8 : IS_IPHONE_6_IOS7 )
    #define IS_IPHONE_6P ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_IPHONE_6P_IOS8 : IS_IPHONE_6P_IOS7 )
    #define IS_IPHONE_4_AND_OLDER ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_IPHONE_4_AND_OLDER_IOS8 : IS_IPHONE_4_AND_OLDER_IOS7 )
    
  • 465

    我使用了hfossli的答案并将其翻译成Swift

    let IS_IPAD = UIDevice.currentDevice().userInterfaceIdiom == .Pad
    let IS_IPHONE = UIDevice.currentDevice().userInterfaceIdiom == .Phone
    let IS_RETINA = UIScreen.mainScreen().scale >= 2.0
    
    let SCREEN_WIDTH = UIScreen.mainScreen().bounds.size.width
    let SCREEN_HEIGHT = UIScreen.mainScreen().bounds.size.height
    let SCREEN_MAX_LENGTH = max(SCREEN_WIDTH, SCREEN_HEIGHT)
    let SCREEN_MIN_LENGTH = min(SCREEN_WIDTH, SCREEN_HEIGHT)
    
    let IS_IPHONE_4_OR_LESS = (IS_IPHONE && SCREEN_MAX_LENGTH < 568.0)
    let IS_IPHONE_5 = (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0)
    let IS_IPHONE_6 = (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0)
    let IS_IPHONE_6P = (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)
    
  • 7

    这是我的cocos2d项目的宏 . 对于其他应用应该是相同的 .

    #define WIDTH_IPAD 1024
    #define WIDTH_IPHONE_5 568
    #define WIDTH_IPHONE_4 480
    #define HEIGHT_IPAD 768
    #define HEIGHT_IPHONE 320
    
    #define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
    #define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    
    //width is height!
    #define IS_IPHONE_5 ( [ [ UIScreen mainScreen ] bounds ].size.height == WIDTH_IPHONE_5 )
    #define IS_IPHONE_4 ( [ [ UIScreen mainScreen ] bounds ].size.height == WIDTH_IPHONE_4 )
    
    #define cp_ph4(__X__, __Y__) ccp(cx_ph4(__X__), cy_ph4(__Y__))
    #define cx_ph4(__X__) (IS_IPAD ? (__X__ * WIDTH_IPAD / WIDTH_IPHONE_4) : (IS_IPHONE_5 ? (__X__ * WIDTH_IPHONE_5 / WIDTH_IPHONE_4) : (__X__)))
    #define cy_ph4(__Y__) (IS_IPAD ? (__Y__ * HEIGHT_IPAD / HEIGHT_IPHONE) : (__Y__))
    
    #define cp_pad(__X__, __Y__) ccp(cx_pad(__X__), cy_pad(__Y__))
    #define cx_pad(__X__) (IS_IPAD ? (__X__) : (IS_IPHONE_5 ? (__X__ * WIDTH_IPHONE_5 / WIDTH_IPAD) : (__X__ * WIDTH_IPHONE_4 / WIDTH_IPAD)))
    #define cy_pad(__Y__) (IS_IPAD ? (__Y__) : (__Y__ * HEIGHT_IPHONE / HEIGHT_IPAD))
    
  • 15
    if ((int)[[UIScreen mainScreen] bounds].size.height == 568)
    {
        // This is iPhone 5 screen
    } else {
        // This is iPhone 4 screen
    }
    
  • 1

    我发现答案不包括模拟器的特殊情况 .

    #define IS_WIDESCREEN ( [ [ UIScreen mainScreen ] bounds ].size.height == 568  )
    #define IS_IPHONE ([[ [ UIDevice currentDevice ] model ] rangeOfString:@"iPhone"].location != NSNotFound)
    #define IS_IPAD ([[ [ UIDevice currentDevice ] model ] rangeOfString:@"iPad"].location != NSNotFound)
    #define IS_IPHONE_5 ( IS_IPHONE && IS_WIDESCREEN )
    
  • 2

    If the project is created using Xcode 6, then use the below mentioned code to detect the devices..

    printf("\nDetected Resolution : %d x %d\n\n",(int)[[UIScreen mainScreen] nativeBounds].size.width,(int)[[UIScreen mainScreen] nativeBounds].size.height);
    
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
        if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
        {
            if([[UIScreen mainScreen] nativeBounds].size.height == 960 || [[UIScreen mainScreen] nativeBounds].size.height == 480){
                printf("Device Type : iPhone 4,4s ");
    
            }else if([[UIScreen mainScreen] nativeBounds].size.height == 1136){
                printf("Device Type : iPhone 5,5S/iPod 5 ");
    
            }else if([[UIScreen mainScreen] nativeBounds].size.height == 1334){
                printf("Device Type : iPhone 6 ");
    
            }else if([[UIScreen mainScreen] nativeBounds].size.height == 2208){
                printf("Device Type : iPhone 6+ ");
    
            }
        }
    }else{
        printf("Device Type : iPad");
    }
    

    If the project was created in Xcode 5 and opened in Xcode 6, then use the below mentioned code to detect the devices.(This code works if no launching images for iPhone 6,6+ are assigned)

    printf("\nDetected Resolution : %d x %d\n\n",(int)[[UIScreen mainScreen] nativeBounds].size.width,(int)[[UIScreen mainScreen] nativeBounds].size.height);
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
        if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
        {
           if([[UIScreen mainScreen] nativeBounds].size.height == 960 || [[UIScreen mainScreen] nativeBounds].size.height == 480){
                printf("Device Type : iPhone 4,4s");
                appType=1;
            }else if([[UIScreen mainScreen] nativeBounds].size.height == 1136 || [[UIScreen mainScreen] nativeBounds].size.height == 1704){
                printf("Device Type : iPhone 5,5S,6,6S/iPod 5 ");
                appType=3;
            }
        }
    }else{
        printf("Device Type : iPad");
        appType=2;
    }
    

    If you are still using Xcode 5 all together then use the following code to detect the devices (iPhone 6 and 6+ will not be detected)

    printf("\nDetected Resolution : %d x %d\n\n",(int)[[UIScreen mainScreen] bounds].size.width,(int)[[UIScreen mainScreen] bounds].size.height);
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
        if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
        {
            CGSize result = [[UIScreen mainScreen] bounds].size;
            CGFloat scale = [UIScreen mainScreen].scale;
            result = CGSizeMake(result.width * scale, result.height * scale);
            if(result.height == 960 || result.height == 480){
                printf("Device Type : iPhone 4,4S ");
    
            }else if(result.height == 1136){
                printf("Device Type : iPhone 5s/iPod 5");
    
            }
        }
    }else{
        printf("Device Type : iPad");
    
    }
    
  • 0
    • 添加'New Swift File' - > AppDelegateEx.swift

    • 添加扩展名 AppDelegate

    import UIKit
    extension AppDelegate {
         class func isIPhone5 () -> Bool{
             return max(UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height) == 568.0
        }
        class func isIPhone6 () -> Bool {
            return max(UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height) == 667.0
        }
        class func isIPhone6Plus () -> Bool {
            return max(UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height) == 736.0
        }  
    }
    
    • 用法:
    if AppDelegate.isIPhone5() {
            collectionViewTopConstraint.constant = 2
        }else if AppDelegate.isIPhone6() {
            collectionViewTopConstraint.constant = 20
        }
    
  • 1

    已经回答了一百次,但这个解决方案对我来说是最好的 . 它是一个简单的辅助函数,不需要扩展系统类 .

    Swift 3助手:

    func phoneSizeInInches(defaultValue: Float = 4.7) -> Float {
        switch (UIScreen.main.nativeBounds.size.height) {
        case 960, 480:
            return 3.5
        case 1136:
            return 4
        case 1334:
            return 4.7
        case 2208:
            return 5.5
        default:
            return defaultValue
        }
    }
    

    这是因为它很容易记住手机的英寸尺寸,例如“5.5英寸”或“4.7英寸”设备,但难以记住确切的像素尺寸 .

    if phoneSizeInInches() == 4 {
      //do something with only 4 inch iPhones
    }
    

    这也让你有机会做这样的事情:

    if phoneSizeInInches() < 5.5 {
      //do something all iPhones smaller than the plus
    }
    

    如果Apple发布新的设备尺寸并且您尚未更新应用程序,则“defaultValue”可确保您的代码始终回退到安全大小 .

    if phoneSizeInInches(defaultValue: 4.7) == 4 {
        //if a new iPhone size is introduced, your code will default to behaving like a 4.7 inch iPhone
    }
    

    请注意,这是针对手机应用程序的,需要对通用应用程序进行一些更改 .

  • 3

    在Swift 3中,您可以使用我的简单类KRDeviceType .

    https://github.com/ulian-onua/KRDeviceType

    它有详细记录并支持运算符==,> =,<= .

    例如,要检测设备是否具有iPhone 6 / 6s / 7的边界,您可以使用下一个比较:

    if KRDeviceType() == .iPhone6 {
    // Perform appropiate operations
    }
    

    要检测设备是否具有iPhone 5 / 5S / SE或更早版本(iPhone 4s)的界限,您可以使用下一个比较:

    if KRDeviceType() <= .iPhone5 {   //iPhone 5/5s/SE of iPhone 4s
    // Perform appropiate operations (for example, set up constraints for those old devices)
    }
    
  • 69

    使用以下代码:

    CGFloat screenScale = [[UIScreen mainScreen] scale];
    
    CGRect screenBounds = [[UIScreen mainScreen] bounds]; 
    
    CGSize screenSize = CGSizeMake(screenBounds.size.width * screenScale, screenBounds.size.height * screenScale); 
    
    if (screenSize.height==1136.000000)
    { 
        // Here iPhone 5 View
    
        // Eg: Nextview~iPhone5.Xib
    } else {
       // Previous Phones 
    
       // Eg : Nextview.xib
    }
    
  • 6

    这是设备的正确测试,不依赖于方向

    - (BOOL)isIPhone5
    {
        CGSize size = [[UIScreen mainScreen] bounds].size;
        if (MIN(size.width,size.height) == 320 && MAX(size.width,size.height == 568)) {
            return YES;
        }
        return NO;
    }
    
  • 1

    用于检测所有版本的iPhone和iPad设备 .

    #define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    #define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
    #define IS_IPHONE_5 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0)
    #define IS_IPHONE_6 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0)
    #define IS_IPHONE_6_PLUS (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0)
    #define IS_RETINA ([[UIScreen mainScreen] scale] == 2.0)
    

相关问题