Кто-нибудь знает, есть ли способ получить плотность экрана (ppi) устройства во время выполнения? Было бы неплохо не требовать жесткого кодирования различных плотностей в случае, если яблоко переключит его в будущем...
Получите ppi iPhone/iPad/iPod Touch во время выполнения
Ответ 1
Я слишком долго искал это, и, кажется, нет простого способа получить dpi. Однако документация для UIScreen говорит, что немасштабированная точка равна 1/160 дюйма дюйма.
Итак, в основном, если вы хотите использовать dpi, вы можете умножить масштаб на 160.
float scale = 1;
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
scale = [[UIScreen mainScreen] scale];
}
float dpi = 160 * scale;
(Оператор if с responsesToSelector должен поддерживать код, работающий для более старых версий iOS, которые не имеют этого свойства)
Согласно Википедии, iPhone составляет 160 точек на дюйм, iPhone с дисплеем сетчатки - 326, а iPad - 132. Таким образом, IPad dpi не является особенно точным с использованием этой формулы, хотя iPhone довольно хорош. Если вам нужна более высокая точность для известных устройств, вы можете жестко задавать dpi для известных устройств с коэффициентом 1/160 как резерв для чего-либо в будущем.
float scale = 1;
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
scale = [[UIScreen mainScreen] scale];
}
float dpi;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
dpi = 132 * scale;
} else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
dpi = 163 * scale;
} else {
dpi = 160 * scale;
}
Это не идеальный вариант, и я бы не прочь увидеть лучшее решение самостоятельно, но это лучшее, что я мог найти.
Ответ 2
Попробуйте https://github.com/lmirosevic/GBDeviceInfo
int ppi = [GBDeviceInfo deviceInfo].displayInfo.pixelsPerInch; // #> 326]
Работает на iOS и OSX