iOS ตรวจพบว่าผู้ใช้อยู่บน iPad หรือไม่


260

ฉันมีแอพที่ทำงานบน iPhone และ iPod Touch มันสามารถทำงานได้บน Retina iPad และทุกอย่าง แต่ต้องมีการปรับแต่งหนึ่งครั้ง ฉันต้องการตรวจสอบว่าอุปกรณ์ปัจจุบันเป็น iPad หรือไม่ ฉันสามารถใช้รหัสใดในการตรวจสอบว่าผู้ใช้กำลังใช้ iPad ในของฉันUIViewControllerและเปลี่ยนบางสิ่งตามนั้นหรือไม่

คำตอบ:


589

มีหลายวิธีในการตรวจสอบว่าอุปกรณ์เป็น iPad หรือไม่ นี่เป็นวิธีที่ฉันโปรดปรานในการตรวจสอบว่าอุปกรณ์นั้นเป็น iPad จริงหรือไม่:

if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )
{
    return YES; /* Device is iPad */
}

วิธีที่ฉันใช้มัน

#define IDIOM    UI_USER_INTERFACE_IDIOM()
#define IPAD     UIUserInterfaceIdiomPad

if ( IDIOM == IPAD ) {
    /* do something specifically for iPad. */
} else {
    /* do something specifically for iPhone or iPod touch. */
}   

ตัวอย่างอื่น ๆ

if ( [(NSString*)[UIDevice currentDevice].model hasPrefix:@"iPad"] ) {
    return YES; /* Device is iPad */
}

#define IPAD     (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
if ( IPAD ) 
     return YES;

สำหรับโซลูชัน Swift ดูคำตอบนี้: https://stackoverflow.com/a/27517536/2057171


23
วิธีที่คุณใช้มันไม่มีประสิทธิภาพเท่าที่ควร เทียบเท่ากับUI_USER_INTERFACE_IDIOM() ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone)คุณอาจจะดีกว่าในการแคชผลลัพธ์บางแห่ง: BOOL iPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; … if (iPad) ….
Marcelo Cantos

7
ฉันจะใช้ hasPrefix มากกว่า isEqualToString ในวิธีสุดท้ายของคุณ ด้วยวิธีนี้รหัสทำงานบนตัวจำลองเช่นกัน
elbuild

18
สวิฟท์:if UIDevice.currentDevice().userInterfaceIdiom == .Pad
ปาง

2
การใช้งานมาโครที่น่าภาคภูมิใจ วิธีที่ดีในการทำให้รหัสของคุณสับสน
gnasher729

2
@ gnasher729 500+ คนมักจะไม่เห็นด้วยกับคุณ แทนที่จะแสดงความคิดเห็นที่น่ารังเกียจทำไมคุณไม่ตอบคำถามเองเพราะคุณคิดว่าคุณมีวิธีที่ดีกว่าในการทำสิ่งนี้
WrightsCS

162

ในSwiftคุณสามารถใช้ความเท่าเทียมกันดังต่อไปนี้เพื่อกำหนดประเภทของอุปกรณ์ในแอพสากล

UIDevice.current.userInterfaceIdiom == .phone
// or
UIDevice.current.userInterfaceIdiom == .pad

การใช้งานจะเป็นเช่น:

if UIDevice.current.userInterfaceIdiom == .pad {
    // Available Idioms - .pad, .phone, .tv, .carPlay, .unspecified
    // Implement your logic here
}

3
ฉันกำลังแก้ไขลิงก์ไปยังคำตอบของคุณเป็นคำตอบที่ยอมรับแล้ว (วิธีนี้คุณจะได้รับเครดิตด้วย) แม้ว่านี่จะเป็นคำถามที่มีวัตถุประสงค์ แต่คนจำนวนมากที่ดูคำถามนี้มาจาก Google และอาจกำลังค้นหาวิธีแก้ไขปัญหา Swift! : D
Albert Renshaw

1
ขอบคุณ @AlbertRenshaw ฉันก็คิดเช่นกัน :) Btw: ฉันไม่คิดว่าเจตนาของคำถามคือถามเฉพาะสำหรับ Objective-C แต่สำหรับ iOS (ซึ่งเป็น Obj-C ในขณะนั้น) อย่างน้อยฉันก็คาดว่าจะพบคำตอบสำหรับคำถามนี้สำหรับ Swift เช่นกัน
Jeehut

สวัสดี @evensevens ขอขอบคุณสำหรับความคิดเห็นของคุณ ฉันเพิ่งลองทำสิ่งนี้และมันได้ผลกับฉันใน XCode 7.2 ที่กำหนดเป้าหมาย iOS 9 ในเครื่องจำลอง คุณกำลังใช้ XCode รุ่นใด บางทีมันอาจไม่ทำงานกับ XCodes รุ่นเก่าใช่ไหม เอกสารดังกล่าวuserInterfaceIdiomคือ 'มีให้ใน iOS 3.2 และใหม่กว่า' ดังนั้นไม่ควรเป็นปัญหา
Jeehut

หรืออาจเป็นเพราะคุณใช้งานแอพ iPhone อย่างเดียวบนเครื่องจำลอง iPad ในกรณีนั้นมันจะอธิบายความสับสน - แต่มันก็ควรทำตัวแบบนี้กับอุปกรณ์จริงด้วย เป็นจุด @Yunus Nedim Mehel ออกในความคิดเห็นของคำตอบ @Richards ที่สถานการณ์จะกลับมาแทน.Phone .Pad
Jeehut

ขออภัย - เครื่องจำลองได้ตั้งไว้ที่ iPhone ต้องหยุดการเปลี่ยนแปลงเวลา 2AM
sevensevens

35

นี่เป็นส่วนหนึ่งของ UIDevice ตั้งแต่ iOS 3.2 เป็นต้นไป

[UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad

4
โดยทั่วไปแล้วสำนวนจะดีกว่า แต่ถ้าคุณใช้แอพ iphone บน iPad มากกว่านี้จะคืนค่า UIUserInterfaceIdiomPhone
Yunus Nedim Mehel

25

คุณยังสามารถใช้สิ่งนี้

#define IPAD UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad
...
if (IPAD) {
   // iPad
} else {
   // iPhone / iPod Touch
}

24

UI_USER_INTERFACE_IDIOM()คืนค่า iPad เฉพาะหากแอปนั้นใช้สำหรับ iPad หรือสากล หากแอพของ iPhone ทำงานบน iPad แสดงว่าไม่เป็นเช่นนั้น ดังนั้นคุณควรตรวจสอบโมเดลแทน


15

ระวัง: หากแอปของคุณกำหนดเป้าหมายไปที่อุปกรณ์ iPhone เท่านั้น iPad ที่รันด้วยโหมดที่ใช้งานร่วมกับ iPhone ได้จะส่งคืนค่าเท็จสำหรับข้อความด้านล่าง

#define IPAD     UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad

วิธีที่ถูกต้องในการตรวจสอบอุปกรณ์ iPad ทางกายภาพคือ:

#define IS_IPAD_DEVICE      ([(NSString *)[UIDevice currentDevice].model hasPrefix:@"iPad"])

15

ฉันพบว่าโซลูชันบางอย่างไม่ทำงานสำหรับฉันใน Simulator ภายใน Xcode สิ่งนี้ใช้ได้ผล:

ObjC

NSString *deviceModel = (NSString*)[UIDevice currentDevice].model;

if ([[deviceModel substringWithRange:NSMakeRange(0, 4)] isEqualToString:@"iPad"]) {
    DebugLog(@"iPad");
} else {
    DebugLog(@"iPhone or iPod Touch");
}

รวดเร็ว

if UIDevice.current.model.hasPrefix("iPad") {
    print("iPad")
} else {
    print("iPhone or iPod Touch")
}

นอกจากนี้ใน 'ตัวอย่างอื่น ๆ ' ใน Xcode รุ่นอุปกรณ์จะกลับมาเป็น 'iPad Simulator' ดังนั้นการปรับแต่งดังกล่าวข้างต้นควรเรียงลำดับนั้น


บางที Apple ได้อัปเดตตัวจำลองเพื่อพูดบางอย่างเช่น "ตัวจำลอง iPad" หรือ "iPad 2.1" หรือบางอย่าง ... หากเป็นกรณีที่คุณสามารถใช้hasSuffix:@"iPad"แทนisEqualToString@"iPad"... ทางออกที่ดีที่สุดของคุณคือการบันทึกรุ่นอุปกรณ์ที่ตัวจำลองกลับมา จากที่นั่น ...
อัลเบิร์ตเรนชอว์

8

มีหลายวิธีที่จะทำเช่นนั้นในSwift :

เราตรวจสอบรูปแบบด้านล่าง (เราสามารถทำการค้นหาด้วยตัวพิมพ์เล็กและตัวพิมพ์ได้ที่นี่):

class func isUserUsingAnIpad() -> Bool {
    let deviceModel = UIDevice.currentDevice().model
    let result: Bool = NSString(string: deviceModel).containsString("iPad")
    return result
}

เราตรวจสอบโมเดลด้านล่าง (เราสามารถทำการค้นหาแบบตรงตามตัวพิมพ์เล็ก / ใหญ่) ได้ที่นี่:

    class func isUserUsingAnIpad() -> Bool {
        let deviceModel = UIDevice.currentDevice().model
        let deviceModelNumberOfCharacters: Int = count(deviceModel)
        if deviceModel.rangeOfString("iPad",
                                     options: NSStringCompareOptions.LiteralSearch,
                                     range: Range<String.Index>(start: deviceModel.startIndex,
                                                                end: advance(deviceModel.startIndex, deviceModelNumberOfCharacters)),
                                     locale: nil) != nil {
            return true
        } else {
            return false
        }
   }

UIDevice.currentDevice().userInterfaceIdiomด้านล่างจะแสดงผลเป็น iPad ก็ต่อเมื่อแอพนี้มีไว้สำหรับ iPad หรือ Universal หากเป็นแอพของ iPhone ที่ใช้งานบนไอแพดก็จะไม่เป็นเช่นนั้น ดังนั้นคุณควรตรวจสอบโมเดลแทน :

    class func isUserUsingAnIpad() -> Bool {
        if UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Pad {
            return true
        } else {
            return false
        }
   }

ตัวอย่างด้านล่างนี้ไม่ได้รวบรวมหากชั้นเรียนไม่ได้รับมรดกของUIViewControllerมิฉะนั้นมันก็ใช้ได้ดี UI_USER_INTERFACE_IDIOM()จะส่งคืน iPad โดยไม่คำนึงถึงว่าแอพนั้นมีไว้สำหรับ iPad หรือ Universal หากเป็นแอพของ iPhone ที่ใช้งานบนไอแพดก็จะไม่เป็นเช่นนั้น ดังนั้นคุณควรตรวจสอบโมเดลแทน :

class func isUserUsingAnIpad() -> Bool {
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.Pad) {
        return true
    } else {
        return false
    }
}

2
ฉันไม่คิดว่ามีความจำเป็นต้องเขียนคำตอบเก่าสำหรับคำถามที่ติดแท็ก Objective-C เพื่อให้รวดเร็ว
Christian Schnorr

4
ฉันคิดว่าคำตอบของฉันมีประโยชน์เพราะประการแรกคำตอบทั้งหมดกระจัดกระจายอยู่ในกองล้น ประการที่สองสิ่งที่ทำงานกับ iOS เวอร์ชันเก่าบางครั้งทำงานได้ไม่ถูกต้องกับ iOS 8 ขึ้นไป ดังนั้นฉันทดสอบโซลูชันเหล่านี้และคำตอบนี้มีประโยชน์อย่างมาก ดังนั้นฉันไม่เห็นด้วยกับคุณเลย
King-Wizard

ด้านบนของที่ไวยากรณ์แตกต่างกันใน Swift ดังนั้นจึงเป็นประโยชน์สำหรับทุกคนที่จะทำสำเนาวางแบบชาญฉลาดของคำตอบและทำความเข้าใจกับถั่วและสลักเกลียวที่ทันสมัย
King-Wizard


8

* * * *

ใน 3.0 รวดเร็ว

* * * *

 if UIDevice.current.userInterfaceIdiom == .pad {
        //pad
    } else if UIDevice.current.userInterfaceIdiom == .phone {
        //phone
    } else if UIDevice.current.userInterfaceIdiom == .tv {
        //tv
    } else if UIDevice.current.userInterfaceIdiom == .carPlay {
        //CarDisplay
    } else {
        //unspecified
    }

8

คำตอบมากมายนั้นดี แต่ฉันใช้แบบนี้ใน 4 อย่างรวดเร็ว

  1. สร้างค่าคงที่

    struct App {
        static let isRunningOnIpad = UIDevice.current.userInterfaceIdiom == .pad ? true : false
    }
  2. ใช้แบบนี้

    if App.isRunningOnIpad {
        return load(from: .main, identifier: identifier)
    } else {
        return load(from: .ipad, identifier: identifier)
    }

แก้ไข: ตามที่แนะนำCœurเพียงแค่สร้างส่วนขยายบน UIDevice

extension UIDevice {
    static let isRunningOnIpad = UIDevice.current.userInterfaceIdiom == .pad ? true : false
}

3
ทำไมต้องกังวลกับโครงสร้างAppเมื่อคุณสามารถทำเช่นเดียวกันกับUIDeviceส่วนขยายได้
Cœur

3

คุณสามารถตรวจสอบ rangeOfString เพื่อดูคำว่า iPad มีอยู่เช่นนี้

NSString *deviceModel = (NSString*)[UIDevice currentDevice].model;

if ([deviceModel rangeOfString:@"iPad"].location != NSNotFound)  {
NSLog(@"I am an iPad");
} else {
NSLog(@"I am not an iPad");
}

["I am not an iPad" rangeOfString:@"iPad"].location != NSNotFoundผลตอบแทนจริง
Cœur

2

อีกวิธีหนึ่งที่รวดเร็ว:

//MARK: -  Device Check
let iPad = UIUserInterfaceIdiom.Pad
let iPhone = UIUserInterfaceIdiom.Phone
@available(iOS 9.0, *) /* AppleTV check is iOS9+ */
let TV = UIUserInterfaceIdiom.TV

extension UIDevice {
    static var type: UIUserInterfaceIdiom 
        { return UIDevice.currentDevice().userInterfaceIdiom }
}

การใช้งาน:

if UIDevice.type == iPhone {
    //it's an iPhone!
}

if UIDevice.type == iPad {
    //it's an iPad!
}

if UIDevice.type == TV {
    //it's an TV!
}

2

ในSwift 4.2และ Xcode 10

if UIDevice().userInterfaceIdiom == .phone {
    //This is iPhone
} else if UIDevice().userInterfaceIdiom == .pad { 
    //This is iPad
} else if UIDevice().userInterfaceIdiom == .tv {
    //This is Apple TV
}

หากคุณต้องการตรวจจับอุปกรณ์เฉพาะ

let screenHeight = UIScreen.main.bounds.size.height
if UIDevice().userInterfaceIdiom == .phone {
    if (screenHeight >= 667) {
        print("iPhone 6 and later")
    } else if (screenHeight == 568) {
        print("SE, 5C, 5S")
    } else if(screenHeight<=480){
        print("4S")
    }
} else if UIDevice().userInterfaceIdiom == .pad { 
    //This is iPad
}

1

ทำไมจึงซับซ้อน นี่คือวิธีที่ฉันทำ ...

สวิฟท์ 4:

var iPad : Bool {
    return UIDevice.current.model.contains("iPad")
}

ด้วยวิธีนี้คุณสามารถพูดได้ if iPad {}


1
หมายเหตุ: คำถามนี้ถูกถามในปี 2012
Albert Renshaw

0

สำหรับ iOS เวอร์ชันล่าสุดเพียงเพิ่มUITraitCollection:

extension UITraitCollection {

    var isIpad: Bool {
        return horizontalSizeClass == .regular && verticalSizeClass == .regular
    }
}

จากนั้นUIViewControllerตรวจสอบภายใน:

if traitCollection.isIpad { ... }

4
ใช้งานได้หรือไม่เมื่อ iPad-App อยู่ในโหมด Split Screen จากนั้นขนาดชั้นแนวนอนจะกะทัดรัด
โอลิเวอร์

0
if(UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.pad)
 {
            print("This is iPad")
 }else if (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.phone)
 {
            print("This is iPhone");
  }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.