iOS, kullanıcının bir iPad'de olup olmadığını tespit eder


260

İPhone ve iPod Touch üzerinde çalışan bir uygulamam var, Retina iPad'de ve her şeyde çalışabilir, ancak bir ayar yapılması gerekiyor. Mevcut cihazın bir iPad olup olmadığını tespit etmem gerekiyor. Kullanıcının cihazımda bir iPad kullanıp kullanmadığını tespit etmek UIViewControllerve sonra buna göre bir şey değiştirmek için hangi kodu kullanabilirim ?

Yanıtlar:


589

Bir cihazın iPad olup olmadığını kontrol etmenin birkaç yolu vardır. Bu, cihazın aslında bir iPad olup olmadığını kontrol etmenin en sevdiğim yoludur:

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

Kullanım şeklim

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

Diğer Örnekler

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

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

Bir Swift çözümü için şu cevaba bakın: https://stackoverflow.com/a/27517536/2057171


23
Kullanım şekliniz olabildiğince verimli değil. UI_USER_INTERFACE_IDIOM()eşittir ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone). Sonucu bir yerde önbelleğe almanız daha iyi olabilir BOOL iPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; … if (iPad) ….
Marcelo Cantos

7
Son yönteminizde isEqualToString yerine hasPrefix kullanırdım. Bu şekilde kod simülatörde de çalışır.
elbuild

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

2
Godawful makro kullanımı. Kodunuzu gizlemenin harika bir yolu.
gnasher729

2
@ gnasher729 500+ kişi sizinle aynı fikirde değil. Snarky yorumlar yerine, bunu yapmak için daha iyi bir yolunuz olduğunu düşündüğünüz için neden kendi cevabınızı vermiyorsunuz?
WrightsCS

162

In Swift belirlemek için aşağıdaki Eşitlikler kullanabilirsiniz aygıtın türünü Evrensel uygulamalar üzerinde:

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

Kullanım o zaman şöyle bir şey olurdu:

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

3
Cevabınızın bağlantısını kabul edilen cevaba düzenliyorum. (Bu şekilde kredi de alırsınız). Bu objektif bir soru olmasına rağmen, bu soruyu görüntüleyen birçok kişi Google'dan geliyor ve bir Swift çözümü arıyor olabilir! : D
Albert Renshaw

1
Teşekkürler @AlbertRenshaw. Ben de öyle düşünmüştüm. :) Btw: Sorunun amacının özellikle Objective-C istemek olduğunu düşünmüyorum, ancak iOS için (o anda Obj-C idi). En azından Swift için de bu sorunun cevabını bulmayı beklerdim.
14:43

Merhaba @sevensevens, geri bildiriminiz için teşekkür ederiz. Bunu sadece denedim ve simülatörde iOS 9'u hedefleyen XCode 7.2'de benim için çalıştı. Hangi XCode sürümünü kullanıyorsunuz? Belki eski XCodes'da çalışmıyor? Dokümanlar userInterfaceIdiom'iOS 3.2 ve sonraki sürümlerde kullanılabilir' diyor . bu yüzden sorun olmamalı.
Jeehut

Veya iPad simülatöründe yalnızca iPhone uygulaması çalıştırıyor olabilir misiniz? Bu durumda, bu karışıklığı açıklar - ama aynı zamanda gerçek cihazlarda da bu şekilde davranmalıdır. @Yunus Nedim Mehel'in @Richards'ın bu durum .Phoneyerine geri döneceği cevabının yorumlarında belirttiği gibi .Pad.
Jeehut

Üzgünüz - simülatör iPhone'a ayarlanmıştı. 02:00 'de değişiklik yapmayı bırakmalıyım
sevensevens

35

Bu, iOS 3.2'den itibaren UIDevice'in bir parçasıdır, örneğin:

[UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad

4
deyim genellikle daha iyidir, ancak iPad'de bir iphone uygulaması çalıştırıyorsanız UIUserInterfaceIdiomPhone döndürür.
Yunus Nedim Mehel

25

Bunu da kullanabilirsiniz

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

24

UI_USER_INTERFACE_IDIOM()yalnızca uygulama iPad veya Universal içinse iPad'i döndürür. Onun bir iPad üzerinde çalışan bir iPhone uygulaması o zaman olmayacak. Bunun yerine modeli kontrol etmelisiniz.


15

Dikkatli olun: Uygulamanız yalnızca iPhone cihazını hedefliyorsa, iphone uyumlu modda çalışan iPad aşağıdaki ifade için false değerini döndürür:

#define IPAD     UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad

Fiziksel iPad cihazını tespit etmenin doğru yolu:

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

15

Xcode içindeki Simulator'da bazı çözümlerin benim için çalışmadığını buldum. Bunun yerine, bu çalışır:

objc

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

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

hızlı

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

Ayrıca Xcode'daki 'Diğer Örnekler'de cihaz modeli' iPad Simulator 'olarak geri geliyor, bu yüzden yukarıdaki ince ayar bunu çözmeli.


Belki Apple simülatörü "iPad simülatörü" veya "iPad 2.1" veya başka bir şey söyleyecek şekilde güncelledi ... hasSuffix:@"iPad"bunun yerine kullanabileceğiniz durum buysa isEqualToString@"iPad"... En iyi bahis simülatörün geri döndüğü cihaz modeline giriş yapmaktır. oradan ...
Albert Renshaw

8

Swift'te bunu yapmanın birçok yolu :

Aşağıdaki modeli kontrol ediyoruz (burada yalnızca büyük / küçük harfe duyarlı bir arama yapabiliriz):

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

Aşağıdaki modeli kontrol ediyoruz (burada büyük / küçük harfe duyarlı / duyarsız bir arama yapabiliriz):

    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().userInterfaceIdiomaşağıda iPad yalnızca uygulama iPad veya Universal içinse döndürür. Bir iPad'de çalıştırılan bir iPhone uygulamasıysa, olmayacaktır. Bunun yerine modeli kontrol etmelisiniz. :

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

Aşağıdaki snippet, sınıf bir miras almazsa derlenmez UIViewController, aksi takdirde gayet iyi çalışır. Ne olursa olsun UI_USER_INTERFACE_IDIOM()iPad sadece uygulama iPad veya Universal içinse döner. Bir iPad'de çalıştırılan bir iPhone uygulamasıysa, olmayacaktır. Bunun yerine modeli kontrol etmelisiniz. :

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

2
Hızlıca Objective-C etiketli sorulara eski cevapları yeniden yazmaya ihtiyaç olduğunu düşünmüyorum.
Christian Schnorr

4
Kesinlikle cevabımın yararlı olduğunu düşünüyorum çünkü öncelikle tüm cevaplar yığın taşmasına dağılmış durumda. İkincisi, iOS'un eski sürümleriyle çalışanlar bazen iOS 8 ve üstü ile düzgün çalışmaz. Bu yüzden bu çözümleri test ettim ve bu cevap son derece yararlı olabilir. Bu yüzden sana katılmıyorum.
King-Wizard

Bunun üzerine Swift'te sözdizimi farklıdır. Bu nedenle, herkesin cevabın akıllı bir kopyasını yapması ve belirli güncel somun ve cıvataları anlaması her zaman yararlıdır.
King-Wizard


8

*

Hızlı 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

Birçok Yanıt iyi ama hızlı 4'te böyle kullanıyorum

  1. Sabit Oluştur

    struct App {
        static let isRunningOnIpad = UIDevice.current.userInterfaceIdiom == .pad ? true : false
    }
  2. Bunun gibi kullan

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

Düzenleme: Önerildiği gibi C Asur sadece UIDevice bir uzantı oluşturmak

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

3
AppBir UIDeviceuzantıyla aynı şeyi yapabildiğinizde neden bir yapı ile uğraşıyorsunuz ?
Cœur

3

İPad'in böyle olduğunu görmek için rangeOfString öğesini kontrol edebilirsiniz.

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 != NSNotFoundtrue değerini döndürür.
Cœur

2

Yine başka bir Swifty yolu:

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

Kullanımı:

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

In Swift 4.2 ve 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
}

Belirli bir cihazı tespit etmek istiyorsanız

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

Neden bu kadar karmaşık? Ben böyle yaparım ...

Hızlı 4:

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

Bu şekilde söyleyebilirsin if iPad {}


1
Not: Bu soru 2012 yılında soruldu
Albert Renshaw

0

İOS'un en son sürümleri için UITraitCollectionşunları eklemeniz yeterlidir :

extension UITraitCollection {

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

ve sonra UIViewControllersadece kontrol et:

if traitCollection.isIpad { ... }

4
Bu, iPad Uygulaması Bölünmüş Ekran Modundayken de çalışır mı? Sonra yatay boyut sınıfı kompakt olacaktır.
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");
  }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.