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

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

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

Ответ 1

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

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

[ [ UIScreen mainScreen ] bounds ].size.height

Можно превратить в макрос.

Ответ 2

У меня нет 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"

Ответ 3

#define IS_IPHONE5 (([[UIScreen mainScreen] bounds].size.height-568)?NO:YES)

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

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

Ответ 4

Из вашего вопроса, похоже, вы хотите исправить пользовательский интерфейс в зависимости от устройства и разрешения. В этом случае это нормально, и вы можете использовать приведенный ниже код для идентификации устройства. Но для вещей, не относящихся к пользовательскому интерфейсу, например, поиск возможностей устройства, присутствующих на одном устройстве, отсутствует в других, всегда рекомендуется проверить, присутствует ли эта возможность, а не какая модель устройства. От 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");
  }
}

Ответ 5

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

// 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.
    }
}