【问题标题】:trying to detect iphone x in swift always return false [duplicate]试图快速检测 iphone x 总是返回 false [重复]
【发布时间】:2018-08-04 12:48:53
【问题描述】:

我正在使用模拟器在 iphone x 上测试我的所有内容

这是其中一种方法

struct Device {
        // iDevice detection code
        static let IS_IPAD             = UIDevice.current.userInterfaceIdiom == .pad
        static let IS_IPHONE           = UIDevice.current.userInterfaceIdiom == .phone
        static let IS_RETINA           = UIScreen.main.scale >= 2.0

        static let SCREEN_WIDTH        = Int(UIScreen.main.bounds.size.width)
        static let SCREEN_HEIGHT       = Int(UIScreen.main.bounds.size.height)
        static let SCREEN_MAX_LENGTH   = Int( max(SCREEN_WIDTH, SCREEN_HEIGHT) )
        static let SCREEN_MIN_LENGTH   = Int( min(SCREEN_WIDTH, SCREEN_HEIGHT) )

        static let IS_IPHONE_4_OR_LESS = IS_IPHONE && SCREEN_MAX_LENGTH  < 568
        static let IS_IPHONE_5         = IS_IPHONE && SCREEN_MAX_LENGTH == 568
        static let IS_IPHONE_6         = IS_IPHONE && SCREEN_MAX_LENGTH == 667
        static let IS_IPHONE_6P        = IS_IPHONE && SCREEN_MAX_LENGTH == 736
        static let IS_IPHONE_X         = IS_IPHONE && SCREEN_MAX_LENGTH == 812
    }

这是另一种方法

if UIDevice().userInterfaceIdiom == .phone {
            switch UIScreen.main.nativeBounds.height {
            case 1136:
                print("iPhone 5 or 5S or 5C")
            case 1334:
                print("iPhone 6/6S/7/8")
            case 2208:
                print("iPhone 6+/6S+/7+/8+")
            case 2436:
                print("iPhone X")
                retValue = true
            default:
                print("unknown")
            }
        }

为什么所有方法都返回 false ?是因为我用的是模拟器还是什么?

【问题讨论】:

  • 打印UIScreen.main.nativeBounds.height的结果并与我们分享!
  • 这是我使用 iphone x 模拟器 = 1704.0 时的值
  • 这里在Xcode 9.4.1,它打印2436.0。不知道是什么导致它成为1704
  • 我也在使用 xcode 9.4.1

标签: ios swift xcode ios-simulator iphone-x


【解决方案1】:

使用如下方式检测 iPhone X:

var iphoneX = false
if #available(iOS 11.0, *) {
    if ((UIApplication.shared.keyWindow?.safeAreaInsets.top)! > CGFloat(0.0)) {
        iphoneX = true
    }
}

【讨论】:

  • UIApplication.shared.keyWindow!.safeAreaInsets.top &gt; 0
【解决方案2】:
enum DeviceType {
 case iPhoneX
 case iPhone5
 case iPhone6Plus
 case iPhone6
 case Unknown
}

class Utils {

    class var isIphoneX:Bool {
        if deviceType() == .iPhoneX {
            return true
        }

        return false
    }

    class func deviceType()->DeviceType {
        switch UIScreen.main.nativeBounds.height {
        case 1136:
            return .iPhone5
        case 1334:
            return .iPhone6
        case 1920, 2208:
            return .iPhone6Plus
        case 2436:
            return .iPhoneX
        default:
            return .Unknown
       }
    }
}

并像这样使用它:

if Utils.isIphoneX {
    //Do things
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多