iPhone X - последняя модель из серии iPhone от Apple, представленная в сентябре 2017 года. Этот уникальный и выразительный телефон поступит в продажу по всему миру с 3 ноября.
С первого взгляда вы заметите, что этот телефон, особенно его экран, полностью изменил форму существующих iPhone.
- Сверху на нем есть выемка.
- Закругленные углы.
- Внизу всегда присутствует черная полоса.
Эти изменения коснутся всего дизайна пользовательского интерфейса и его реализаций, включая веб, Cordova и нативные приложения. Таким образом, разработчикам приходится иметь дело с изменениями / адаптациями специально для iPhone X. В этой статье я расскажу о необходимых изменениях. для iPhone X.
Попутно я расскажу, как создавать приложения Vue, подобные нативным приложениям для iPhone X, используя Пользовательский интерфейс Onsen, который недавно поддерживал iPhone X.
TL;DR
- Если вы видите слева / справа белые пустые области в веб-приложениях или приложениях Cordova в ландшафтном режиме iPhone X Safari, вы можете удалить их, установив
viewport-fit=cover
илиbody { background-color: black; }
. - Если выемка, закругленные углы или нижняя панель iPhone X конфликтуют с содержимым страницы в вашем веб-приложении или приложении Cordova, вы должны установить соответствующие
margin
иpadding
в крайние поля. (Если вы используете пользовательский интерфейс Onsen, это можно сделать, добавив атрибутыonsflag-iphonex-portrait
иonsflag-iphonex-landscape
к элементуhtml
.) - Если вы видите черные пустые области в приложении Cordova на iPhone X, вы можете удалить их, включив заставку на основе раскадровки с помощью
cordova-plugin-splashscreen
или предоставив iPhone X-size (2436 x 1242 пикселей) изображение заставки. - Исходный код примера доступен в этом репозитории GitHub.
Эта статья разделена на две основные части:
- ЧАСТЬ I: создание нативных веб-приложений для iPhone X
- ЧАСТЬ II. Создание приложений, похожих на нативные, с помощью Cordova для iPhone X
ЧАСТЬ I. Создание веб-приложений, похожих на нативные, для iPhone X
В случае веб-приложений поддержка iPhone X означает поддержку iPhone X Safari.
Но что произойдет, если мы покажем веб-приложения в сафари iPhone X?
Настроить веб-приложение
Прежде всего, давайте создадим веб-приложение. Для более плавного объяснения я собираюсь реализовать шаблон Панель вкладок, наиболее распространенный шаблон в приложениях для iOS.
Для его реализации выбрал Onsen UI. Onsen UI - это библиотека с открытым исходным кодом, содержащая набор компонентов iOS и Android для приложений Vue.
Версии пакетов NPM, которые мы будем использовать, показаны ниже:
[email protected]
[email protected]
(Основной пакет)[email protected]
(Дополнительный пакет для Vue)
(1) Для существующих проектов Vue пользовательский интерфейс Onsen можно установить с помощью NPM или Yarn:
# NPM npm install onsenui vue-onsenui --save-dev # Yarn yarn add onsenui vue-onsenui -D
В приложение должны быть включены некоторые необходимые файлы:
import 'onsenui/css/onsenui.css'; // Webpack CSS import import 'onsenui/css/onsen-css-components.css'; // Webpack CSS import import VueOnsen from 'vue-onsenui'; Vue.use(VueOnsen);
(2) В противном случае новые проекты можно запускать сразу через Vue CLI. При желании он может добавить Vuex и некоторые другие функции:
vue init OnsenUI/vue-pwa-webpack # For PWA
После настройки пользовательского интерфейса Vue и Onsen следующим шагом будет создание App.vue
и NotesPage.vue
со следующими кодами и реализация шаблона панели вкладок.
Вот и все.
В этом посте я не очень подробно рассказываю о том, как реализовать шаблон панели вкладок. Если вы хотите узнать об этом больше, обратитесь к разделу v-ons-tabbar
в документации пользовательского интерфейса Onsen.
Проблема I - левая / правая пустая область в ландшафтном режиме
Итак, давайте покажем созданный шаблон панели вкладок в iPhone X Safari. Теперь я буду использовать iPhone X Simulator, доступный в Xcode 9, вместо настоящего.
При запуске локального HTTP-сервера и доступе к нему из симулятора будут отображаться следующие экраны:
В случае портретного режима вроде нормально. Затем давайте посмотрим, что произойдет, если мы повернем экран.
О, белые пустые области появились с обеих сторон. На самом деле они автоматически вставляются iPhone X Safari. Это связано с тем, что если с обеих сторон нет пустых областей, выемка и закругленные углы скроют часть содержимого страницы.
Я назову это Проблема I. Пустые области слева и справа появляются в альбомной ориентации.
Цвет этих левых / правых пустых областей можно изменить, указав background-color
в элементе html
и body
элементе, поэтому, если мы установим его на black
, некоторые странности могут быть уменьшены.
body { background-color: black; /* Quick fix for Problem I */ }
Но это решение вызывает несоответствие ширины адресной строки и ширины страницы на страницах, не окрашенных в черный цвет, и приводит к странному виду, поэтому решение не является полным.
Исправить проблему I. Управление пустыми областями слева и справа
iPhone X Safari предоставляет возможность включать / отключать левые / правые пустые области.
Пустые области можно контролировать с помощью специального аргумента viewport-fit
в <meta name="viewport" content="...">
. viewport-fit
принимает auto
, contain
и cover
как допустимые значения.
auto
Значение по умолчанию. Эквивалентcontain
в Safari.contain
Область просмотра не покрывает весь экран, создавая пустые области.
(Аналогично поведениюobject-fit: contain;
)cover
Область просмотра покрывает весь экран, удаляя пустые области.
Итак, установим viewport-fit
на cover
.
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover">
Пустые области исчезли, и проблема I была исправлена.
Проблема II - содержание страницы, скрытое препятствиями
Есть другие проблемы, кроме проблемы I. Вы могли бы заметить, что нижняя черная полоса скрывает текстовую часть панели вкладок. Более того, при решении проблемы I выемка и закругленные углы скрыли больше содержимого страницы.
Проблема II заключается в том, что выемка, закругленные углы и нижняя полоса могут скрыть часть содержимого страницы.
Исправить проблему II
По сути, мы можем решить проблему, заключающуюся в том, что компоненты страницы скрыты, установив соответствующие значения для margin
и padding
, чтобы блоки не были скрыты выемкой, углами и полосой.
В качестве самого простого решения мы также можем установить margin-left
и margin-right
в элемент body
. В зависимости от дизайна вашего веб-приложения этого может быть достаточно. Но если есть поле, такое как панели вкладок, которое расширяется с левой стороны на правую, установка поля для элемента body
приводит к прекращению действия поля и вызывает странный вид. Кроме того, нам приходится сталкиваться с проблемой скрытия текста за черной нижней панелью.
Следовательно, в зависимости от дизайна вашего веб-приложения вам необходимо установить margin
и padding
для всех полей, вызывающих проблему. Это довольно утомительно, но также необходимо добиться оптимизированного пользовательского интерфейса для iPhone X Safari.
Если мы хотим установить margin
и padding
для определенного поля, нам нужно сделать настройку включенной только в ландшафтном режиме.
Для этого можно использовать orientation
медиа-функцию. Когда(orientation: landscape)
добавляется к медиа-запросу, соответствующая таблица стилей будет активна только в том случае, если область просмотра находится в альбомном режиме (размер удовлетворяет width
›height
).
@media screen and (orientation: landscape) { .some-box { padding-left: 44px; padding-right: 44px; } }
Кстати, как далеко мы должны располагать блоки от края экрана, чтобы блоки не были скрыты выемкой, углами и полосой?
В качестве конкретных ценностей Apple определила понятие под названием безопасная зона.
Понимание безопасной зоны
Безопасная зона - это область, в которую не могут попасть выемка, углы и планка.
Все приложения должны придерживаться безопасной области и полей макета, определенных UIKit, что обеспечивает соответствующую вставку в зависимости от устройства и контекста.
(Источник: https://developer.apple.com/ios/human-interface-guidelines/overview/iphone-x/)
Поэтому, если мы хотим размещать блоки далеко от краев экрана, нам просто нужно установить вставки безопасных областей, которые представляют собой набор длин от каждого края экрана.
iPhone X Safari имеет «верх = 0, правый = 44, нижний = 21, левый = 44» в качестве вставок безопасной области в ландшафтном режиме. (Мы можем проверить значение с помощью API iOS.) Итак, нам просто нужно изменить панель вкладок, чтобы в нашем случае левое / правое заполнение было равно 44px
, а нижнее - 21px
.
Проблема II может быть решена такой устойчивой настройкой.
Совет: использование
constant()
требует внимания
В официальном блоге WebKit объясняется, как поддерживать безопасную зону с помощью новой функции CSS
constant()
и четырех константsafe-area-inset-left
,safe-area-inset-right
,safe-area-inset-top
,safe-area-inset-bottom
в сообщении, опубликованном 22 сентября 2017 года. Четыре константыsafe-area-inset-*
обладают двумя хорошими характеристиками: значение устанавливается, только еслиviewport-fit
установлено наcover
и значение автоматически переключается между портретным значением и значением альбомной ориентации при повороте экрана.
Но функция
constant()
и четыре константыsafe-area-inset-*
имеют следующие проблемы:
(1) Функция
constant()
была удалена из стандарта CSS и переименована вenv()
function с 21 сентября 2017 года.constant()
функция по-прежнему доступна в iOS 11.0 Safari, но может быть удалена и станет непригодной для использования в будущем.
(2)
constant()
иenv()
не работают в браузерах, кроме Safari по состоянию на ноябрь 2017 г., и это вызывает ошибки, если мы пишем такие коды, какpadding-left: calc(constant(safe-area-inset-left) + 10px);
. Поэтому нам всегда нужно писать резервные правила для этих браузеров. Немного сложно использовать.
(3) iOS 11.0 UIWebView имеет ошибку, из-за которой даже при повороте экрана изменение четырех констант
safe-area-inset-*
не отражается на экране.
Я рекомендую использовать необработанные значения (пример: top = 0, right = 44, bottom = 21, left = 44) напрямую или через переменные вместо зависимости от
safe-area-inset-*
в течение некоторого времени, чтобы избежать описанного выше риска.
Использование помощника поддержки iPhone X в библиотеках пользовательского интерфейса
В некоторых библиотеках пользовательского интерфейса есть функция, которая помогает поддерживать iPhone X. Пользовательский интерфейс Onsen, который я выбрал сейчас, предоставляет возможность автоматически устанавливать соответствующие margin
и padding
.
Добавление атрибута onsflag-iphonex-landscape
к элементу html
включает исправление CSS для iPhone X и изменяет margin
и padding
каждого поля, которое требует исправления.
Что касается других устройств iOS, атрибутonsflag-iphonex-landscape
следует добавлять только в iPhone X. Для этого было бы проще использовать this.$ons.platform.isIPhoneX()
:
beforeMount() { const html = document.documentElement; if (this.$ons.platform.isIPhoneX()) { html.setAttribute('onsflag-iphonex-landscape', ''); } },
Некоторые библиотеки пользовательского интерфейса упрощают решение проблемы установки margin
и padding
, как я писал выше.
Наряду с проблемой I, наконец, была исправлена проблема II, заключающаяся в том, что содержимое страницы скрыто препятствиями.
Резюме ЧАСТИ I
В ЧАСТИ I мы использовали шаблон панели вкладок в качестве примера и объяснили проблему I (проблема с пустой областью) и проблему II (проблема сокрытия содержимого страницы), а затем предложили решения для каждой проблемы.
Решив проблему I и проблему II, iPhone X поддерживает веб-приложения.
В ЧАСТИ I мы упоминали о веб-приложениях.
Но я думаю, что некоторые из вас создают приложения Cordova с помощью набора инструментов Cordova или Monaca. Итак, я хотел бы объяснить, как сделать ваше приложение Cordova совместимым с iPhone X.
ЧАСТЬ II - Создание нативных приложений с помощью Cordova для iPhone X
В случае приложения Cordova поддержка iPhone X означает поддержку iPhone X WebView.
Итак, давайте посмотрим, что произойдет, если мы покажем приложения Cordova в iPhone X WebView так же, как ЧАСТЬ I.
Настроить приложение Cordova
Давайте создадим приложение Cordova на Vue.
Версии программного обеспечения, которое мы будем использовать, показаны ниже:
[email protected]
[email protected]
(базовый пакет)[email protected]
(Дополнительный пакет для Vue)[email protected]
[email protected]
- Xcode 9.0
(1) Для существующих проектов Cordova + Vue его можно установить с помощью NPM или Yarn:
# NPM npm install onsenui vue-onsenui --save-dev # Yarn yarn add onsenui vue-onsenui -D
В приложение должны быть включены некоторые необходимые файлы:
import 'onsenui/css/onsenui.css'; // Webpack CSS import import 'onsenui/css/onsen-css-components.css'; // Webpack CSS import import VueOnsen from 'vue-onsenui'; Vue.use(VueOnsen);
(2) В противном случае новые проекты можно запускать сразу через Vue CLI. При желании он может добавить Vuex и некоторые другие функции:
vue init OnsenUI/vue-cordova-webpack # For Cordova apps
(3) После настройки Cordova, Vue и OnsenUI давайте создадим App.vue
и NotesPage.vue
со следующим содержимым, как в ЧАСТИ I, и реализуем шаблон панели вкладок.
Вот и все.
Как насчет проблемы I?
В ЧАСТИ I мы объяснили проблему I - iPhone X Safari автоматически вставляет белые пустые области с обеих сторон.
Итак, давайте проверим, сохраняется ли проблема I в iPhone X WebView.
cordova platform add ios npm run build && cordova run ios --target="iPhone-X"
О, в случае приложений Cordova кажется, что пустые области появляются даже в портретном режиме.
Тогда что происходит в ландшафтном режиме?
В альбомном режиме слева, справа и снизу появлялись пустые области.
Оказалось, что проблема I все еще возникает в приложениях Cordova. Но, как и в ЧАСТИ I, эту проблему можно решить, просто установив viewport-fit
на cover
.
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover">
Совет: проблема I уже устранена в WKWebView
В iOS 11 есть два WebView: старый UIWebView (по умолчанию Cordova, не рекомендуется Apple) и новый WKWebView (рекомендованный Apple).
В UIWebView, поскольку
auto
изviewport-fit
указывает наcontain
, мы должны изменить его наcover
. Но в WKWebViewauto
по умолчанию указывает наcover
(подтверждено автором). Это означает, что Проблема I уже исправлена в WKWebView, и нам больше не нужно устанавливатьviewport-fit=cover
.
Поскольку WKWebView - это API нового поколения, в целом он работает стабильно по сравнению с UIWebView в нескольких ситуациях. Если вы используете Cordova, я рекомендую заменить UIWebView на WKWebView с помощью плагина
cordova-plugin-wkwebview-engine
. Но также имейте в виду, что WKWebView имеет некоторые незначительные недостатки.
Проблема III
В случае веб-приложений, как только проблема I будет исправлена, мы можем начать работу над проблемой II - выемка, закругленные углы и нижняя панель могут скрыть некоторую часть содержимого страницы.
Но в случае с приложениями Cordova, даже если Проблема I решена, мы не можем сразу работать над Проблемой II, потому что есть другая проблема, Проблема III.
Посмотрим, что происходит на всем экране после решения Задачи I.
Есть черные пустые области: вверху / внизу в портретном режиме и слева / справа и внизу в альбомном режиме. Это то, что я называю проблемой III.
Подобно задаче I, но принцип, лежащий в основе проблемы, другой. Проблема III вызвана спецификацией iPhone X, согласно которой все приложения, не удовлетворяющие определенному условию, автоматически отображаются в безопасной области. Состояние объясняется следующим образом:
Включите собственное полноэкранное разрешение. Ваше приложение будет работать в полноэкранном режиме на iPhone X, если базовый SDK вашего проекта настроен на iOS 11 и у вас есть стартовая раскадровка или изображение для запуска iPhone X.
(Источник: https://developer.apple.com/ios/update-apps-for-iphone-x/)
Я хотел бы пояснить процитированную часть более конкретно. Прежде всего, в iOS есть два метода отображения заставок: (1) старый метод, который просто показывает изображение (по умолчанию Cordova, не рекомендуется Apple) и (2) новый метод, который показывает изображение с некоторым растяжением и обрезкой на основе механизма, называемого раскадровкой (рекомендовано Apple).
В случае (1), если приложение Cordova не содержит изображения, размер которого совпадает с разрешением экрана iPhone X (1125 x 2436 пикселей), приложение будет показано в безопасной области. . Добавление изображения размером 1125 x 2436 пикселей устраняет эту проблему, и приложение будет отображаться в полноэкранном режиме.
В случае (2) все приложения Cordova будут отображаться в полноэкранном режиме.
Но чтобы использовать (2), мы должны добавить плагин cordova-plugin-splashscreen
в приложение Cordova, используя следующую команду:
cordova plugin add cordova-plugin-splashscreen
А также изображения, из которых состоит экран-заставка, должны быть определены в <platform name="ios">
из config.xml
:
<splash src="res/screen/ios/Default@2x~iphone~anyany.png" />
<splash src="res/screen/ios/Default@2x~iphone~comany.png" />
<splash src="res/screen/ios/Default@2x~iphone~comcom.png" />
<splash src="res/screen/ios/Default@3x~iphone~anyany.png" />
<splash src="res/screen/ios/Default@3x~iphone~anycom.png" />
<splash src="res/screen/ios/Default@3x~iphone~comany.png" />
<splash src="res/screen/ios/Default@2x~ipad~anyany.png" />
<splash src="res/screen/ios/Default@2x~ipad~comany.png" />
Конечно, должны быть добавлены сами файлы изображений. Размер каждого изображения должен в основном соответствовать документу cordova-plugin-splashscreen
, и только для устройств с экраном Super Retina (@3x
), который имеет 3-кратное разрешение, я рекомендую установить размер изображения 2436 x 1242 пикселей, чтобы оно перекрывало самую длинную длинную сторону. iPhone X (2436 пикселей) и самая длинная короткая сторона iPhone 8 Plus (1242 пикселей). Обратите внимание, что в случае (2) приложения всегда отображаются в полноэкранном режиме и размер каждого изображения влияет только на поведение экрана-заставки и не влияет размер приложения.
Default@2x~iphone~anyany.png (=
1334x1334=
667x667@2x) Default@2x~iphone~comany.png (= 750
x1334=
375x667@2x) Default@2x~iphone~comcom.png (=
750x750=
375x375@2x)
Default@3x~iphone~anyany.png (= 2436
x2436 =
812x812@3x) Default@3x~iphone~anycom.png (= 2436
x1242=
812x414@3x) Default@3x~iphone~comany.png (=
1242x2436=
414x812@3x)
Default@2x~ipad~anyany.png (=
2732x2732=
1366x1366@2x) Default@2x~ipad~comany.png (= 1278x2732 =
639x1366@2x)
(Please save the images into res/screen/ios/)
В обоих методах (1) и (2) после правильной настройки приложение будет отображаться в полноэкранном режиме.
Проблема III исправлена. Но в то же время возникла проблема II (содержимое страницы, скрытое препятствиями). Итак, теперь давайте исправим проблему II.
Совет.
Проблему III не всегда нужно устранять, потому что l устранение проблемы III как она есть, предотвращает проблему II. Поскольку проблема II требует определенных затрат, это будет хорошим выбором , когда вы захотите сделать существующее приложение Cordova совместимым с iPhone X по невысокой цене.
Исправить проблему II
Как мы показали ранее, приложение Cordova вызывает проблему II как в портретном, так и в ландшафтном режимах.
Как и в ЧАСТИ I, в основном мы можем исправить проблему II, установив соответствующие значения для margin
и padding
, чтобы поля не были скрыты выемкой, углами и полосой.
Пользовательский интерфейс Onsen предоставляет исправление CSS для портретного режима, а также для ландшафтного режима. Добавление атрибутов onsflag-iphonex-portrait
и onsflag-iphonex-landscape
к элементу html
включает исправление CSS как в портретном, так и в ландшафтном режимах.
beforeMount() { const html = document.documentElement; if (this.$ons.platform.isIPhoneX()) { html.setAttribute('onsflag-iphonex-portrait', ''); html.setAttribute('onsflag-iphonex-landscape', ''); } }
Патч CSS работает следующим образом:
Проблема II в iPhone X WebView исправлена.
Резюме ЧАСТИ II
В ЧАСТИ II мы объяснили, что если мы покажем приложения Cordova в iPhone X WebView, это вызовет еще две проблемы, указанные ниже, в дополнение к проблемам в веб-приложениях:
- Белые пустые области отображаются в портретном режиме , а также в альбомном режиме.
- Приложения не отображаются в полноэкранном режиме по умолчанию (Проблема III).
Более того, я объяснил, что поддержка приложений Cordova в iPhone X сложнее, чем поддержка веб-приложений.
Однако эти проблемы можно легко исправить, установив viewport-fit=cover
и отобразив экран-заставку на основе раскадровки с помощью cordova-plugin-splashscreen
.
Даже если вы разрабатываете приложения Cordova, вы можете без проблем поддерживать iPhone X, рассматривая и решая проблемы I, II и III один за другим.
Теперь мы можем создавать приложения Cordova, такие как собственные приложения для iPhone X, путем реализации перехода между страницами с помощью компонентов пользовательского интерфейса Onsen, таких как Action Sheet (_ 125_) и Navigator (v-ons-navigator
):
Исходный код приведенного выше примера приложения Cordova выглядит так:
Полный исходный код приложения доступен в этом репозитории GitHub.
Заключение
В этом посте мы говорили о проблемах веб-приложений для iPhone X (ЧАСТЬ I) и проблемах приложений Cordova (ЧАСТЬ II). В частности, мы объяснили следующие три проблемы и способы их решения:
- Проблема I - пустые области по краям экрана, которые можно исправить с помощью
viewport-fit=cover
- Проблема II - содержимое страницы скрыто выемкой, закругленными углами и полосой, что можно исправить, установив соответствующие
margin
иpadding
. - Проблема III. Приложения не отображаются в полноэкранном режиме, что можно исправить, включив заставку на основе раскадровки.
Также было объяснено вспомогательное средство поддержки iPhone X для пользовательского интерфейса Onsen (html[onsflag-iphonex-portrait]
и html[onsflag-iphonex-landscape]
).
Надеюсь, этот пост поможет вам создавать потрясающие приложения, работающие на iPhone X. Удачного кодирования!
Что дальше
Учетная запись Twitter и веб-сайт Onsen UI находятся здесь:
- ♨️ Пользовательский интерфейс Onsen | Twitter
https://twitter.com/Onsen_UI - Пользовательский интерфейс Onsen для Vue
https://onsen.io/vue/
использованная литература
[css-variables] Свойства и переменные User Agent · Проблема № 1693 · w3c / csswg-drafts
https://github.com/w3c/csswg-drafts/issues/1693
(4 августа , 2017)
[CB-13273] Размер Webview неверен на iPhone X (Simulator) - ASF JIRA
https://issues.apache.org/jira/browse/CB-13273
(13 сентября 2017 г. )
Удаление белых полос в Safari на iPhone X
http://stephenradford.me/removing-the-white-bars-in-safari-on-iphone-x/
(14 сентября 2017 г. )
ios - Приложение Cordova не отображается правильно на iPhone X (Симулятор) - Переполнение стека
/ 46232813 # 46232813
(15 сентября 2017 г.)
34518947: Константы вставки безопасной области UIWebView не обновляются при повороте · Проблема № 18415 · lionheart / openradar-mirror
https://github.com/lionheart/openradar-mirror/issues/18415
( 20 сен, 2017)
Разработка веб-сайтов для iPhone X | WebKit
https://webkit.org/blog/7929/designing-websites-for-iphone-x/
(22 сентября 2017 г.)