Frage

Apple-rät den folgenden Code verwenden, ob Laufen auf einem iPad oder iPhone / iPod Touch zu erkennen:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
  // The device is an iPad running iPhone 3.2 or later.
  // [for example, load appropriate iPad nib file]
}
else {
  // The device is an iPhone or iPod touch.
  // [for example, load appropriate iPhone nib file]
}

Das Problem ist, dass UI_USER_INTERFACE_IDIOM () und UIUserInterfaceIdiomPad sind nicht in dem SDKs vor 3.2 definiert. Dies scheint völlig den Zweck, eine solche Funktion zu besiegen. Sie können nur auf iPhone OS kompiliert und ausgeführt werden 3.2 (iPhone OS 3.2 kann nur auf dem iPad laufen). Also, wenn Sie UI_USER_INTERFACE_IDIOM () verwenden können, wird immer das Ergebnis sein, einen iPad anzuzeigen.

Wenn Sie diesen Code und Ziel-OS enthalten 3.1.3 (die neueste iPhone / iPod Touch OS), um Ihren iPhone gebundenen Universal-App-Code zu testen, werden Sie Compiler-Fehler erhalten, da die Symbole nicht in 3.1 definiert. 3 oder früher, wenn für iPhone Kompilieren Simulator 3.1.3.

Ist dies die empfohlene-by-Apple-Ansatz zur Runtime-Gerät-Erkennung, was mache ich falsch? Hat jemand zum Gerät Erkennung mit diesem Ansatz gelang es?

War es hilfreich?

Lösung

Ich tue dies, um den Code zu bekommen sowohl 3.1.3 zu kompilieren und 3.2:

BOOL iPad = NO;
#ifdef UI_USER_INTERFACE_IDIOM
iPad = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad);
#endif
if (iPad) {
// iPad specific code here
} else {
// iPhone/iPod specific code here
}

Ich schrieb auch eine schnelle Blog-Post über es hier: http: // www. programbles.com/2010/04/03/compiling-conditional-code-in-universal-iphone-ipad-applications/

Andere Tipps

Dies ist, was ich benutze:

- (BOOL) amIAnIPad {
    #if (__IPHONE_OS_VERSION_MAX_ALLOWED >= 30200)
        if ([[UIDevice currentDevice] respondsToSelector: @selector(userInterfaceIdiom)])
            return ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad);
    #endif
    return NO;
}

Dies bedingt kompiliert, so dass Sie immer noch für 3,0 sim aufbauen können. Es prüft dann, ob die UIDevice Klasse reagiert auf die Wähler zu sehen. Wenn eine dieser scheitern, es ist nicht ein iPad.

  

Ist dies der empfohlene-by-Apple-Ansatz auf Laufzeit   Geräteerkennung, was mache ich falsch? Hat jemand erfolgreich mit   Dieser Ansatz zur Geräteerkennung?

Dies ist Lösung für Laufzeit Erkennung:

#define isIPhone (![[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] || [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)

Danach Sie leicht überall in Ihrem Code testen:

if (isIPhone) { ... }

Der Unterschied zwischen diesem und mit # if / #ifdef ist, dass dies die Laufzeit-Tests, während #if Kompilierung-Tests sind.

Ich denke, die Laufzeit-Tests besser ist, weil Sie eine zumutbare für jede Betriebssystem-Version in diesem Fall verwenden können. Wenn Sie Kompilierung-Check verwenden, müssen Sie verschiedene Programme für verschiedene OS-Versionen produzieren.

Wenn Ihr Problem Kompilierung-Fehler ist, sollten Sie nur kompilieren gegen letzte Version von SDK (siehe auch Wie für den Zugriff schwach verknüpft Rahmen in iOS? ).

Ich glaube, die Antwort ist einfach nicht versuchen, den Code auf dem iPhone Simulator 3.1.3 oder früher ausgeführt werden. Immer kompiliert mit einem 3,2-SDK. Der iPhone Simulator 3.2 erhalten Sie die iPad-Simulator erhalten, oder für Geräte-3.2 iPhone kompilieren und die Anwendung auf einem Telefon, das er auf dem Prüfstand.

Es gibt keine Möglichkeit, gegen 3.2 SDK zu kompilieren und einen 3.1.3 oder früher Simulator verwenden.

Statt jedem Compiler basiert Sachen, die ich verwenden:

- (BOOL)deviceIsAnIPad {
if ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)])
    //We can test if it's an iPad. Running iOS3.2+
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
        return YES; //is an iPad
    else 
        return NO; //is an iPhone
else 
    return NO; //does not respond to selector, therefore must be < iOS3.2, therefore is an iPhone
}

Deklarieren dieses

#ifdef UI_USER_INTERFACE_IDIOM
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#else
#define IS_IPAD false
#endif

dann verwenden Kontrolle wie unten

#define DetailLabel_PosX (IS_IPAD ? 200 : 160)

Es gibt auch einige definieren für die Überprüfung iphone 5

#define IS_IPHONE5 (([[UIScreen mainScreen] bounds].size.height-568)?NO:YES)
#define IOS_OLDER_THAN_6 ([[[UIDevice currentDevice] systemVersion] floatValue] < 6.0 )
#define IOS_NEWER_OR_EQUAL_TO_6 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0 )
  

Dies scheint völlig den Zweck einer solchen Funktion zu besiegen. Sie   kann nur auf dem iPhone kompiliert und ausgeführt werden   OS 3.2 (iPhone OS 3.2 kann nur ausgeführt werden,   auf iPad). Also, wenn Sie verwenden können,   UI_USER_INTERFACE_IDIOM () das Ergebnis   wird immer ein iPad anzuzeigen.

Das ist völlig falsch. Es kann sein, zusammengestellt auf Basis SDK 3.2, aber es kann sein, run auf jedem Betriebssystem, wenn Sie das Implementierungsziel entsprechend gesetzt.

UI_USER_INTERFACE_IDIOM () und UIUserInterfaceIdiomPad auf iOS3.2 und nach oben verwendet werden, der wichtige Teil der ‚nach oben‘ zu sein. Sicher. iOS3.2 ist nur für das iPad, aber iOS4.0 und darüber hinaus laufen sowohl auf iPhones und iPads, so die Prüfung nicht so sinnlos ist, wie Sie denken.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top