私は iPad 2 を持っていないので、[[UIDevice currentDevice] モデル] を呼び出すときに何を返すかを知る必要があります。「iPad」だけが返されると思ったのですが、間違っているようです。
誰か教えてくれませんか?
ありがとう
私は iPad 2 を持っていないので、[[UIDevice currentDevice] モデル] を呼び出すときに何を返すかを知る必要があります。「iPad」だけが返されると思ったのですが、間違っているようです。
誰か教えてくれませんか?
ありがとう
カメラ付きの iPad を確認します。
BOOL isIPad2 = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad &&
[UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]);
一般に、モデル/バージョンの検出に基づいて包括的な仮定を行うよりも、特定の機能を検出する方が適切であることに注意してください。たとえば、カメラが必要な場合は、カメラを明示的にテストします。利用可能な RAM の量に基づいて UI の品質を微調整する必要がある場合は、物理 RAM をテストします。モデル検出を使用することの危険性を強調する、私が書いたコメントにも注意してください。
model
プロパティは、情報提供または診断出力のために表示する以外の目的で使用しないでください。保存が保証されているわけではありません。これに依存すると、新しいデバイスが来るたびに不必要に切断されます。
多くの iPhone アプリは、プロパティを確認しただけで iPad の互換モードで使用できず、model
iPhone/iPod でなければ何もしませんでした。
「iPad2,2」などの正確なモデル文字列を取得するには、次のようなものを使用できます。
#import "YourDeviceDetectionClass.h"
#include <sys/utsname.h>
@implementation YourDeviceDetectionClass
+(NSString*)modelAsString
{
struct utsname platform;
int rc = uname(&platform);
if(rc == -1)
{
// Error...
return nil;
}
else
{
// Convert C-string to NSString
return [NSString stringWithCString:platform.machine encoding:NSUTF8StringEncoding];
}
}
@end
UIScreen+Retina.h #インポート
@interface UIScreen(Retina)
// Returns YES if this is a Retina display.
- (BOOL)isRetina;
@end
UIScreen+Retina.m
#import "UIScreen+Retina.h"
@implementation UIScreen(Retina)
- (BOOL)isRetina {
return [self respondsToSelector:@selector(displayLinkWithTarget:selector:)] && (self.scale == 2.0);
}
@end
利用方法
#import "UIScreen+Retina.h"
//http://stackoverflow.com/questions/3294100/how-to-differentiate-between-iphone4-and-iphone-3
if ([[UIScreen mainScreen] isRetina]) {
// Retina display
}
iPad/iPhone ハイレゾ/ローレゾ
#import "UIScreen+Retina.h"
if([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad){
//IPAD
if ([[UIScreen mainScreen] isRetina]) {
// IPAD 3 - Retina display
bannersGetPromoServerRequest.size = kXML_API_IMAGESIZE_IPAD_HIGHRES;
}else{
//iPAD 1/2
bannersGetPromoServerRequest.size = kXML_API_IMAGESIZE_IPAD_LOWRES; }
}else{
//IPHONE
if ([[UIScreen mainScreen] isRetina]) {
// IPHONE 4/4s/5 - Retina display
bannersGetPromoServerRequest.size = kXML_API_IMAGESIZE_IPHONE_HIGHRES;
}else{
//IPHONE (3.x)
bannersGetPromoServerRequest.size = kXML_API_IMAGESIZE_IPHONE_LOWRES;
}
}
スケールをテストできると思います
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
if ([[[UIScreen mainScreen] scale] == 2.0) {
// retina display
}
}
OpenGL を使用している場合は、GPU モデルを確認できます。iPad 1 には PowerVR SGX 535 があり、iPad 2 には PowerVR SGX 543 があります。
const char * deviceStr = (const char *)glGetString(GL_RENDERER);
if (!strcmp(deviceStr, "PowerVR SGX 535")) {
// iPad 1
}
else {
// iPad 2 or later
}
UIDevice Class Referenceが役に立ちます。より具体的な解決策については、この SO questionを試してください。
2 番目の質問については、解像度をテストする最善の方法は、iPad3,1 の PPI の数と同様のディスプレイを取得することです。残念ながら、おそらくできないでしょう。アプリをテストする最善の方法は、実際のデバイスで行うことです。
次のWebサイトから、すべてのIPad2リターンモデルまたは必要なiOSデバイスのモデルを入手できます。IOS デバイスのモデルとプラットフォーム
また、次のコードを使用してモデルを直接取得できます。
- (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;
}
ここでは、これを行うべきではない理由について意見を述べ、代替コードを提供している多くの回答を得ていますが、質問に対する実際の回答は得られていません。実行しているデバイスを正確に特定したい場合(目的が何であれ... 他の開発者にあなたが達成しようとしていることを知られたふりをさせないでください)、UIDeviceHardware
サードパーティ クラスを使用できます。ここで見つけることができます:
https://github.com/fahrulazmi/UIDeviceHardware
次のように呼び出すだけです。
NSString *platformString = [UIDeviceHardware platformString];
そして、それはデバイスを返します。あなたの場合、platformString
これらのいずれかと一致するように見えます:
@"iPad 2 (WiFi)"
@"iPad 2 (GSM)"
@"iPad 2 (CDMA)"