Как найти PPI программно с точностью

Я пытаюсь выяснить PPI (Pixels Per Inch) в iOS.

Я не мог найти прямой способ запросить это, как мы делаем для размера дисплея

UIScreen.mainScreen().bounds

Есть способ сделать это, умножив масштаб на стандартный общий PPI для iPhone (163) или iPad (132), но он не точен.

Если формула верна, то PPI iPhone 6 plus равен 489, но на самом деле PPI равен 401. Вот ссылка

На данный момент кажется, что жесткое кодирование - это путь.

Но я бы хотел сделать это программно, используя формулу.

Ответ 1

Я только что портировал и обновил одну из моих старых библиотек ObjC на Swift. Вы можете использовать его или взять части кода, который вам нужен. Получите это здесь: https://github.com/marchv/UIScreenExtension.

Библиотека использует UIScreen.main.nativeScale для преобразования из числа пикселей в дюйм (PPI) в число точек на дюйм.

Установите библиотеку, используя Cocoapods, а затем импортируйте ее:

import UIScreenExtension

А затем использовать это:

if let pointsPerCentimeter = UIScreen.pointsPerCentimeter {
   // code
}

Ответ 2

Я считаю, что нет публичного API для получения PPI или физического размера экрана.

Единственным способом является список жестких дисков с физическими размерами и/или PPI (и вы можете получить тип устройства из класса UIDevice).

BTW. Вот вопрос, который в значительной степени задает одно и то же (по-другому): Как приложения линейки остаются точными на всех устройствах?

Ответ 3

iPhone Plus имеет шкалу 3, но nativeScale - 2.6.

UIKit сэмплирует этот контент, чтобы соответствовать фактическим размерам экрана. Содержимое металла или OpenGL ES должно отображаться с точными размерами.

int screenPPI() {
    return [[UIScreen mainScreen] nativeScale] * ((UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) ? 132 : 163);
}