ตรวจจับอุปกรณ์ปัจจุบันด้วย UI_USER_INTERFACE_IDIOM () ใน Swift


244

อะไรคือสิ่งที่เทียบเท่าUI_USER_INTERFACE_IDIOM()ใน Swift ในการตรวจจับระหว่าง iPhone และ iPad?

ฉันพบUse of unresolved identifierข้อผิดพลาดเมื่อรวบรวมใน Swift

คำตอบ:


535

เมื่อทำงานกับ Swift คุณสามารถใช้คำสั่งenum UIUserInterfaceIdiomกำหนดเป็น:

enum UIUserInterfaceIdiom : Int {
    case unspecified

    case phone // iPhone and iPod touch style UI
    case pad   // iPad style UI (also includes macOS Catalyst)
}

ดังนั้นคุณสามารถใช้มันเป็น:

UIDevice.current.userInterfaceIdiom == .pad
UIDevice.current.userInterfaceIdiom == .phone
UIDevice.current.userInterfaceIdiom == .unspecified

หรือด้วยคำสั่ง Switch:

    switch UIDevice.current.userInterfaceIdiom {
    case .phone:
        // It's an iPhone
    case .pad:
        // It's an iPad (or macOS Catalyst)
    case .unspecified:
        // Uh, oh! What could it be?
    }

UI_USER_INTERFACE_IDIOM() เป็นแมโคร Objective-C ซึ่งถูกกำหนดเป็น:

#define UI_USER_INTERFACE_IDIOM() \ ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? \ [[UIDevice currentDevice] userInterfaceIdiom] : \ UIUserInterfaceIdiomPhone)

นอกจากนี้โปรดทราบว่าแม้เมื่อทำงานกับ Objective-C UI_USER_INTERFACE_IDIOM()มาโครจำเป็นต้องมีก็ต่อเมื่อกำหนดเป้าหมาย iOS 3.2 และต่ำกว่า เมื่อปรับใช้กับ iOS 3.2 ขึ้นไปคุณสามารถใช้[UIDevice userInterfaceIdiom]โดยตรง


19
ไม่เป็นไร. ฉันได้มันมาด้วยif UIDevice.currentDevice().userInterfaceIdiom == .Pad
Mihai Fratu

4
ดังที่โทนี่พูดถึงหนึ่งในคำตอบด้านล่างนี้ UI_USER_INTERFACE_IDIOM ในแอป Swift จึงล้มเหลวเมื่อมีการปรับใช้แอปผ่าน TestFlight น่าแปลกที่ใช้งานได้เมื่ออัปโหลดแอปไปยังอุปกรณ์โดยตรงจาก X-Code ฉันยังพบข้อผิดพลาดนี้
Zmey

1
@Zmey ใช่แอปของฉันถูกปฏิเสธเนื่องจาก UI_USER_INTERFACE_IDIOM ขัดข้องตรวจสอบแปลกมาก
Peacemoon

ขอบคุณมาก. ฉันต่อสู้กับข้อผิดพลาดนี้เมื่อแอปเวอร์ชันใหม่ของฉันเปิดตัวและล้มเหลวจาก App Store แต่ไม่เคยมีมาก่อนเมื่อติดตั้งผ่าน XCode หวังว่าฉันจะได้รับการตรวจสอบอย่างเร่งด่วนสำหรับการแก้ไข
Computerspezl

6
ใน Swift 3 UIDevice.currentDevice().userInterfaceIdiomจะกลายเป็นUIDevice.current.userInterfaceIdiom
ชายฝั่งทะเลของทิเบต

113

คุณควรใช้กรอบงานGBDeviceInfoนี้หรือ ...

Apple กำหนดสิ่งนี้:

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")
}

1
ฉันชอบstruct ScreenSize/DeviceTypeแนวทางเนื่องจากมันทำงานใน Simulator
SoftDesigner

คำตอบที่ได้รับการอนุมัติควรไปที่คำตอบที่เป็นระเบียบนี้
Ashoor

ความรักที่ยิ่งใหญ่จากอินเดียขอขอบคุณสำหรับความพยายามขอบคุณมากสำหรับการแบ่งปันและปรับปรุง Stackoverflow ให้ดียิ่งขึ้น)
swiftBoy

คำตอบที่ดี! +1 จาก Zaur)
XXX

รหัสที่อัพเดทคืออะไร? ตามบริบทของ DEVICE_TYPE สำหรับ iPhone 7 และ 7P
Vaibhav Jhaveri

36

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 สภาพแวดล้อมของ iOS มีการเปิดเผยแม้ว่าคุณสมบัติtraitCollectionของโปรโตคอล UITraitEnvironment โปรโตคอลนี้ถูกนำไปใช้โดยคลาสต่อไปนี้:

  • UIScreen
  • UIWindow
  • UIViewController
  • UIPresentationController
  • UIView

25

ถ้า / กรณีอื่น:

 if (UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Pad)     
 {
        // Ipad
 }
 else 
 {
       // Iphone
 }

สาธารณะ enum UIUserInterfaceIdiom: Int {เคส Unspecified @available (iOS 3.2, *) เคสโทรศัพท์ // iPhone และ iPod touch สไตล์ UI @ พร้อมใช้งาน (iOS 3.2, *) เคส Pad / iPad สไตล์ UI @ พร้อมใช้งาน (iOS 9.0, *) TV // Apple TV style UI} ตรวจสอบคำจำกัดความของ UIUserInterfaceIdiom ถ้าไม่ใช่ Pad ก็อาจเป็น Phone, TV, Unspecified
UnchartedWorks

19

ฉันทำอย่างนั้น:

UIDevice.current.model

มันแสดงชื่อของอุปกรณ์

วิธีตรวจสอบว่าเป็น iPad หรือ iPhone:

if ( UIDevice.current.model.range(of: "iPad") != nil){
    print("I AM IPAD")
} else {
    print("I AM IPHONE")
}

5
ทางออกที่ดีที่สุดแน่นอนสำหรับฉันอย่างน้อย ตรวจสอบว่า userInterfaceIdiom มีปัญหา: หากแอปของคุณสำหรับ iPhone เท่านั้น แต่คุณเปิดแอพบน iPad userInterfaceIdiom คือ ==. Phone
Luca Davanzo

ทางออกที่ดีที่สุดแน่นอน สิ่งที่ดี.
Fattie

10

Swift 2.x:

การเพิ่มเข้าสู่Beslav Turalov คำตอบของรายการใหม่ iPad Pro สามารถหาได้ง่ายด้วยบรรทัดนี้

เพื่อตรวจสอบ iPad Pro

struct DeviceType
{
    ...
    static let IS_IPAD_PRO = UIDevice.currentDevice().userInterfaceIdiom == .Pad && ScreenSize.SCREEN_MAX_LENGTH == 1366.0
}

Swift 3 (เพิ่มทีวีและรถยนต์):

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            = UIDevice.current.userInterfaceIdiom == .phone
    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
    static let IS_IPHONE_7          = IS_IPHONE_6
    static let IS_IPHONE_7P         = IS_IPHONE_6P
    static let IS_IPAD              = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1024.0
    static let IS_IPAD_PRO_9_7      = IS_IPAD
    static let IS_IPAD_PRO_12_9     = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1366.0
    static let IS_TV                = UIDevice.current.userInterfaceIdiom == .tv
    static let IS_CAR_PLAY          = UIDevice.current.userInterfaceIdiom == .carPlay
}

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)
    static let iOS10 = (Version.SYS_VERSION_FLOAT >= 10.0 && Version.SYS_VERSION_FLOAT < 11.0)
}

การใช้ :

if DeviceType.IS_IPHONE_7P { print("iPhone 7 plus") }
if DeviceType.IS_IPAD_PRO_9_7 && Version.iOS10 { print("iPad pro 9.7 with iOS 10 version") }

10

ลองเพิ่มส่วนขยายแบบนี้:

    public extension UIDevice {

    var modelName: String {
        var systemInfo = utsname()
        uname(&systemInfo)
        let machineMirror = Mirror(reflecting: systemInfo.machine)
        let identifier = machineMirror.children.reduce("") { identifier, element in
            guard let value = element.value as? Int8 where value != 0 else { return identifier }
            return identifier + String(UnicodeScalar(UInt8(value)))
        }

        switch identifier {
        case "iPod5,1":                                 return "iPod Touch 5"
        case "iPod7,1":                                 return "iPod Touch 6"
        case "iPhone3,1", "iPhone3,2", "iPhone3,3":     return "iPhone 4"
        case "iPhone4,1":                               return "iPhone 4s"
        case "iPhone5,1", "iPhone5,2":                  return "iPhone 5"
        case "iPhone5,3", "iPhone5,4":                  return "iPhone 5c"
        case "iPhone6,1", "iPhone6,2":                  return "iPhone 5s"
        case "iPhone7,2":                               return "iPhone 6"
        case "iPhone7,1":                               return "iPhone 6 Plus"
        case "iPhone8,1":                               return "iPhone 6s"
        case "iPhone8,2":                               return "iPhone 6s Plus"
        case "iPhone9,1", "iPhone9,3":                  return "iPhone 7"
        case "iPhone9,2", "iPhone9,4":                  return "iPhone 7 Plus"
        case "iPhone8,4":                               return "iPhone SE"
        case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return "iPad 2"
        case "iPad3,1", "iPad3,2", "iPad3,3":           return "iPad 3"
        case "iPad3,4", "iPad3,5", "iPad3,6":           return "iPad 4"
        case "iPad4,1", "iPad4,2", "iPad4,3":           return "iPad Air"
        case "iPad5,3", "iPad5,4":                      return "iPad Air 2"
        case "iPad2,5", "iPad2,6", "iPad2,7":           return "iPad Mini"
        case "iPad4,4", "iPad4,5", "iPad4,6":           return "iPad Mini 2"
        case "iPad4,7", "iPad4,8", "iPad4,9":           return "iPad Mini 3"
        case "iPad5,1", "iPad5,2":                      return "iPad Mini 4"
        case "iPad6,3", "iPad6,4", "iPad6,7", "iPad6,8":return "iPad Pro"
        case "AppleTV5,3":                              return "Apple TV"
        case "i386", "x86_64":                          return "Simulator"
        default:                                        return identifier
        }
    }

}

นี่คือวิธีที่คุณจะใช้:

let modelName = UIDevice.currentDevice().modelName

แก้ไข สำหรับเครื่องจำลองคุณสามารถลองวิธีแก้ไขได้ที่นี่


เยี่ยมมากแม้ว่าการทดสอบด้วยเครื่องจำลองเพียงแค่ส่งคืนเครื่องจำลอง มีวิธีแก้ไขไหม
Steve

7

ส่วนขยาย Swift 4.2

 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
}

5

ใน swift 4 & Xcode 9.2 คุณสามารถตรวจสอบว่าอุปกรณ์เป็น iPhone / iPad ด้วยวิธีด้านล่าง

if (UIDevice.current.userInterfaceIdiom == .pad){
   print("iPad")
}
else{
   print("iPhone")
}

อีกวิธีหนึ่ง

    let deviceName = UIDevice.current.model
    print(deviceName);
    if deviceName == "iPhone"{
        print("iPhone")
    }
    else{
        print("iPad")
    }

5

ขอบคุณทุกคนที่สนับสนุน :))

UIDevice + Extensions.swift

import Foundation
import UIKit

extension UIDevice {
    static let modelName: String = {
        var systemInfo = utsname()
        uname(&systemInfo)
        let machineMirror = Mirror(reflecting: systemInfo.machine)
        let identifier = machineMirror.children.reduce("") { identifier, element in
            guard let value = element.value as? Int8, value != 0 else { return identifier }
            return identifier + String(UnicodeScalar(UInt8(value)))
        }

         func mapToDevice(identifier: String) -> String { // swiftlint:disable:this cyclomatic_complexity
            #if os(iOS)
            switch identifier {
            case "iPod5,1":                                 return "iPod Touch 5"
            case "iPod7,1":                                 return "iPod Touch 6"
            case "iPhone3,1", "iPhone3,2", "iPhone3,3":     return "iPhone 4"
            case "iPhone4,1":                               return "iPhone 4s"
            case "iPhone5,1", "iPhone5,2":                  return "iPhone 5"
            case "iPhone5,3", "iPhone5,4":                  return "iPhone 5c"
            case "iPhone6,1", "iPhone6,2":                  return "iPhone 5s"
            case "iPhone7,2":                               return "iPhone 6"
            case "iPhone7,1":                               return "iPhone 6 Plus"
            case "iPhone8,1":                               return "iPhone 6s"
            case "iPhone8,2":                               return "iPhone 6s Plus"
            case "iPhone9,1", "iPhone9,3":                  return "iPhone 7"
            case "iPhone9,2", "iPhone9,4":                  return "iPhone 7 Plus"
            case "iPhone8,4":                               return "iPhone SE"
            case "iPhone10,1", "iPhone10,4":                return "iPhone 8"
            case "iPhone10,2", "iPhone10,5":                return "iPhone 8 Plus"
            case "iPhone10,3", "iPhone10,6":                return "iPhone X"
            case "iPhone11,2":                              return "iPhone XS"
            case "iPhone11,4", "iPhone11,6":                return "iPhone XS Max"
            case "iPhone11,8":                              return "iPhone XR"
            case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return "iPad 2"
            case "iPad3,1", "iPad3,2", "iPad3,3":           return "iPad 3"
            case "iPad3,4", "iPad3,5", "iPad3,6":           return "iPad 4"
            case "iPad4,1", "iPad4,2", "iPad4,3":           return "iPad Air"
            case "iPad5,3", "iPad5,4":                      return "iPad Air 2"
            case "iPad6,11", "iPad6,12":                    return "iPad 5"
            case "iPad7,5", "iPad7,6":                      return "iPad 6"
            case "iPad2,5", "iPad2,6", "iPad2,7":           return "iPad Mini"
            case "iPad4,4", "iPad4,5", "iPad4,6":           return "iPad Mini 2"
            case "iPad4,7", "iPad4,8", "iPad4,9":           return "iPad Mini 3"
            case "iPad5,1", "iPad5,2":                      return "iPad Mini 4"
            case "iPad6,3", "iPad6,4":                      return "iPad Pro 9.7 Inch"
            case "iPad6,7", "iPad6,8":                      return "iPad Pro 12.9 Inch"
            case "iPad7,1", "iPad7,2":                      return "iPad Pro 12.9 Inch 2. Generation"
            case "iPad7,3", "iPad7,4":                      return "iPad Pro 10.5 Inch"
            case "AppleTV5,3":                              return "Apple TV"
            case "AppleTV6,2":                              return "Apple TV 4K"
            case "AudioAccessory1,1":                       return "HomePod"
            case "i386", "x86_64":                          return "Simulator \(mapToDevice(identifier: ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] ?? "iOS"))"
            default:                                        return identifier
            }
            #elseif os(tvOS)
            switch identifier {
            case "AppleTV5,3": return "Apple TV 4"
            case "AppleTV6,2": return "Apple TV 4K"
            case "i386", "x86_64": return "Simulator \(mapToDevice(identifier: ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] ?? "tvOS"))"
            default: return identifier
            }
            #endif
        }
        return mapToDevice(identifier: identifier)
    }()
}

enum DeviceName: String {
    case iPod_Touch_5 = "iPod Touch 5"
    case pod_Touch_6 = "Pod Touch 6"
    case iPhone_4 = "iPhone 4"
    case iPhone_4s = "iPhone 4s"
    case iPhone_5 = "iPhone 5"
    case iPhone_5c = "iPhone 5c"
    case iPhone_5s = "iPhone 5s"
    case iPhone_6 = "iPhone 6"
    case iPhone_6_Plus = "iPhone 6 Plus"
    case iPhone_6s = "iPhone 6s"
    case iPhone_6s_Plus = "iPhone 6s Plus"
    case iPhone_7 = "iPhone 7"
    case iPhone_7_Plus = "iPhone 7 Plus"
    case iPhone_SE = "iPhone SE"
    case iPhone_8 = "iPhone 8"
    case iPhone_8_Plus = "iPhone 8 Plus"
    case iPhone_X = "iPhone X"
    case iPhone_XS = "iPhone XS"
    case iPhone_XS_Max = "iPhone XS Max"
    case iPhone_XR = "iPhone XR"
    case iPad_2 = "iPad 2"
    case iPad_3 = "iPad 3"
    case iPad_4 = "iPad 4"
    case iPad_Air = "iPad Air"
    case iPad_Air_2 = "iPad Air 2"
    case iPad_5 = "iPad 5"
    case iPad_6 = "iPad 6"
    case iPad_Mini = "iPad Mini"
    case iPad_Mini_2 = "iPad Mini 2"
    case iPad_Mini_3 = "iPad Mini 3"
    case iPad_Mini_4 = "iPad Mini 4"
    case iPad_Pro_9_7_Inch = "iPad Pro 9.7 Inch"
    case iPad_Pro_12_9_Inch = "iPad Pro 12.9 Inch"
    case iPad_Pro_12_9_Inch_2_Generation = "iPad Pro 12.9 Inch 2. Generation"
    case iPad_Pro_10_5_Inch = "iPad Pro 10.5 Inch"
    case apple_TV = "Apple TV"
    case apple_TV_4K = "Apple TV 4K"
    case homePod = "HomePod"
}

SharedFunctions.swift

import Foundation
import UIKit
func isDevice(_ name: DeviceName) -> Bool {
    let modelName = UIDevice.modelName.replacingOccurrences(of: "Simulator", with: "").trimmed()
    if name.rawValue == modelName {
        return true
    }

    return false
}

String + Whitespace.swift

import Foundation

extension String {
   public func trimmed() -> String {
    return self.trimmingCharacters(in: .whitespacesAndNewlines)
  }
}

5

ลองใช้วิธีนี้เพื่อตรวจสอบว่าอุปกรณ์ปัจจุบันคือ iPhone หรือ iPad:

สวิฟท์ 5

struct Device {
    static let IS_IPAD = UIDevice.current.userInterfaceIdiom == .pad
    static let IS_IPHONE = UIDevice.current.userInterfaceIdiom == .phone
}

ใช้:

if(Device.IS_IPHONE){
    // device is iPhone
}if(Device.IS_IPAD){
    // device is iPad (or a Mac running under macOS Catalyst)
}else{
    // other
}

3

Swift 2.0 และ iOS 7+ / iOS 8+ / iOS 9+

public class Helper {
    public class var isIpad:Bool {
        if #available(iOS 8.0, *) {
            return UIScreen.mainScreen().traitCollection.userInterfaceIdiom == .Pad
        } else {
            return UIDevice.currentDevice().userInterfaceIdiom == .Pad
        }
    }
    public class var isIphone:Bool {
        if #available(iOS 8.0, *) {
            return UIScreen.mainScreen().traitCollection.userInterfaceIdiom == .Phone
        } else {
            return UIDevice.currentDevice().userInterfaceIdiom == .Phone
        }
    }
}

ใช้:

if Helper.isIpad {

}

หรือ

guard Helper.isIpad else {
    return
} 

ขอบคุณ @ user3378170


ขอบคุณ @ user3378170 สำหรับ iOS 9
YannSteph

3

FYI ฉันใช้UI_USER_INTERFACE_IDIOM()สำหรับแอพที่เขียนด้วย Swift แอพสามารถรวบรวมได้ดีกับ XCode 6.3.1 โดยไม่มีคำเตือนใด ๆ เกี่ยวกับคำสั่งนั้นทำงานได้ดีบน Simulator (พร้อมกับอุปกรณ์ที่เลือก) และบนอุปกรณ์จริงทั้งหมดของฉัน (iPhone, iPad) ที่มี iOS เวอร์ชัน 7.1 ถึง 8.3

อย่างไรก็ตามแอปพลิเคชันตรวจสอบบนอุปกรณ์ของผู้ตรวจสอบของ Apple (และถูกปฏิเสธ) ฉันใช้เวลาสองสามวันในการตรวจสอบปัญหาด้วยการอัปโหลดไปยัง iTunes Connect อีกสองสามครั้ง

ตอนนี้ฉันใช้UIDevice.currentDevice().userInterfaceIdiomแทนและแอพของฉันสามารถอยู่รอดได้จากการล่มดังกล่าว


ถูกต้องแน่นอน มันพังและทำให้ฉันปวดหัวมากเมื่อพยายามคิดออก
Praveen

คอมไพเลอร์ Swift ยังคงพังเมื่อใดก็ตามที่ฉันใช้ UI_USER_INTERFACE_IDIOM () ในรหัสของฉันโดยไม่มีข้อผิดพลาด ที่แปลกมาก.
tschoffelen

fwiw เอกสารของ Apple ระบุว่า "หากแอปของคุณทำงานใน iOS 3.2 และใหม่กว่าให้ใช้ userInterfaceIdiom แทน"
เดฟ

1

หากคุณต้องการตรวจสอบอุปกรณ์ปัจจุบันว่าเป็น iPad หรือ iPhone คุณสามารถใช้รหัสบรรทัดเหล่านี้:

 if(UIDevice.currentDevice().userInterfaceIdiom == .Pad){

  }else if(UIDevice.currentDevice().userInterfaceIdiom == .Phone){

  }

1

สวิฟท์ 3.0 :

let userInterface = UIDevice.current.userInterfaceIdiom

if(userInterface == .pad){
    //iPads
}else if(userInterface == .phone){
    //iPhone
}else if(userInterface == .carPlay){
    //CarPlay
}else if(userInterface == .tv){
    //AppleTV
}

1

เพิ่มคำตอบข้างบนสองสามข้อเพื่อให้คุณได้รับคืนชนิดแทนที่จะเป็นค่าสตริง

ฉันคิดว่านี่จะใช้สำหรับการปรับ UI เป็นหลักดังนั้นฉันจึงไม่คิดว่ามันจะเกี่ยวข้องกับการรวมรุ่นย่อยทั้งหมดเช่น iPhone 5s แต่สิ่งนี้สามารถขยายได้อย่างง่ายดายโดยการเพิ่มการทดสอบแบบจำลองใน isDevice Array

ผ่านการทดสอบการทำงานใน Swift 3.1 Xcode 8.3.2 พร้อมอุปกรณ์ทางกายภาพและอุปกรณ์จำลอง

การดำเนินงาน:

UIDevice.whichDevice()

public enum SVNDevice {
  case isiPhone4, isIphone5, isIphone6or7, isIphone6por7p, isIphone, isIpad, isIpadPro
}

extension UIDevice {
  class func whichDevice() -> SVNDevice? {
    let isDevice = { (comparision: Array<(Bool, SVNDevice)>) -> SVNDevice? in
      var device: SVNDevice?
      comparision.forEach({
        device = $0.0 ? $0.1 : device
      })
      return device
    }

    return isDevice([
      (UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH < 568.0, SVNDevice.isiPhone4),
      (UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 568.0, SVNDevice.isIphone5),
      (UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 667.0, SVNDevice.isIphone6or7),
      (UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 736.0, SVNDevice.isIphone6por7p),
      (UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1024.0, SVNDevice.isIpad),
      (UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1366.0, SVNDevice.isIpadPro)])
  }
}



private 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)
}

ฉันได้สร้างเฟรมเวิร์กที่เรียกว่าSVNBootstaperซึ่งรวมถึงโปรโตคอลผู้ช่วยนี้และอื่น ๆ เป็นแบบสาธารณะและพร้อมใช้งานผ่านทาง Carthage


0

ตั้งแต่ iOS 13 UI_USER_INTERFACE_IDIOMเลิกใช้แล้ว หากรหัสของคุณยังอยู่ในObj-Cคุณสามารถใช้ต่อไปนี้:

if (UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad) {
    // device is iPad
}

ที่ไหน:

typedef NS_ENUM(NSInteger, UIUserInterfaceIdiom) {
    UIUserInterfaceIdiomUnspecified = -1,
    UIUserInterfaceIdiomPhone API_AVAILABLE(ios(3.2)), // iPhone and iPod touch style UI
    UIUserInterfaceIdiomPad API_AVAILABLE(ios(3.2)), // iPad style UI
    UIUserInterfaceIdiomTV API_AVAILABLE(ios(9.0)), // Apple TV style UI
    UIUserInterfaceIdiomCarPlay API_AVAILABLE(ios(9.0)), // CarPlay style UI
};
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.