iOS erkennt, ob sich der Benutzer auf einem iPad befindet


260

Ich habe eine App, die auf dem iPhone und dem iPod Touch ausgeführt wird. Sie kann auf dem Retina iPad ausgeführt werden und alles, außer es muss eine Anpassung vorgenommen werden. Ich muss feststellen, ob das aktuelle Gerät ein iPad ist. Welchen Code kann ich verwenden, um festzustellen, ob der Benutzer ein iPad in meinem verwendet, UIViewControllerund dann etwas entsprechend ändern?

Antworten:


589

Es gibt verschiedene Möglichkeiten, um zu überprüfen, ob es sich bei einem Gerät um ein iPad handelt. Dies ist meine bevorzugte Methode, um zu überprüfen, ob das Gerät tatsächlich ein iPad ist:

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

So wie ich es benutze

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

Andere Beispiele

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

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

Eine Swift-Lösung finden Sie in dieser Antwort: https://stackoverflow.com/a/27517536/2057171


23
Die Art und Weise, wie Sie es verwenden, ist nicht so effizient wie es sein könnte. UI_USER_INTERFACE_IDIOM()ist äquivalent zu ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone). Möglicherweise ist es besser, das Ergebnis irgendwo zwischenzuspeichern : BOOL iPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; … if (iPad) ….
Marcelo Cantos

7
Ich würde in Ihrer letzten Methode eher hasPrefix als isEqualToString verwenden. Auf diese Weise funktioniert der Code auch auf dem Simulator.
Elbuild

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

2
Gottlose Verwendung von Makros. Gute Möglichkeit, Ihren Code zu verschleiern.
gnasher729

2
@ gnasher729 Über 500 Menschen neigen dazu, Ihnen nicht zuzustimmen. Warum geben Sie nicht anstelle der snarky Kommentare Ihre eigene Antwort, da Sie der Meinung sind, dass Sie einen besseren Weg haben, dies zu tun.
WrightsCS

162

In Swift können Sie die folgenden Gleichungen verwenden, um die Art des Geräts in Universal Apps zu bestimmen :

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

Die Verwendung wäre dann so etwas wie:

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

3
Ich bearbeite einen Link zu Ihrer Antwort in die akzeptierte Antwort. (Auf diese Weise erhalten Sie auch Gutschrift). Obwohl dies eine objektive Frage ist, kommen viele Leute, die diese Frage sehen, von Google und suchen möglicherweise nach einer Swift-Lösung! : D
Albert Renshaw

1
Vielen Dank, @AlbertRenshaw. Das dachte ich auch. :) Übrigens: Ich glaube nicht, dass die Absicht der Frage darin bestand, speziell nach Objective-C zu fragen, sondern nach iOS (was zu diesem Zeitpunkt Obj-C war). Zumindest hätte ich erwartet, die Antwort unter dieser Frage auch für Swift zu finden.
Jeehut

Hallo @sevensevens, danke für dein Feedback. Ich habe das gerade ausprobiert und es hat in XCode 7.2 für iOS 9 im Simulator funktioniert. Welche Version von XCode verwenden Sie? Vielleicht funktioniert es bei älteren XCodes nicht? In den Dokumenten heißt userInterfaceIdiomes: "Verfügbar in iOS 3.2 und höher." Das sollte also nicht das Problem sein.
Jeehut

Oder könnte es sein, dass Sie eine iPhone-App auf dem iPad-Simulator ausführen? In diesem Fall würde das die Verwirrung erklären - aber es sollte sich auch auf realen Geräten so verhalten, denke ich. Wie @Yunus Nedim Mehel in den Kommentaren von @Richards betont, wird diese Situation .Phonestatt zurückkehren .Pad.
Jeehut

Entschuldigung - hatte den Simulator auf iPhone eingestellt. Ich muss aufhören, Änderungen um 2 Uhr
morgens

35

Dies ist Teil von UIDevice ab iOS 3.2, z.

[UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad

4
idiom ist im Allgemeinen besser, aber wenn Sie eine iPhone-App auf dem iPad ausführen, wird UIUserInterfaceIdiomPhone zurückgegeben.
Yunus Nedim Mehel

25

Sie können dies auch verwenden

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

24

UI_USER_INTERFACE_IDIOM()Gibt das iPad nur zurück, wenn die App für das iPad oder Universal ist. Wenn es sich um eine iPhone-App handelt, die auf einem iPad ausgeführt wird, wird dies nicht der Fall sein. Sie sollten stattdessen das Modell überprüfen.


15

Seien Sie vorsichtig: Wenn Ihre App nur auf iPhone-Geräte abzielt, gibt das iPad, das mit dem iPhone-kompatiblen Modus ausgeführt wird, für die folgende Aussage false zurück:

#define IPAD     UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad

Der richtige Weg, um ein physisches iPad-Gerät zu erkennen, ist:

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

15

Ich habe festgestellt, dass eine Lösung im Simulator von Xcode für mich nicht funktioniert hat. Stattdessen funktioniert dies:

ObjC

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

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

Schnell

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

Auch in den 'Anderen Beispielen' in Xcode wird das Gerätemodell als 'iPad Simulator' zurückgegeben, sodass die obige Optimierung dies klären sollte.


Vielleicht hat Apple den Simulator aktualisiert, um etwas wie "iPad-Simulator" oder "iPad 2.1" oder so etwas zu sagen ... wenn dies der Fall ist, den Sie hasSuffix:@"iPad"anstelle von isEqualToString@"iPad"... verwenden könnten, ist es am besten, das Gerätemodell zu protokollieren, das der Simulator zurückgibt und loslegt von dort ...
Albert Renshaw

8

Viele Möglichkeiten, dies in Swift zu tun :

Wir überprüfen das folgende Modell (wir können hier nur zwischen Groß- und Kleinschreibung suchen):

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

Wir überprüfen das folgende Modell (wir können hier eine Suche ohne Berücksichtigung der Groß- / Kleinschreibung durchführen):

    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().userInterfaceIdiomunten gibt iPad nur zurück, wenn die App für iPad oder Universal ist. Wenn es sich um eine iPhone-App handelt, die auf einem iPad ausgeführt wird, wird dies nicht der Fall sein. Sie sollten stattdessen das Modell überprüfen. ::

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

Dieses Snippet unten wird nicht kompiliert, wenn die Klasse kein erbt UIViewController, andernfalls funktioniert es einwandfrei. Unabhängig davon UI_USER_INTERFACE_IDIOM()gibt iPad nur zurück, wenn die App für iPad oder Universal ist. Wenn es sich um eine iPhone-App handelt, die auf einem iPad ausgeführt wird, wird dies nicht der Fall sein. Sie sollten stattdessen das Modell überprüfen. ::

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

2
Ich glaube nicht, dass es notwendig ist, alte Antworten auf Fragen mit dem Tag Objective-C schnell umzuschreiben.
Christian Schnorr

4
Ich denke definitiv, dass meine Antwort nützlich ist, da zunächst alle Antworten auf den Stapelüberlauf verteilt sind. Zweitens funktioniert das, was mit älteren Versionen von iOS funktioniert hat, manchmal mit iOS 8 und höher nicht richtig. Deshalb habe ich diese Lösungen getestet und diese Antwort kann sehr nützlich sein. Also stimme ich dir überhaupt nicht zu.
König-Zauberer

Darüber hinaus unterscheidet sich die Syntax in Swift. Daher ist es für jeden immer nützlich, eine intelligente Kopie der Antwort einzufügen und die spezifischen aktuellen Schrauben und Muttern zu verstehen.
König-Zauberer


8

* *

In schnellem 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

Viele Antworten sind gut, aber ich benutze so in Swift 4

  1. Konstante erstellen

    struct App {
        static let isRunningOnIpad = UIDevice.current.userInterfaceIdiom == .pad ? true : false
    }
  2. Verwenden Sie so

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

Bearbeiten: Wie vorgeschlagen Cœur einfach eine Erweiterung auf UIDevice erstellen

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

3
Warum sich mit einer AppStruktur beschäftigen, wenn Sie dasselbe mit einer UIDeviceErweiterung tun können ?
Cœur

3

Sie können den rangeOfString überprüfen, um festzustellen, ob das Wort iPad so existiert.

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 != NSNotFoundgibt true zurück.
Cœur

2

Noch ein schneller Weg:

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

Verwendung:

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

Wenn Sie ein bestimmtes Gerät erkennen möchten

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

Warum so kompliziert? So mache ich das ...

Swift 4:

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

Auf diese Weise kann man einfach sagen if iPad {}


1
Hinweis: Diese Frage wurde im Jahr 2012 gestellt
Albert Renshaw

0

Für die neuesten Versionen von iOS fügen Sie einfach Folgendes hinzu UITraitCollection:

extension UITraitCollection {

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

und dann innerhalb von UIViewControllernur überprüfen:

if traitCollection.isIpad { ... }

4
Funktioniert dies auch, wenn sich die iPad-App im Split-Screen-Modus befindet? Dann wäre die horizontale Größenklasse kompakt.
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");
  }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.