it-swarm.com.de

Beste Möglichkeit, iPad/iPhone-Hardware programmgesteuert zu erkennen

Der Grund, warum ich herausfinden muss, ist, dass ein UIPickerView auf einem iPad in Querformat dieselbe Höhe aufweist wie im Hochformat. Auf einem iPhone ist es anders. Die iPad-Programmieranleitung führt UIDevice mit einem "Idiom" ein:

    UIDevice* thisDevice = [UIDevice currentDevice];
    if(thisDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad)
    {
        // iPad
    }
    else
    {
        // iPhone
    }

was funktioniert OK, wenn Sie auf dem iPad (3.2) sind, aber nicht auf dem iPhone (3.1.3) - es sieht also so aus, als müsste es auch ein ifdef geben, der diese Prüfung bedingt kompiliert, wie:

#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
        UIDevice* thisDevice = [UIDevice currentDevice];
        if(thisDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad)
        {
            // etc.
        }
#endif

Für mich sieht das sehr unbeholfen aus. Was ist ein besserer Weg?

45
Adam Eberbach

Ich beantworte dies jetzt (und zu diesem späten Zeitpunkt), da viele der vorhandenen Antworten ziemlich alt sind und die meisten Up Voted laut Apples aktuellen Dokumenten (iOS 8.1, 2015) tatsächlich falsch zu sein scheinen!

Um meinen Standpunkt zu beweisen, ist dies der Kommentar aus der Apple-Header-Datei (sehen Sie sich immer die Apple Quelle und Header) an):

/*The UI_USER_INTERFACE_IDIOM() macro is provided for use when
  deploying to a version of the iOS less than 3.2. If the earliest
  version of iPhone/iOS that you will be deploying for is 3.2 or
  greater, you may use -[UIDevice userInterfaceIdiom] directly.*/

Daher wird von Apple derzeit die folgende Methode zur Erkennung von iPhone und iPad empfohlen :

1) Verwenden Sie bei Versionen von iOS [~ # ~] vor [~ # ~] bis 3.2 die Apple bereitgestelltes Makro:

// for iPhone use UIUserInterfaceIdiomPhone
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)

2) Verwenden Sie in Versionen von iOS 3.2 oder höher die Eigenschaft unter [UIDevice currentDevice]:

// for iPhone use UIUserInterfaceIdiomPhone
if([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad)
26
Cliff Ribaudo

Die Prüfung zur Laufzeit (der erste Weg) unterscheidet sich vollständig von #if zur Kompilierzeit. Die Präprozessor-Anweisungen geben Ihnen keine universelle App.

Die bevorzugte Methode ist die Verwendung von Apples Macro:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
     // The device is an iPad running iPhone 3.2 or later.
}
else
{
     // The device is an iPhone or iPod touch.
}

Verwenden Sie 3.2 als Basis-SDK (da das Makro nicht vor 3.2 definiert wurde), können Sie ältere Betriebssystemversionen als Ziel auswählen, damit es auf dem iPhone ausgeführt wird.

63
Eiko

Ich mag meine isPad () Funktion. Gleicher Code, aber außer Sichtweite und nur an einer Stelle.

17
progrmr

Meine Lösung (funktioniert ab 3.2+):

#define IS_IPHONE (!IS_IPAD)
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone)

dann,

if (IS_IPAD)
    // do something

oder

if (IS_IPHONE)
    // do something else
15
lewisanderson

Verwenden Sie in Swift userInterfaceIdiom instance als 

if UIDevice.current.userInterfaceIdiom == .phone {
     print("iPhone")
 }

& Für andere Geräte - 

  switch UIDevice.current.userInterfaceIdiom {
    case .pad:
        print("iPad")
    case .phone:
        print("iPhone")
    case .tv:
        print("TV")
    case .carPlay:
        print("carPlay")
    default: break;
  }
1
Jack

Wenn Sie Funktionen verwenden, die nicht abwärtskompatibel sind, habe ich die beste Methode für mich gefunden, indem Sie im vordefinierten Header ein #define erstellen. Beispiel:

#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_3_2
#define USING_4_X
#endif

Dann können Sie in Ihrem Code Folgendes tun:

BOOL exists = NO;
#ifdef USING_4_X        
exists = [SomeObject someMethod:[url lastPathComponent]];
#else
exists = [SomeObject someMethod:[[url path] lastPathComponent]];
#endif
0
Damon

Fügen Sie diese Methode in Ihren App-Delegierten ein, sodass Sie sie überall mit dem [[[[UIApplication sharedApplication] -Delegierten] isPad] aufrufen können.

-(BOOL)isPad
{
    BOOL isPad;
    NSRange range = [[[UIDevice currentDevice] model] rangeOfString:@"iPad"];
    if(range.location==NSNotFound)
    {
        isPad=NO;


    }
    else {
        isPad=YES;
    }

    return isPad;
}
0
Sanniv

Wenn 1- Sie die App bereits auf Ihrem Gerät installiert haben, 2- ändern Sie die Build-Einstellungen in eine 'Universal'-App, 3- Installieren Sie die App auf Ihrem Gerät über dem Pre - vorhandene App (ohne vorherige zu löschen)

Die hier angebotenen Lösungen zur Erkennung von iPhone/iPad funktionieren möglicherweise nicht. Löschen Sie zunächst die App, die "nur" für iPad/iPhone war, und installieren Sie sie neu auf Ihrem Gerät.

0
Topsakal
BOOL isIpad()
{
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        return YES;
    }
    return NO;
}
0
andyqee