问答中心分类: IOS在Swift中使用UI\u USER\u INTERFACE\u IDIOM()检测当前设备
0
匿名用户 提问 15分钟 前

等价于什么UI_USER_INTERFACE_IDIOM()在Swift中检测iPhone和iPad?
我得到一个Use of unresolved identifier在Swift中编译时出错。

17 Answers
0
Beslan Tularov 回答 15分钟 前

你应该用这个GBDeviceInfo框架
苹果对此进行了定义:

public enum UIUserInterfaceIdiom : Int {

    case unspecified

    case phone // iPhone and iPod touch style UI

    case pad // iPad style UI

    @available(iOS 9.0, *)
    case tv // Apple TV style UI

    @available(iOS 9.0, *)
    case carPlay // CarPlay style UI
}

所以对于定义严格的设备可以使用此代码

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_7          = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 667.0
    static let IS_IPHONE_6P_7P         = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 736.0
    static let IS_IPAD              = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1024.0
    static let IS_IPAD_PRO          = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1366.0
}

如何使用

if DeviceType.IS_IPHONE_6P_7P {
    print("IS_IPHONE_6P_7P")
}

检测iOS版本

struct Version{
    static let SYS_VERSION_FLOAT = (UIDevice.current.systemVersion as NSString).floatValue
    static let iOS7 = (Version.SYS_VERSION_FLOAT < 8.0 && Version.SYS_VERSION_FLOAT >= 7.0)
    static let iOS8 = (Version.SYS_VERSION_FLOAT >= 8.0 && Version.SYS_VERSION_FLOAT < 9.0)
    static let iOS9 = (Version.SYS_VERSION_FLOAT >= 9.0 && Version.SYS_VERSION_FLOAT < 10.0)
}

如何使用

if Version.iOS8 {
    print("iOS8")
}
SoftDesigner 回复 15分钟 前

我喜欢struct ScreenSize/DeviceType方法,因为它在模拟器中工作

Ashoor 回复 15分钟 前

批准的答案应该转到这个简洁的答案

swiftBoy 回复 15分钟 前

来自印度的巨大爱,感谢您的努力,非常感谢您的分享和做出更好的努力;)

Vaibhav Jhaveri 回复 15分钟 前

更新的代码是什么?在iPhone 7和7P的DEVICE_类型上下文中

0
Masterfego 回答 15分钟 前

如果/其他情况:

if UIDevice.current.userInterfaceIdiom == .pad {
     // iPad
 } else {
     // not iPad (iPhone, mac, tv, carPlay, unspecified)
 }
webcpu 回复 15分钟 前

public enum UIUserInterfaceIdiom:Int{case Unspecified@available(iOS 3.2,*)case Phone//iPhone和iPod touch风格的UI@available(iOS 3.2,*)case Pad//iPad风格的UI@available(iOS 9.0,*)case TV//Apple TV风格的UI}查看UIUserInterfaceIdiom的定义。如果不是Pad,它可能是电话、电视,未指定。

0
user3378170 回答 15分钟 前

Swift 2.0、iOS 9和Xcode 7.1

// 1. request an UITraitCollection instance
let deviceIdiom = UIScreen.mainScreen().traitCollection.userInterfaceIdiom

// 2. check the idiom
switch (deviceIdiom) {

case .Pad:
    print("iPad style UI")
case .Phone:
    print("iPhone and iPod touch style UI")
case .TV: 
    print("tvOS style UI")
default:
    print("Unspecified UI idiom")

}

Swift 3.0和Swift 4.0

// 1. request an UITraitCollection instance
let deviceIdiom = UIScreen.main.traitCollection.userInterfaceIdiom

// 2. check the idiom
switch (deviceIdiom) {

case .pad:
    print("iPad style UI")
case .phone:
    print("iPhone and iPod touch style UI")
case .tv: 
    print("tvOS style UI")
default:
    print("Unspecified UI idiom")
}

使用UITraitCollection。拖车收集UitraitenEnvironment协议的属性。以下类别采用该协议:

  • UI屏幕
  • UIWindow
  • UIViewController
  • UIPresentationController
  • UIView
0
ricardo 回答 15分钟 前

我是这样做的:

UIDevice.current.model

它显示设备的名称。
要检查是iPad还是iPhone:

if ( UIDevice.current.model.range(of: "iPad") != nil){
    print("I AM IPAD")
} else {
    print("I AM IPHONE")
}
Luca Davanzo 回复 15分钟 前

至少对我来说,这绝对是最好的解决方案。检查userInterfaceIdiom有一个问题:如果您的应用程序仅适用于iPhone,但您在iPad上启动应用程序,则userInterfaceIdiom为==。电话

Fattie 回复 15分钟 前

绝对是最好的解决方案。很好。

0
Brody Robertson 回答 15分钟 前

Swift 4.2-5.1扩展

public extension UIDevice {

    class var isPhone: Bool {
        return UIDevice.current.userInterfaceIdiom == .phone
    }

    class var isPad: Bool {
        return UIDevice.current.userInterfaceIdiom == .pad
    }

    class var isTV: Bool {
        return UIDevice.current.userInterfaceIdiom == .tv
    }

    class var isCarPlay: Bool {
        return UIDevice.current.userInterfaceIdiom == .carPlay
    }
}

用法

if UIDevice.isPad {
   // Do something
}