Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> iOS

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

ใช้ UIDevice.current.userInterfaceIdiom เพื่อทราบว่ารันบนอุปกรณ์ประเภทไหน

Enum ค่าที่เป็นไปได้

enum UIUserInterfaceIdiom: Int {
    case unspecified   // ไม่ระบุ
    case phone         // iPhone และ iPod touch
    case pad           // iPad
    case tv            // Apple TV (iOS 9+)
    case carPlay       // CarPlay (iOS 9+)
    case mac           // Mac Catalyst (iOS 13+)
    @available(iOS 14.0, *)
    case vision        // Apple Vision Pro
}

การใช้งานพื้นฐาน

let idiom = UIDevice.current.userInterfaceIdiom

switch idiom {
case .phone:
    print("📱 iPhone / iPod touch")
case .pad:
    print("📱 iPad")
case .tv:
    print("📺 Apple TV")
case .carPlay:
    print("🚗 CarPlay")
case .mac:
    print("💻 Mac (Catalyst)")
case .vision:
    print("🥽 Vision Pro")
default:
    print("❓ Unknown")
}

การใช้งานเฉพาะเจาะจง


// เช็ค iPad
if UIDevice.current.userInterfaceIdiom == .pad {
    // iPad-specific layout
    setupSplitViewController()
} else {
    // iPhone layout
    setupNavigationStack()
}

// Responsive Design
let isPad = UIDevice.current.userInterfaceIdiom == .pad
let columns = isPad ? 4 : 2
let fontSize: CGFloat = isPad ? 20 : 16

ร่วมกับ Size Classes (แนะนำมากกว่า)

แทนที่จะเช็ค Idiom ควรใช้ Trait Collections / Size Classes ซึ่งยืดหยุ่นกว่า:

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)
    
    if traitCollection.horizontalSizeClass == .regular {
        // iPad, iPhone Plus/Max landscape, Mac
        setupRegularLayout()
    } else {
        // iPhone portrait
        setupCompactLayout()
    }
}

สรุป

  • userInterfaceIdiom - ใช้สำหรับ Logic แบบคร่าวๆ (Phone vs Pad vs TV)
  • Size Classes - ใช้สำหรับ Layout Responsive (แนะนำ)
  • UIDevice.current.model - ชื่อโมเดล (เช่น "iPhone", "iPad") ไม่ใช่รุ่นเฉพาะ
  • UIDevice.current.name - ชื่อที่ผู้ใช้ตั้ง (เช่น "John's iPhone")