Обнаружение сетчатки сетчатки /iPhone 4 в iPhone SDK
В моем приложении я загружаю некоторые изображения из Интернета (с моего сервера, чтобы быть точным), чтобы сохранить некоторые полосы пропускания и особенно память на телефоне, я предоставляю их в двух разрешениях: 480x320 для "старого" iPhone серии и в 960x640 для iPhone 4 с дисплеем сетчатки. Теперь я должен иметь возможность обнаруживать из приложения, когда он работает на устройстве, поддерживающем экран сетчатки. Как я могу это сделать?
Я думал об использовании фрагмента кода, ниже которого будет возвращен мне определенный идентификатор устройства, например, например. "iPhone3", но тогда я бы ограничил обнаружение iPhone4 и должен был обновить этот код для любого последующего устройства с отображением сетчатки.
size_t size;
// Set 'oldp' parameter to NULL to get the size of the data
// returned so we can allocate appropriate amount of space
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
// Allocate the space to store name
char *name = malloc(size);
// Get the platform name
sysctlbyname("hw.machine", name, &size, NULL, 0);
// Place name into a string
NSString *machine = [NSString stringWithCString:name];
Есть ли лучший сут (может быть, это очень очевидно, но я пропустил это)?
Ответы
Ответ 1
Просто прочитал некоторые официальные форумы Apple Developers, и вопросы там были подробно обсуждены. Лучший способ для меня - это использование свойства scale
UIScreen
. Хотя он доступен только в iOS 4
и позже, он расскажет вам все, что вам нужно знать и, скорее всего, сыграет еще более важную роль в будущем (уже заметил, что разрешение экрана iPad 1024x768 составляет ровно 32/15 * 480x320?).
UIScreen.mainScreen.scale
Если у вас есть еще одна идея, не стесняйтесь публиковать ее:)
Ответ 2
Вот какой код подходит для iOS 3.x и 4.x:
BOOL hasHighResScreen = NO;
if ([UIScreen instancesRespondToSelector:@selector(scale)]) {
CGFloat scale = [[UIScreen mainScreen] scale];
if (scale > 1.0) {
hasHighResScreen = YES;
}
}
Ответ 3
Небольшое обновление ответа Скотта Густафсона:
Если нам нужно различать iPad/Retina/iphone:
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
CGFloat scale = [[UIScreen mainScreen] scale];
if (scale > 1.0)
{
//iPad retina screen
}
else
{
//iPad screen
}
}
else
{
if ([UIScreen instancesRespondToSelector:@selector(scale)])
{
CGFloat scale = [[UIScreen mainScreen] scale];
if (scale > 1.0)
{
if([[ UIScreen mainScreen ] bounds ].size.height == 568)
{
//iphone 5
}
else
{
//iphone retina screen
}
}
else
{
//iphone screen
}
}
}
Ответ 4
Я получаю реальный размер экрана (в пикселях) следующим образом:
UIScreen *MainScreen = [UIScreen mainScreen];
UIScreenMode *ScreenMode = [MainScreen currentMode];
CGSize Size = [ScreenMode size]; // <--- Real screen size
Ответ 5
- (BOOL)isRetina {
BOOL isRetina = NO;
if ([UIScreen instancesRespondToSelector:@selector(scale)]) {
CGFloat scale = [[UIScreen mainScreen] scale];
if (scale > 1.0) {
isRetina = YES;
}
}
return isRetina;
}
- (CGSize)sizeInPixels {
CGRect appFrame = [[UIScreen mainScreen] applicationFrame];
CGSize screenSize = CGSizeMake(appFrame.size.width, appFrame.size.height);
return [self isRetina] ? CGSizeMake(screenSize.width * 2, screenSize.height * 2) : screenSize;
}
Ответ 6
Иди с Робин. Еще одно замечание: если вам нужно проверить имя устройства, просто используйте методы в UIDevice.
[[UIDevice currentDevice] model];
[[UIDevice currentDevice] systemName];
[[UIDevice currentDevice] systemVersion];
Ответ 7
UIScreen *MainScreen = [UIScreen mainScreen];
UIScreenMode *ScreenMode = [MainScreen currentMode];
CGSize Size = [ScreenMode size]; // <--- Real screen size
Ответ 8
И для тех, кто просто хочет скопировать/вставить, как определить iphone/iphone_retina/ipad/ipad_retina, вот что я сделал после прочтения этой темы. Сильно вдохновленный вкладом Гунтиса Треланда, который, в свою очередь, расширил ответ Скотта Густафсона.
- (NSString *) yesButWhichDeviceIsIt {
BOOL hasRetina = NO;
if ([UIScreen instancesRespondToSelector:@selector(scale)]) {
CGFloat scale = [[UIScreen mainScreen] scale];
if (scale > 1.0) {
hasRetina = YES;
}
}
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
if (hasRetina) {
return @"iPad retina";
} else {
return @"iPad";
}
} else {
if (hasRetina) {
return @"iPhone retina";
} else {
return @"iPhone";
}
}
}
Ответ 9
Если вы используете Cocos2d, попробуйте следующее:
[[CCDirector sharedDirector] winSizeInPixels];
Он вернет a CGSize
со свойствами width
и height
.
Ответ 10
+(BOOL)Retina{
return ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0))?1:0; }
Ответ 11
Несмотря на то, что вы уже выбрали ответ, есть гораздо более простой способ, когда вы имеете дело с изображениями, поэтому я также упомянул об этом.
Если вы включаете два изображения в свой комплект из двух размеров (320x480 и 640x960) и добавляете "@2x" в конце последнего имени файла изображения, [UIImage imageNamed:] автоматически выбирает меньшее изображение для более старых устройств и 2x для устройств с дисплеем сетчатки, при условии, что вы оставите суффикс изображения. Пример:.
2 изображения с именем @ "image.png" и @ "[email protected]", которые включены в комплект приложений.
Затем вызовите:
[UIImage imageNamed:@"image"];
Здесь также отображаются значки приложений и экран загрузки.