Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS How to detect iPhone X, iPhone 6 plus, iPhone 6, iPhone 5, iPhone 4 by macro?

How to detect device model by macro? i had using something like this but the result on the simulator alway IS_IPHONE_5

#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_6PLUS (IS_IPHONE && [[UIScreen mainScreen] nativeScale] == 3.0f) #define IS_IPHONE_6_PLUS (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0) #define IS_RETINA ([[UIScreen mainScreen] scale] == 2.0)   
like image 618
phuongho Avatar asked Sep 11 '14 06:09

phuongho


People also ask

Is the iPhone x the same size as the iPhone 6 Plus?

It's slightly smaller than iPhone 6s Plus – but thanks to these design changes actually has a larger screen – 5.8 inches' vs 5.5 inches – so your videos and images will look even better.


2 Answers

Swift

import UIKit  public enum DisplayType {     case unknown     case iphone4     case iphone5     case iphone6     case iphone6plus     static let iphone7 = iphone6     static let iphone7plus = iphone6plus     case iphoneX }  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 phone && maxLength == 812 {             return .iphoneX         }         return .unknown     } } 

See it in action https://gist.github.com/hfossli/bc93d924649de881ee2882457f14e346

Note: If e.g. iPhone 6 is in zoomed mode the UI is a zoomed up version of iPhone 5. These functions is not determining device type, but display mode thus iPhone 5 is the desired result in this example.

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) #define IS_IPHONE_X (IS_IPHONE && SCREEN_MAX_LENGTH == 812.0) 

Usage: http://pastie.org/9687735

Note: If e.g. iPhone 6 is in zoomed mode the UI is a zoomed up version of iPhone 5. These functions is not determining device type, but display mode thus iPhone 5 is the desired result in this example.

like image 141
hfossli Avatar answered Sep 19 '22 16:09

hfossli


For Swift:

struct ScreenSize {     static let SCREEN_WIDTH = UIScreen.main.bounds.size.width     static let SCREEN_HEIGHT = UIScreen.main.bounds.size.height     static let SCREEN_MAX_LENGTH = max(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)     static let SCREEN_MIN_LENGTH = min(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT) }  struct DeviceType {     static let IS_IPHONE_4_OR_LESS =  UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH < 568.0     static let IS_IPHONE_5 = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 568.0     static let IS_IPHONE_6 = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 667.0     static let IS_IPHONE_6P = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 736.0 } 
like image 28
DavidNorman Avatar answered Sep 18 '22 16:09

DavidNorman