Arm1.ru

Как определить Retina Display на iPad/iPhone

Внимание! Если вам нужно просто понять, какой экран у вас на вашем iPad, iPhone или iPod - просто перейдите по ссылке: https://arm1.ru/retina/

Пытаясь понять, как мне на Objective-C определить наличие Retina-экрана в устройстве, пришлось погуглить. Нашёл такое решение, которое запишу для шпаргалки.

Получаем размеры экрана:

CGRect screenBounds = [[UIScreen mainScreen] bounds];

Возвращает размер экрана, обычно 320x480, даже на iPhone 4, iPhone 4S и iPod Touch вернёт 320x480 (иначе вроде как старые приложения падают). Для iPad возвращает 768x1024 - и на iPad/iPad 2, и на новом iPad с Retina Display.

Получаем масштаб экрана:

CGFloat screenScale = [[UIScreen mainScreen] scale];

Для всех НЕ-retina-экранов вернёт 1.0f. Для Retina-экранов вернёт 2.0f. Касается всех iOS-девайсов.

Посему - имея размеры экрана, характерные для форм-фактора (телефон/айпод или планшет) и зная масштаб - мы можем высчитать настоящий размер экрана девайса:

CGSize screenSize = CGSizeMake(screenBounds.size.width * screenScale, screenBounds.size.height * screenScale);

Если выполнить такой код:

CGRect screenBounds = [[UIScreen mainScreen] bounds];
NSLog(@"%f x %f", screenBounds.size.width, screenBounds.size.height);
    
CGFloat screenScale = [[UIScreen mainScreen] scale];
NSLog(@"%f", screenScale);
    
CGSize screenSize = CGSizeMake(screenBounds.size.width * screenScale, screenBounds.size.height * screenScale);
NSLog(@"%f x %f", screenSize.width, screenSize.height);

то мы увидим в консоли все размеры. В данном случае - запускал на эмуляторе iPad Retina:

Как определить Retina Display на iPad/iPhone

Ну и, собственно, проверяя размеры/тип устройства можно подставлять нужную графику нужных размеров. Profit.

P.S. что касается картинок, то нужно создать всего 2 картинки, например "image.png" и такую же картинку в 2 раза больше с именем "image@2x.png", и дальше пользоваться только первой. Например:

[UIImage imageNamed:@"image.png"];

Если на устройстве Retina - то приложение автоматически подхватит файл с большим разрешением (image@2x.png).

keyboard_return back