Путаница в разрешении iPhone 6 Plus: Xcode или сайт Apple? для разработки

265

Сайт Apple утверждает, что разрешение 1080p: 1920 x 1080

Тем не менее, экран запуска, требуемый Xcode (8.0 GM выпущен сегодня), имеет размер 2208 x 1242.

Кто прав?

Xcode

JasonGenX
источник
Образы для запуска iPhone 6+ должны быть 1242x2208 и 2208x1242. По крайней мере, это заставляет приложения работать должным образом в симуляторе (и это задокументировано в HIG). Я не понял, почему это отличается от предполагаемого физического размера экрана 1920x1080.
rmaddy
2
очень странное несоответствие.
JasonGenX
14
Отличное объяснение: paintcodeapp.com/news/iphone-6-screens-demystified
Андреас Лей,
Это может измениться в стабильной версии Xcode 6.1. Это?
Джайпракаш Дубей
3
Чтобы обновить ссылку от Андреаса, см. «Окончательное руководство по разрешениям iPhone» paintcodeapp.com/news/ultimate-guide-to-iphone-resolutions
Дэвид Джеймс

Ответы:

308

IPhone 6+ выполняет внутреннее рендеринг с использованием ресурсов @ 3x с виртуальным разрешением 2208 × 1242736x414 точками), а затем сэмплирует их для отображения. То же самое, что и использование масштабированного разрешения на MacBook Retina - оно позволяет им получить целое кратное для пиксельных активов, при этом, например, текст размером 12 пт выглядит одинаково по размеру на экране.

Так что, да, экраны запуска должны быть такого размера.

Математика:

6, 5, 5, 4 и 4 имеют размер 326 пикселей на дюйм и используют ресурсы @ 2x, чтобы придерживаться приблизительно 160 точек на дюйм всех предыдущих устройств.

6+ составляет 401 пикселей на дюйм. Таким образом, это гипотетически потребует примерно @ 2.46x активов. Вместо этого Apple использует @ 3x активы и сокращает общий объем производства до 84% от его естественного размера.

На практике Apple решила пойти с более чем 87%, превратив 1080 в 1242. Нет сомнений, что нужно было найти что-то максимально близкое к 84%, которое все еще давало бы интегральные размеры в обоих направлениях - 1242/1080 = 2208/1920 точно в то время как если бы вы превратили 1080, скажем, в 1286, вам нужно было бы как-то визуализировать 2286,22 пикселей по вертикали для хорошего масштабирования.

Томми
источник
6
Как вы рассчитали его -> «виртуальное разрешение 2208 × 1242 (с 736x414 точками)», и это «требует примерно @ 2,46x активов». Что UIScreen mainScreen] .bounds.size.height вернет для 6+? 568, 568 * 3 (1704) или 1920.
мск
1
Возможно добавить примечание к этому ответу об изображениях запуска? (см. ответ Ханнеса) Полезно иметь в виду, что существующие приложения обновляются (в противном случае он работает с разрешением 320x576 @ 3x - я был сбит с толку некоторое время!)
Джозеф Хамфри,
2
@msk [UIScreen mainScreen].bounds.size.heightвозвращает 736 в симуляторе iPhone 6+ в портретном режиме. Это значение 2208, деленное на шкалу 3. Ширина 414.
Rmaddy
1
Это не точно такой же размер с @ 3x с разрешением 1242 * 2208, он растянут на 6%.
Бинар
4
Какой ужасный клудж! Общесистемная потеря производительности, памяти и резкости лишь для того, чтобы немного упростить некоторые настройки размера на уровне API! Ну, я думаю, что все это будет иметь смысл, когда они выпустят iPhone 7 Plus с дисплеем 5,5 "461 ppi.
sup
114

Ответ заключается в том, что старые приложения работают в режиме масштабирования 2208 x 1242. Но при создании приложения для новых телефонов доступны следующие разрешения: 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 11, 11 Pro, 11 Pro Max

Размер для iPhone 11 Pro Max с масштабированием @ 3x , координатное пространство: 414 x 896 точек и 1242 x 2688 пикселей, 458 точек на дюйм, физический размер устройства составляет 3,06 x 6,22 дюйма или 77,8 x 158,0 мм. 6,5 "Super Retina XDR дисплей.

Размер для iPhone 11 Pro с масштабированием @ 3x , координатное пространство: 375 x 812 точек и 1125 x 2436 пикселей, 458 ppi, физический размер устройства 2,81 x 5,67 дюйма или 71,4 x 144,0 мм. 5,8 "Super Retina XDR дисплей.

Размер для iPhone 11 с масштабированием @ 2x , координатное пространство: 414 x 896 точек и 828 x 1792 пикселей, 326 ppi, физический размер устройства составляет 2,98 x 5,94 дюйма или 75,7 x 150,9 мм. 6,1-дюймовый жидкокристаллический дисплей Retina HD.

Размер для iPhone X🅂 Max с масштабированием @ 3x (название Apple: дисплей Super Retina HD 6.5 " ), пространство координат: 414 x 896 точек и 1242 x 2688 пикселей, 458 ppi, физический размер устройства 3,05 x 6,20 или 77,4 x 157,5 мм.

let screen = UIScreen.main
print("Screen bounds: \(screen.bounds), Screen resolution: \(screen.nativeBounds), scale: \(screen.scale)")
//iPhone X🅂 Max Screen bounds: (0.0, 0.0, 414.0, 896.0), Screen resolution: (0.0, 0.0, 1242.0, 2688.0), scale: 3.0

Размер для iPhone X🅁 с масштабированием @ 2x (название Apple: дисплей Super Retina HD 6.1 " ), пространство координат: 414 x 896 точек и 828 x 1792 пикселей, 326 ppi, физический размер устройства составляет 2,98 x 5,94 дюйма или 75,7 x 150,9 мм. ,

let screen = UIScreen.main
print("Screen bounds: \(screen.bounds), Screen resolution: \(screen.nativeBounds), scale: \(screen.scale)")
//iPhone X🅁 Screen bounds: (0.0, 0.0, 414.0, 896.0), Screen resolution: (0.0, 0.0, 828.0, 1792.0), scale: 2.0

Размер для iPhone X🅂 и iPhone X с масштабированием @ 3x (название Apple: Super Retina HD 5,8 "дисплей ), пространство координат: 375 x 812 точек и 1125 x 2436 пикселей, 458 ppi, физический размер устройства составляет 2,79 x 5,65 или 70,9 х 143,6 мм.

let screen = UIScreen.main
print("Screen bounds: \(screen.bounds), Screen resolution: \(screen.nativeBounds), scale: \(screen.scale)")
//iPhone X🅂 and X Screen bounds: (0.0, 0.0, 375.0, 812.0), Screen resolution: (0.0, 0.0, 1125.0, 2436.0), scale: 3.0

введите описание изображения здесь

Размер для 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 x 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 мм . При работе в режиме масштабирования, то есть без новых 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, даже если он не работает в режиме масштабирования, но при запуске на симуляторе он будет иметь масштаб 3.0.

Сравнение iPhone 6 и 6 Plus

Сверриссон
источник
3
Я полагаю, вы не добавили новые версии образа запуска. Вероятно, поэтому приложение работает в «режиме совместимости», а границы экрана - старые 320x576 на обоих устройствах.
Даниэль Ринсер,
3
Как только вы добавите новые размеры стартового изображения, вы получите правильные (логические) размеры экрана: 375x667 для iPhone 6 и 414x736 для 6+.
Даниэль Ринсер,
1
@DanielRinser Спасибо за это. Я это попробую.
Сверриссон
@DanielRinser спасибо за ваш вклад в загрузочные образы. Я обновил ответ, основываясь на ваших комментариях.
Сверриссон
а как насчет активов для iPhone 4? Как их назвать и как поместить их в каталог активов, если для них нет места? В каталоге активов есть 3 слота для изображений iPhone: 1x, 2x и 3x. Если 2x и 3x предназначены для активов iPhone 6 и 6+, должны ли мы поместить активы iPhone 4 в 1x? Я так не думаю.
утка
96

Реальное / физическое разрешение iPhone 6 Plus составляет 1920x1080, но в Xcode вы настраиваете интерфейс для разрешения 2208x1242 (736x414 точек), а на устройстве оно автоматически уменьшается до 1920x1080 пикселей.

Краткое описание разрешений iPhone:

Device          Points    Pixels     Scale  Physical Pixels   PPI   Ratio   Size
iPhone XS Max   896x414   2688x1242  3x     2688x1242         458   19.5:9  6.5"
iPhone XR       896x414   1792x828   2x     1792x828          326   19.5:9  6.1"
iPhone X        812x375   2436x1125  3x     2436x1125         458   19.5:9  5.8"
iPhone 6 Plus   736x414   2208x1242  3x     1920x1080         401   16:9    5.5"
iPhone 6        667x375   1334x750   2x     1334x750          326   16:9    4.7"
iPhone 5        568x320   1136x640   2x     1136x640          326   16:9    4.0"
iPhone 4        480x320   960x640    2x     960x640           326   3:2     3.5"
iPhone 3GS      480x320   480x320    1x     480x320           163   3:2     3.5"

разрешения iPhone

Лешек Сзары
источник
3
Красивый и простой ответ. Спасибо Лешек.
SJ Lim
46

Вам, вероятно, следует прекратить использовать образы запуска в iOS 8 и использовать раскадровку или nib / xib.

  • В Xcode 6 откройте Fileменю и выберите NewFile...iOSUser InterfaceLaunch Screen.

  • Затем откройте настройки вашего проекта, нажав на него.

  • На Generalвкладке, в названном разделе App Icons and Launch Images, установите Launch Screen Fileфайлы, которые вы только что создали (это будет установлено UILaunchStoryboardNameв info.plist).

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

Добавление xib-файла Launch Screen в ваш проект:

Добавление нового xib-файла Launch Screen

Конфигурирование вашего проекта для использования xib файла Launch Screen вместо Каталога Активов:

Настроить проект для использования Launch Screen xob

davidisdk
источник
1
Почти идеальные инструкции, но это должен быть Файл -> НОВИНКА -> Файл ... и т. Д. Потребовалось время, чтобы найти второй файл :) Спасибо за помощь!
Будет
Как вы делаете это хорошо выглядеть? Когда я пытаюсь нанести на него изображение, оно становится очень шатким.
Badweasel
Если вы не просто отображаете изображение и хотите показать пользовательский интерфейс для загрузки, это хорошая идея, так как изображение все равно должно быть соответствующего размера независимо от того, было ли оно в раскадровке или нет. Аналогично, если вы можете нарисовать изображение в коде, то вы можете обойти это, я полагаю.
AppHandwerker
Вам все еще нужно предоставить файлы изображений, если вы поддерживаете что-либо до iOS 8, так как стартовые xibs не имеют обратной совместимости.
Марк Бриджес
24

На физическом устройстве границы основного экрана 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.

Джереми Хаддлстон Секвойя
источник
13

Для таких, как я, которые задаются вопросом, как относятся к устаревшим приложениям, я провел небольшое тестирование и вычисления по этому вопросу.

Благодаря подсказке @ hannes-sverrisson я начал с предположения, что устаревшее приложение обрабатывается с разрешением 320x568 в iPhone 6 и iPhone 6 plus.

Тест проводился на простом черном фоне bg@2x.pngс белой каймой. Фон имеет размер 640x1136 пикселей и является черным с внутренней белой границей в 1 пиксель.

Ниже приведены скриншоты, предоставленные симулятором:

На снимке экрана iPhone 6 мы видим поле в 1 пиксель сверху и снизу белой границы и поле в 2 пикселя на снимке экрана iPhone 6 plus. Это дает нам б пространство 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). Это подтверждает приведенную выше теорию о том, что масштабирование не пропорционально ширине и высоте, а использует соотношение пикселей и точек.

Надеюсь, это поможет.

Франсуа Верри
источник
12

Проверьте эту инфографику: 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% от его первоначального размера.

Обновить:

Существует обновленная версия инфографики, упомянутой выше. Он содержит более подробную информацию о различиях в разрешении экрана и пока охватывает все модели iPhone, включая 4-дюймовые устройства.

http://www.paintcodeapp.com/news/ultimate-guide-to-iphone-resolutions

Darrarski
источник
Таким образом, даже если сглаживание отключено, существует ли необязательное сглаживание, которое происходит при уменьшении масштаба?
Сэм
Если бы эта инфографика включала 4-дюймовый экран, это было бы здорово.
Раджеш
@Rajesh Я обновил свой ответ, проверьте его сейчас для информации о 4-дюймовых устройствах.
Даррарски
4

Даже если мне вообще не нравится тон в блоге Daring Fireball Джона Грубера, его « Большая гипотеза дисплея iPhone» стоит того, чтобы ее прочитать.

Он догадался , но получил именно право и разрешение в точках и в пикселях для обеих моделей, за исключением того, что он не сделал (я ни) не ожидают , Apple , чтобы строить меньше разрешение физического дисплея и масштабирования вниз (подробности в @ ответ Томми).

Суть всего этого заключается в том, что нужно перестать думать с точки зрения пикселей и начать думать с точки зрения точек (это имело место довольно долгое время, это не недавнее изобретение) и получающегося в результате физического размера элементов пользовательского интерфейса. Короче говоря, обе новые модели iPhone улучшаются в этом отношении, так как физически большинство элементов остаются одинакового размера, вы можете просто разместить больше их на экране (для каждого большего экрана вы можете разместить больше).

Я просто немного разочарован, что они не сохранили отображение внутреннего разрешения на фактическое разрешение экрана 1: 1 для большей модели.

грубая сила
источник
мы думаем в точках, но, к сожалению, мы должны создавать изображения в пикселях в Photoshop ... 😃
Duck
2
Пиксели имеют значение для многих из нас по многим причинам. В то время как Apple по-своему следит за этой темой, они неохотно добавили [UIScreen nativeBounds] в iOS8 по очень веским причинам.
ctpenrose
Да, пиксели также важны, но для статических ресурсов, таких как изображения (заставки и тому подобное). Моя точка зрения (каламбур) была скорее для макета экрана приложения, вещи нарисованы динамически.
Rawpower