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

前端 未结 13 706
一整个雨季
一整个雨季 2020-11-28 01:17

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_IDI         


        
13条回答
  •  孤街浪徒
    2020-11-28 01:49

    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.

提交回复
热议问题