API, um zu bestimmen auf dem iPhone oder iPad ob läuft [Duplikat]
-
04-10-2019 - |
Frage
Diese Frage bereits eine Antwort hier:
- iOS erkennen, wenn der Benutzer auf einem iPad ist 16 Antworten
Gibt es eine API für die Überprüfung zur Laufzeit, ob Sie auf einem iPhone oder einem iPad?
laufenEine Möglichkeit, die ich denken kann wäre zu verwenden:
[[UIDevice currentDevice] model];
Und erkennt die Existenz des String @ "iPad." - was ein wenig zerbrechlich scheint
In der 3.2 SDK, sehe ich, dass UIDevice
eine Eigenschaft hat, die wirklich das, was ich suche, aber nicht funktioniert für Pre-3.2 (natürlich):
[[UIDevice currentDevice] userInterfaceIdiom];
Gibt es andere Möglichkeiten als die Überprüfung für die Existenz von @ „iPad“ für einen Universal-App?
Lösung
Zur Kasse UI_USER_INTERFACE_IDIOM
.
Gibt die Schnittstelle Idiom von der aktuellen Gerät unterstützt wird.
Rückgabewert
UIUserInterfaceIdiomPhone
, wenn das Gerät ein iPhone oder iPod touch oderUIUserInterfaceIdiomPad
, wenn das Gerät ein iPad ist.
Andere Tipps
Nur für meinen Hinweis:
@property (nonatomic, readonly) BOOL isPhone;
-(BOOL)isPhone {
return (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone);
}
oder Verwendung eines #define
#define IS_PHONE (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone)
Wenn Sie jedoch isPhone
ganzen Code verwenden, das ist im Allgemeinen schlechte Praxis. Verwenden Sie das Factory-Pattern und Polymorphismus zu halten Ihre if
Aussagen enthalten, so dass Sie Objekte für Telefon oder für iPad erstellt und dann die Arbeit mit diesen.
hinzugefügt
Ich bin mit dieser Lösung alle jetzt meinen Code über. Es fügt ein Standard-Fabrik-Muster in die alloc.
#define ALLOC_PER_DEVICE() id retVal = nil; \
NSString *className = NSStringFromClass(self);\
if (IS_PHONE && ![className hasSuffix:@"Phone"]) {\
className = [NSString stringWithFormat:@"%@Phone", className];\
Class newClass = NSClassFromString(className);\
retVal = [newClass alloc];\
}\
if (!retVal)\
retVal = [super alloc];\
assert(retVal != nil);\
return retVal\
Dann schauen meine Allocs wie folgt aus:
+alloc { ALLOC_PER_DEVICE(); }
Und ich hinzufügen, eine Unterklasse TheClassPhone
für die Handy-Version genannt.
Hinweis: Da gibt es keine Mehrfachvererbung in Objective-C, Vererbung, Ihre Probleme zu lösen, ist ein bisschen überschätzt (das heißt, es funktioniert nicht, wenn Sie Subklassen von Subklassen haben). Nichts wie eine gute if
, wenn Sie es brauchen.
- Überprüfen Sie das Vorhandensein der userInterfaceIdiom Eigenschaft, usings respondsToSelector :. Wenn es nicht vorhanden ist, sind wir auf einem Pre-3.2-Gerät, also nicht ein iPad.
- Wenn userInterfaceIdiom vorhanden ist, verwenden Sie es.
Edit: ... was natürlich genau das, was die UI_USER_INTERFACE_IDIOM () Makro tut, so verwendet, dass statt. :)
Sie können überprüfen, ob Sie die App auf Ihrem iPhone oder iPad laufen, indem Sie den folgenden Code:
- (NSString *)deviceModel
{
struct utsname systemInfo;
uname(&systemInfo);
return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
}
- (NSString *) platformString
{
NSString *platform = [self deviceModel];
if ([platform isEqualToString:@"iPhone1,1"]) return @"iPhone_2G";
else if ([platform isEqualToString:@"iPhone1,2"]) return @"iPhone_3G";
else if ([platform isEqualToString:@"iPhone2,1"]) return @"iPhone_3GS";
else if ([platform isEqualToString:@"iPhone3,1"]) return @"iPhone_4";
else if ([platform isEqualToString:@"iPhone3,3"]) return @"Verizon_iPhone_4";
else if ([platform isEqualToString:@"iPhone4,1"]) return @"iPhone_4S";
else if ([platform isEqualToString:@"iPhone5,1"]) return @"iPhone_5";
else if ([platform isEqualToString:@"iPhone5,2"]) return @"iPhone_5";
else if ([platform isEqualToString:@"iPod1,1"]) return @"iPod_Touch 1G";
else if ([platform isEqualToString:@"iPod2,1"]) return @"iPod_Touch 2G";
else if ([platform isEqualToString:@"iPod3,1"]) return @"iPod_Touch 3G";
else if ([platform isEqualToString:@"iPod4,1"]) return @"iPod_Touch 4G";
else if ([platform isEqualToString:@"iPad1,1"]) return @"iPad_1G";
else if ([platform isEqualToString:@"iPad2,1"]) return @"iPad_2(WiFi)";
else if ([platform isEqualToString:@"iPad2,2"]) return @"iPad_2(GSM)";
else if ([platform isEqualToString:@"iPad2,3"]) return @"iPad_2(CDMA)";
else if ([platform isEqualToString:@"iPad3,1"]) return @"iPad_3";
else if ([platform isEqualToString:@"iPad3,2"]) return @"iPad_3(GSM/CDMA)";
else if ([platform isEqualToString:@"iPad3,3"]) return @"iPad_3(GSM)";
else if ([platform isEqualToString:@"iPad3,4"]) return @"iPad_3(GSM)";
else if ([platform isEqualToString:@"iPad2,5"]) return @"iPad_mini_1G";
else if ([platform isEqualToString:@"i386"]) return @"Simulator";
else if ([platform isEqualToString:@"x86_64"]) return @"Simulator";
return platform;
}
Verwenden NSClassFromString und eine iPad-spezifische Klasse. Lesen Sie mehr hier: