Подтвердить что ты не робот

В чем разница между -nativeScale и -scale на UIScreen в iOS8 +?

В примерах журналов, опубликованных в этом вопросе, результаты идентичны. Кто-нибудь знает, существует ли логическое различие между этими двумя?

Даже Описание Apple запутывает. Вот описание scale:

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

Вот описание nativeScale:

Внутренний масштабный коэффициент для физического экрана

В чем разница между естественным и родным?

4b9b3361

Ответ 1

Свойства nativeBounds и nativeScale в основном предназначены для использования с OpenGL и представляют собой фактический размер пикселя и коэффициент масштабирования точек к пикселям, который вы используете для рисования точно для разрешения экранов, что позволяет избежать дополнительная рентабельность рисования при виртуальном размере 1242 × 2208. Например, с помощью CAEAGLLayer вы сделали это:

theGLLayer.contentsScale = [UIScreen mainScreen].nativeScale;

... и затем нужно отображать только его содержимое размером nativeBounds, т.е. 1080 × 1920.

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

Ответ 2

Как scale, так и nativeScale сообщают вам, сколько пикселей соответствует точке. Но имейте в виду, что точки отображаются в промежуточном буфере пикселей , который затем изменяется в соответствии с разрешением экрана. Итак, когда мы спрашиваем: "1 pt соответствует количеству пикселей?" это может означать промежуточные пиксели (масштаб) или конечные пиксели (nativeScale).

На iPhone Plus масштаб равен 3, но nativeScale - 2.6. Это связано с тем, что контент отображается в 3 раза (1 байт = 3 пикселя), но затем уменьшаемое результирующее изображение уменьшается, в результате получается 1 пункт = 2,6 пикселя.

Таким образом, масштабные сделки с промежуточным растровым изображением, а nativeScale - с окончательным растровым изображением.


Это без масштабирования дисплея. Если вы включите масштабирование дисплея, масштаб останется тем же, на 3, так как промежуточный буфер по-прежнему отображается в 1 точке = 3 пикселя. Но собственный масштаб равен 2,8.

Итак, если вы хотите проверить физический экран, используйте масштаб. Например, если у вас есть приложение, которое работает только на iPhone Plus, вы можете сделать:

if scale != 3 {
  print("Not supported")
}

Не:

if nativeScale != 2.6 {
  print("Not supported")
}

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