Лучший способ определить тип оборудования, iPhone4 или iPhone5?

Я настраиваю приложение, в котором я хочу внести ряд изменений в макет представления в зависимости от типа используемого iPhone. В частности, я хочу знать, если разрешение экрана по вертикали 1136 (iPhone5) или 960 (Ай фон 4). Одна из вещей, которые я хочу сделать, это отрегулировать высоту моих UITableViewCells в UITableView, чтобы частичные ячейки не отображались при запуске приложения на любом телефоне.

Мой вопрос: каков наилучший способ определения используемого типа аппаратного обеспечения телефона, чтобы я мог внести соответствующие изменения в свой макет просмотра?

5 ответов

Решение

Вы должны действительно использовать функции автоматического размещения, чтобы ваши представления адаптировались к любому формату экрана.

Однако, если вы хотите узнать, является ли устройство iPhone 5 (то есть имеет высоту 1136 пикселей), вы можете использовать:

[ [ UIScreen mainScreen ] bounds ].size.height

Конечно, можно превратить в макрос.

У меня нет iphone 5, но на другом телефоне этот код работал отлично:

NSMutableDictionary *devices = [[NSMutableDictionary alloc] init];
[devices setObject:@"simulator"                     forKey:@"i386"];
[devices setObject:@"iPod Touch"                    forKey:@"iPod1,1"];
[devices setObject:@"iPod Touch Second Generation"  forKey:@"iPod2,1"];
[devices setObject:@"iPod Touch Third Generation"   forKey:@"iPod3,1"];
[devices setObject:@"iPod Touch Fourth Generation"  forKey:@"iPod4,1"];
[devices setObject:@"iPhone"                        forKey:@"iPhone1,1"];
[devices setObject:@"iPhone 3G"                     forKey:@"iPhone1,2"];
[devices setObject:@"iPhone 3GS"                    forKey:@"iPhone2,1"];
[devices setObject:@"iPad"                          forKey:@"iPad1,1"];
[devices setObject:@"iPad 2"                        forKey:@"iPad2,1"];
[devices setObject:@"iPhone 4"                      forKey:@"iPhone3,1"];
[devices setObject:@"iPhone 4S"                     forKey:@"iPhone4"];
[devices setObject:@"iPhone 5"                      forKey:@"iPhone5"];

- (NSString *) getDeviceModel
{
    struct utsname systemInfo;
    uname(&systemInfo);
    return [devices objectForKey:[NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]];
}

Не забудьте импортировать:

#import "sys/utsname.h"

Из вашего вопроса, кажется, вы хотите исправить пользовательский интерфейс в зависимости от устройства и разрешения. В этом случае это нормально, и вы можете использовать приведенный ниже код для идентификации устройства. Но для вещей, не относящихся к пользовательскому интерфейсу, таких как поиск возможностей устройства, которое присутствует в одном устройстве, отсутствует в другом, всегда рекомендуется проверять наличие этой возможности, а не модель устройства. С официального форума Apple . (требуется авторизация)

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){
  if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)]) {
    CGSize result = [[UIScreen mainScreen] bounds].size;
    CGFloat scale = [UIScreen mainScreen].scale;
    result = CGSizeMake(result.width * scale, result.height * scale);

    if(result.height == 960){
      NSLog(@"iphone 4, 4s retina resolution");
    }
    if(result.height == 1136){
      NSLog(@"iphone 5 resolution");
    }
  }else{
    NSLog(@"iphone standard resolution");
  }
}else{
  if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)]) {
    NSLog(@"ipad Retina resolution");
  }else{
    NSLog(@"ipad Standard resolution");
  }
}
#define IS_IPHONE5 (([[UIScreen mainScreen] bounds].size.height-568)?NO:YES)

определите этот макрос в каком-то файле constant.h и используйте его в любом месте для проверки

if(IS_IPHONE5)
{
// iphone 5
}
else
{
// earlier
}

Я проверял соотношение сторон. Не такой общий, как некоторые другие методы, но все же более гибкий для будущих устройств, чем проверка определенного разрешения.

// 0.563380 = 16x9 (iPhone 5)
// 0.666667 = 3x2  (iPhone 4S and previous)
CGFloat aspectRatio = [UIScreen mainScreen].bounds.size.width / [UIScreen mainScreen].bounds.size.height;
// Tall Screen
if (aspectRatio > 0.55 && aspectRatio < 0.57) {
    // Tall screen stuff.
    }

    // Short Screen
} else if (aspectRatio > 0.64 && aspectRatio < 0.68) {

    // Short screen stuff.
    }
}
Другие вопросы по тегам