Лучший способ определить тип оборудования, 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.
}
}