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?

Albert Renshaw
quelle

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

WrightsCS
quelle
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
}
Jeehut
quelle
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
Richard
quelle
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
}
Kühl
quelle
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.

malhal
quelle
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"])
Gipfel
quelle
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.

Andy Davies
quelle
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
    }
}
König-Zauberer
quelle
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
    }
Ashok R.
quelle
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
}
Rohit Sisodia
quelle
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");
}
LearningGuy
quelle
["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!
}
Aviel Gross
quelle
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
}
iOS
quelle
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 {}

Der Ruffus
quelle
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 { ... }
Bartłomiej Semańczyk
quelle
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");
  }
Rajesh Sharma
quelle