iOS mendeteksi jika pengguna menggunakan iPad


260

Saya memiliki aplikasi yang berjalan di iPhone dan iPod Touch, dapat berjalan di Retina iPad dan segalanya tetapi harus ada satu penyesuaian. Saya perlu mendeteksi apakah perangkat saat ini adalah iPad. Kode apa yang dapat saya gunakan untuk mendeteksi jika pengguna menggunakan iPad di saya UIViewControllerdan kemudian mengubah sesuatu yang sesuai?

Jawaban:


589

Ada beberapa cara untuk memeriksa apakah suatu perangkat adalah iPad. Ini adalah cara favorit saya untuk memeriksa apakah perangkat itu sebenarnya sebuah iPad:

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

Cara saya menggunakannya

#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. */
}   

Contoh lain

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

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

Untuk solusi Swift, lihat jawaban ini: https://stackoverflow.com/a/27517536/2057171


23
Cara Anda menggunakannya tidak seefisien mungkin. UI_USER_INTERFACE_IDIOM()setara dengan ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone). Anda mungkin akan lebih baik caching hasil suatu tempat: BOOL iPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; … if (iPad) ….
Marcelo Cantos

7
Saya akan menggunakan hasPrefix daripada isEqualToString dalam metode terakhir Anda. Dengan cara ini kode juga berfungsi pada simulator.
elbuild

18
Swift:if UIDevice.currentDevice().userInterfaceIdiom == .Pad
Pang

2
Penggunaan makro yang luar biasa. Cara hebat untuk mengaburkan kode Anda.
gnasher729

2
@ gnasher729 500+ orang cenderung tidak setuju dengan Anda. Alih-alih komentar tajam, mengapa Anda tidak memberikan jawaban sendiri karena Anda pikir Anda memiliki cara yang lebih baik untuk melakukan ini.
WrightsCS

162

Di Swift Anda dapat menggunakan persamaan berikut untuk menentukan jenis perangkat pada aplikasi Universal:

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

Penggunaan kemudian akan menjadi seperti:

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

3
Saya sedang mengedit tautan ke jawaban Anda menjadi jawaban yang diterima. (Dengan cara ini Anda mendapatkan kredit juga). Meskipun ini adalah pertanyaan objektif-c, banyak orang yang melihat pertanyaan ini berasal dari Google dan mungkin mencari solusi Swift! : D
Albert Renshaw

1
Terima kasih, @AlbertRenshaw. Saya juga berpikir begitu. :) Btw: Saya kira maksud pertanyaannya bukan untuk menanyakan secara khusus untuk Objective-C, tetapi untuk iOS (yang merupakan Obj-C pada saat itu). Setidaknya saya akan berharap untuk menemukan jawaban di bawah pertanyaan ini untuk Swift juga.
Jeehut

Hai @sevensevens, terima kasih atas tanggapan Anda. Saya baru saja mencoba ini dan itu berhasil untuk saya di XCode 7.2 yang menargetkan iOS 9 di simulator. XCode versi apa yang Anda gunakan? Mungkin itu tidak berfungsi pada Xcode lama? Dokumen mengatakan userInterfaceIdiom'Tersedia di iOS 3.2 dan yang lebih baru.' jadi itu seharusnya bukan masalah.
Jeehut

Atau mungkinkah Anda menjalankan aplikasi khusus iPhone di simulator iPad? Dalam hal itu, itu akan menjelaskan kebingungan - tetapi seharusnya juga berperilaku seperti ini pada perangkat nyata, saya pikir. Seperti yang ditunjukkan @Yunus Nedim Mehel di komentar dari @ Richards menjawab situasi itu akan kembali .Phonebukan .Pad.
Jeehut

Maaf - simulator telah disetel ke iPhone. Harus berhenti melakukan perubahan pada pukul 02:00
sevensevens

35

Ini adalah bagian dari UIDevice pada iOS 3.2, misalnya:

[UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad

4
idiom umumnya lebih baik tetapi jika Anda menjalankan aplikasi iphone di iPad daripada ini akan mengembalikan UIUserInterfaceIdiomPhone.
Yunus Nedim Mehel

25

Anda juga bisa menggunakan ini

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

24

UI_USER_INTERFACE_IDIOM()hanya mengembalikan iPad jika aplikasi untuk iPad atau Universal. Jika ini merupakan aplikasi iPhone yang berjalan di iPad maka tidak akan. Jadi, Anda sebaiknya memeriksa model.


15

Hati-hati: Jika aplikasi Anda hanya menargetkan perangkat iPhone, iPad yang menjalankan dengan mode yang kompatibel dengan iPhone akan kembali palsu untuk pernyataan di bawah ini:

#define IPAD     UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad

Cara yang tepat untuk mendeteksi perangkat iPad fisik adalah:

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

15

Saya menemukan bahwa beberapa solusi tidak berfungsi untuk saya di Simulator dalam Xcode. Sebaliknya, ini berfungsi:

ObjC

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

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

Cepat

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

Juga di 'Contoh Lain' di Xcode model perangkat kembali sebagai 'iPad Simulator' sehingga tweak di atas harus menyelesaikannya.


Mungkin Apple memperbarui simulator untuk mengatakan sesuatu seperti "iPad simulator" atau "iPad 2.1" atau sesuatu ... jika itu yang Anda dapat gunakan hasSuffix:@"iPad"alih-alih isEqualToString@"iPad"... taruhan terbaik Anda adalah untuk Log model perangkat yang simulator kembali dan pergi dari sana ...
Albert Renshaw

8

Banyak cara untuk melakukannya di Swift :

Kami memeriksa model di bawah ini (kami hanya dapat melakukan pencarian case-sensitive di sini):

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

Kami memeriksa model di bawah ini (kami dapat melakukan pencarian case / sensitive peka di sini):

    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().userInterfaceIdiomdi bawah ini hanya mengembalikan iPad jika aplikasi untuk iPad atau Universal. Jika itu adalah aplikasi iPhone yang dijalankan pada iPad maka tidak akan. Jadi, Anda sebaiknya memeriksa model. :

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

Cuplikan di bawah ini tidak dapat dikompilasi jika kelas tidak mewarisi UIViewController, jika tidak, ia berfungsi dengan baik. Apapun UI_USER_INTERFACE_IDIOM()hanya mengembalikan iPad jika aplikasi untuk iPad atau Universal. Jika itu adalah aplikasi iPhone yang dijalankan pada iPad maka tidak akan. Jadi, Anda sebaiknya memeriksa model. :

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

2
Saya tidak berpikir ada kebutuhan untuk menulis ulang jawaban lama untuk pertanyaan yang ditandai Objective-C menjadi cepat.
Christian Schnorr

4
Saya pasti berpikir bahwa jawaban saya berguna karena pertama-tama semua jawaban tersebar di stack overflow. Kedua apa yang bekerja dengan versi iOS yang lebih lama kadang-kadang tidak bekerja dengan benar dengan iOS 8 dan di atasnya. Jadi saya menguji solusi ini dan jawaban ini bisa sangat berguna. Jadi saya sama sekali tidak setuju dengan Anda.
King-Wizard

Selain itu sintaksnya berbeda dalam Swift. Jadi, selalu bermanfaat bagi semua orang untuk melakukan copy paste jawaban yang cerdas dan memahami mur dan baut terkini yang mutakhir.
King-Wizard


8

*

Dalam cepat 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

Banyak Jawaban baik tetapi saya gunakan seperti ini di cepat 4

  1. Buat Konstan

    struct App {
        static let isRunningOnIpad = UIDevice.current.userInterfaceIdiom == .pad ? true : false
    }
  2. Gunakan seperti ini

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

Sunting: Seperti yang Disarankan - cukup buat ekstensi di UIDevice

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

3
Mengapa repot dengan Appstruct ketika Anda dapat melakukan hal yang sama dengan UIDeviceekstensi?
Cœur

3

Anda dapat memeriksa rangeOfString untuk melihat kata iPad yang ada seperti ini.

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 != NSNotFoundmengembalikan true.
Cœur

2

Cara Swifty yang lain:

//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 }
}

Pemakaian:

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

Di Swift 4.2 dan 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
}

Jika Anda ingin mendeteksi perangkat tertentu

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

Kenapa begitu rumit? Ini adalah bagaimana saya melakukannya ...

Swift 4:

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

Dengan cara ini Anda bisa mengatakannya if iPad {}


1
Catatan: Pertanyaan ini diajukan pada 2012
Albert Renshaw

0

Untuk versi terbaru iOS, cukup tambahkan UITraitCollection:

extension UITraitCollection {

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

dan kemudian UIViewControllerhanya memeriksa:

if traitCollection.isIpad { ... }

4
Apakah ini juga berfungsi ketika iPad-App dalam Mode Layar Terpisah? Maka kelas ukuran horizontal akan menjadi kompak.
Oliver

0
if(UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.pad)
 {
            print("This is iPad")
 }else if (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.phone)
 {
            print("This is iPhone");
  }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.