Веб-сайт Apple утверждает, что разрешение составляет 1080p: 1920 x 1080
Однако экран запуска, необходимый для Xcode (8.0 GM, запущенного сегодня), составляет 2208 x 1242.
Кто прав?
iPhone 6+ позволяет внутренне использовать ресурсы @3x при виртуальном разрешении 2208 × 1242 (с 736x414 точками), а затем сэмплы для отображения. Точно так же, как использование масштабированного разрешения на Retina MacBook - оно позволяет им попадать в целое множество для элементов пикселей, сохраняя при этом, например, 12 pt текст выглядит одинаково на экране.
Итак, да, экраны запуска должны быть такого размера.
6, 5, 5, 4 и 4 - все 326 пикселей на дюйм и используют активы @2x, чтобы придерживаться примерно 160 точек на дюйм всех предыдущих устройств.
6+ - 401 пиксель на дюйм. Таким образом, гипотетически понадобится примерно 2,4,6x активов. Вместо этого Apple использует активы @3x и масштабирует весь объем производства примерно до 84% от его натурального размера.
На практике Apple решила пойти с более чем 87%, превратив 1080 в 1242. Несомненно, это должно было найти что-то как можно ближе до 84%, которое все еще создавало цельные размеры в обоих направлениях - 1242/1080 = 2208/1920, тогда как если бы вы превратили 1080 в, скажем, 1286, вам нужно было бы отображать 2286,22 пикселя по вертикали, чтобы хорошо масштабировать.
Ответ: старые приложения работают в режиме 2208 x 1242 Zoomed. Но когда приложение создано для новых телефонов, доступны следующие разрешения: Super Retina HD 5.8 (iPhone X) 1125 x 2436 (458ppi), Retina HD 5.5 (iPhone 6, 7, 8 Plus) 1242 x 2208 и Retina HD 4.7 ( iPhone 6) 750 x 1334. Это вызывает путаницу, упомянутую в вопросе. Для создания приложений, использующих полноэкранный размер новых телефонов, добавьте LaunchImages в размеры: 1125 x 2436, 1242 x 2208, 2208 x 1242 и 750 x 1334.
Размер для iPhone X с масштабированием @3x (название Apple: Super Retina HD), координатное пространство: 375 x 812 и < сильные > 1125 x 2436 пикселей, 458 ppi, физический размер устройства 2,79 x 5,65 дюйма или 70,9 x 143,6 мм <мм..
Размер для iPhone 6, 6S, 7 и 8 с масштабированием @3x (название Apple: Retina HD 5.5), координатное пространство: 414 x 736 и 1242 x 2208 пикселей, 401 ppi, физический размер экрана - 2,7 x 4,8 дюйма или 68 x 122 мм. При запуске в режиме масштабирования, то есть без новых параметров LaunchImages или в настройке на iPhone 6 Plus, собственный масштаб равен 2,88, а экран - 320 х 568 точек, что соответствует собственному размеру iPhone 5:
Screen bounds: {{0, 0}, {414, 736}}, Screen resolution: <UIScreen: 0x7f97fad330b0; bounds = {{0, 0}, {414, 736}};
mode = <UIScreenMode: 0x7f97fae1ce00; size = 1242.000000 x 2208.000000>>, scale: 3.000000, nativeScale: 3.000000
Размер для iPhone 6 и iPhone 6S с масштабированием @2x (название Apple: Retina HD 4.7), координатное пространство: 375 x 667 и 750 x 1334 пикселей, 326 ppi, физический размер экрана - 2.3 x 4.1 дюйм или 58 x 104 mm. При запуске в режиме Zoomed, то есть без новых LaunchImages, экран имеет размер 320 x 568 точек, что является собственным размером iPhone 5:
Screen bounds: {{0, 0}, {375, 667}}, Screen resolution: <UIScreen: 0x7fa01b5182d0; bounds = {{0, 0}, {375, 667}};
mode = <UIScreenMode: 0x7fa01b711760; size = 750.000000 x 1334.000000>>, scale: 2.000000, nativeScale: 2.000000
И iPhone 5 для сравнения - 640 x 1136, iPhone 4 640 x 960.
Вот код, который я использовал, чтобы проверить это (обратите внимание, что nativeScale работает только на iOS 8):
UIScreen *mainScreen = [UIScreen mainScreen];
NSLog(@"Screen bounds: %@, Screen resolution: %@, scale: %f, nativeScale: %f",
NSStringFromCGRect(mainScreen.bounds), mainScreen.coordinateSpace, mainScreen.scale, mainScreen.nativeScale);
Примечание. Загрузите LaunchImages, иначе приложение запустится в режиме масштабирования и не покажет правильное масштабирование или размеры экрана. В режиме масштабирования nativeScale
и scale
будут не совпадать. На самом устройстве весы могут быть 2,608 на iPhone 6 Plus, даже если он не работает в режиме Zoomed, но он покажет масштаб 3,0 при работе на симуляторе.
Реальное/физическое разрешение iPhone 6 Plus составляет 1920x1080, но в Xcode вы создаете свой интерфейс для разрешения 2208x1242 (736x414 точек), а на устройстве он автоматически уменьшается до 1920x1080 пикселей.
Решения iPhone для быстрого доступа:
Device Points Pixels Scale Physical Pixels Physical PPI Size
iPhone X 812x375 2436x1125 3x 2436x1125 458 5.8"
iPhone 6 Plus 736x414 2208x1242 3x 1920x1080 401 5.5"
iPhone 6 667x375 1334x750 2x 1334x750 326 4.7"
iPhone 5 568x320 1136x640 2x 1136x640 326 4.0"
iPhone 4 480x320 960x640 2x 960x640 326 3.5"
iPhone 3GS 480x320 480x320 1x 480x320 163 3.5"
Вероятно, вам следует прекратить использование изображений запуска в iOS 8 и использовать раскадровку или nib/xib.
В Xcode 6 откройте меню File
и выберите New
⟶ File...
⟶ iOS
⟶ User Interface
⟶ Launch Screen
.
Затем откройте настройки для своего проекта, щелкнув по нему.
На вкладке General
в разделе App Icons and Launch Images
установите Launch Screen File
только что созданные файлы (это установит UILaunchStoryboardName
в info.plist
).
Обратите внимание, что на данный момент симулятор будет показывать только черный экран, поэтому вам нужно проверить на реальном устройстве.
Добавление файла xib экрана запуска в проект:
Настройка вашего проекта на использование xib файла Launch Screen вместо каталога Asset:
На физическом устройстве основные ограничения экрана iPhone 6 Plus 2208x1242, а nativeBounds - 1920x1080. Существует аппаратное масштабирование для изменения размера на физический дисплей.
В симуляторе основные ограничения экрана iPhone 6 Plus и nativeBounds - это 2208x1242.
Другими словами... Видео, OpenGL и другие вещи, основанные на CALayers
, которые имеют дело с пикселями, будут иметь дело с реальным буфером 1920x1080 на устройстве (или 2208x1242 на сим). Вещи, касающиеся точек в UIKit
, будут иметь дело с границами 2208x1242 (x3) и масштабироваться по мере необходимости на устройстве.
Симулятор не имеет доступа к тому же оборудованию, которое делает масштабирование на устройстве, и на самом деле не очень полезно имитировать его в программном обеспечении, поскольку они будут давать разные результаты, чем аппаратное обеспечение. Таким образом, имеет смысл установить nativeBounds
основного экрана моделируемого устройства на границы основного экрана физического устройства.
iOS 8 добавил API к UIScreen
(nativeScale
и nativeBounds
), чтобы разработчик определил разрешение CADisplay
, соответствующее UIScreen
.
Для таких, как я, которые задаются вопросом, как обрабатываются устаревшие приложения, я немного тестировал и вычислял эту тему.
Благодаря подсказке @hannes-sverrisson я начал с предположения, что устаревшее приложение обрабатывается с разрешением 320x568 в iPhone 6 и iPhone 6 плюс.
Тест проводился с простым черным фоном [email protected]
с белой рамкой. Фон имеет размер 640x1136 пикселей, а черный - с внутренней белой границей 1 пикселя.
Ниже приведены скриншоты, предоставленные симулятором:
На скриншоте iPhone 6 мы видим краю пикселов размером 1   в верхней и нижней частях белой границы и 2 пикселя на iPhone 6 плюс скриншот. Это дает нам использованное пространство 1242x2204 на iPhone 6 плюс вместо 1242x2208 и 750x1332 на iPhone 6 вместо 750x1334.
Мы можем предположить, что эти мертвые пиксели должны учитывать соотношение сторон iPhone 5:
iPhone 5 640 / 1136 = 0.5634
iPhone 6 (used) 750 / 1332 = 0.5631
iPhone 6 (real) 750 / 1334 = 0.5622
iPhone 6 plus (used) 1242 / 2204 = 0.5635
iPhone 6 plus (real) 1242 / 2208 = 0.5625
Во-вторых, важно знать, что ресурсы @2x будут масштабироваться не только на iPhone 6 plus (который ожидает активы @3x), но и на iPhone 6. Вероятно, это связано с тем, что не масштабирование ресурсов привело бы к неожиданным макетов, из-за расширения вида.
Однако это масштабирование не равносильно ширине и высоте. Я попробовал его с ресурсом 264x264 @2x. Учитывая результаты, я должен предположить, что масштабирование прямо пропорционально отношению пикселей/точек.
Device Width scale Computed width Screenshot width
iPhone 5 640 / 640 = 1.0 264 px
iPhone 6 750 / 640 = 1.171875 309.375 309 px
iPhone 6 plus 1242 / 640 = 1.940625 512.325 512 px
Device Height scale Computed height Screenshot height
iPhone 5 1136 / 1136 = 1.0 264 px
iPhone 6 1332 / 1136 = 1.172535 309.549 310 px
iPhone 6 plus 2204 / 1136 = 1.940141 512.197 512 px
Важно отметить, что масштабирование iPhone 6 отличается от ширины и высоты (309x310). Это, как правило, подтверждает приведенную выше теорию о том, что масштабирование не пропорционально по ширине и высоте, но использует соотношение пикселей/точек.
Надеюсь, это поможет.
Посмотрите эту информацию: http://www.paintcodeapp.com/news/iphone-6-screens-demystified
В нем объясняются различия между старыми iPhone, iPhone 6 и iPhone 6 Plus. Вы можете увидеть сравнение размеров экрана в точках, отображаемых пикселях и физических пикселях. Вы также найдете ответ на свой вопрос:
iPhone 6 Plus - с дисплеем Retina HD. Масштабирующий коэффициент равен 3, а изображение затем уменьшалось от отображаемых 2208 × 1242 пикселей до 1920 × 1080 пикселей.
Коэффициент масштабирования - 1920/2208 = 1080/1242 = 20/23. Это означает, что каждые 23 пикселя от исходного рендеринга должны отображаться до 20 физических пикселей. Другими словами, изображение уменьшено до приблизительно 87% от его первоначального размера.
Update:
Существует обновленная версия инфографики, упомянутая выше. Он содержит более подробную информацию о различиях в разрешении экрана и охватывает все модели iPhone до сих пор, включая 4-дюймовые устройства.
http://www.paintcodeapp.com/news/ultimate-guide-to-iphone-resolutions
Даже если мне вообще не нравится тон блога Джона Грубера Daring Fireball, его "Большая гипотеза для iPhone" стоит того, чтобы читать.
Он догадался, но получил ровно право как разрешения в точках, так и в пикселях для обеих моделей, за исключением того, что он не (я тоже) не ожидаю, что Apple построит физический дисплей меньшего разрешения и уменьшит масштаб ( детали находятся в ответе @Tommy).
Суть всего в том, что следует перестать думать о пикселях и начать думать с точки зрения точек (это было довольно долгое время, это не недавнее изобретение) и в результате физического размера элементов пользовательского интерфейса. Короче говоря, обе новые модели iPhone улучшаются в этом отношении, так как физически большинство элементов остаются одного размера, вы можете просто разместить их на экране (для каждого большего экрана вы можете поместиться больше).
Я просто немного разочарован тем, что не сохранил отображение внутреннего разрешения на фактическое разрешение экрана 1:1 для большей модели.