В помощь мобильному разработчику

Добавление 3D Touch в Xamarin.Forms приложение

Александр Алексеев

Теперь, когда у меня появился новый iPhone 7, который поддерживает функцию 3D Touch, настало время для того, чтобы основательно изучить новые открывающиеся с этим возможности!

На тот случай, если Вы ещё этого не знаете, поясним, что 3D Touch (или Force Touch) является новой концепцией, которую Apple представила в iPhone 6s (Plus) и iOS 9. Теперь нажатия на экран различаются по степени, с которой пользователь давит на иконку приложения, и у разработчиков появляется шанс как-то использовать эту новую особенность в своих проектах.

Она уже является частью iOS, и её можно использовать, к примеру, для того, чтобы предварительно продемонстрировать пользователю какой-либо контент, освободив его от необходимости переходить в приложение, дабы его увидеть, но главным образом эта функция задействуется в некоторых ярлыках контекстного меню на главном экране iOS. Когда Вы запускаете 3D Touch, нажав на иконку какого-либо приложения, тогда, как правило, появляется ряд определенных опций, выбрав один из пунктов которых можно активировать конкретную функцию этого приложения, не переходя в него при этом. С введением iOS 10 нам теперь показывается ещё и виджет, связанный с соответствующим приложением, но об этом мы поговорим уже в следующей статье.

Это меню очень легко реализовать в Ваших собственных Xamarin (и Xamarin.Forms) приложениях, и именно этому мы и научимся в настоящей статье!

 

Возможности

Существуют несколько различных возможностей для того, чтобы использовать функцию 3D Touch в иконке приложения. Прежде всего, можно просто показывать статическое меню, которое играет роль меню для быстрого вызова команд. Когда пользователь нажимает на один из представленных ему пунктов, тогда открывается поле поиска либо какая-то другая нужная ему вкладка или определенный экран. Есть возможность использовать эту функцию и более динамично, к примеру, для того, чтобы показать недавно запускавшиеся песни в музыкальном приложении. Вы можете просто использовать значки по умолчанию, которые предоставляет компания Apple, но также есть возможность создавать и собственные иконки. Эти решения носят название «быстрые действия», и именно они будут рассматриваться в этой статье.

Другие функции, которые теперь доступны, это Peek, Pop и Pressure Sensitivity. Первая позволяет демонтировать какой-либо контент в режиме предпросмотра. Вспомните, как обратив внимание на некий пост в Facebook, Вы не сильно нажимаете на него, и затем видите краткое описание контента, который с ним связан. Если Вы нажимаете кнопку «дальше», то можете просмотреть этот материал полностью.

Функция Pressure Sensitivity предоставляет вам информацию о том, с какой степенью интенсивности пользователь нажимает на экран. К примеру, если приложение поддерживает функцию рисования, то Вы можете реализовать такую фичу, чтобы толщина линии, которую выводит пользователь на экране, менялась в зависимости от силы давления на дисплей.

В документации Xamarin можно более подробно ознакомиться со всем тем, что благодаря данной технологии удаётся сделать.

 

Конфигурации Quick Actions

В первую очередь прежде чем ввести в действие эту функциональность, следует подумать о том, какие элементы меню Вы хотели бы показывать. Демонстрировать здесь можно всё что угодно! Но, вероятно, наилучшим вариантом будет сделать так, чтобы тут показывалось что-то действительно значимое.

В приложение, которое я разрабатывал для нашей компании для регистрирования и хранения документов по заявлениям о покрытии расходов, я хотел реализовать именно это. Интерфейс приложения представляет перечень предыдущих заявлений, а также содержит кнопку для добавления новых. Так что я подумал про себя: «почему бы не поместить кнопку для добавления новых заявлений прямо у значка приложения?». И поэтому я хотел создать Quick Action, который позволят сразу же переходить на новый экран приложения, где производится добавление заявлений.

И первое, что для этого нужно сделать, это задать действия в файле Info.plist, как на представленном ниже примере:

 

Тут осуществляется ряд процессов, и я пройдусь по их ключевым именам:

  • С помощью UIApplicationShortcutItemIconType Вы можете установить иконку для Вашего Quick Action. Здесь есть целый список встроенных опций, которые можно использовать. Они будут охватывать большинство сценариев. Однако, если вы хотите использовать кастомную иконку, замените её с помощью ключа UIApplicationShortcutItemIconFile и установите строковую величину имени файла без расширения в Ваших ресурсах. То есть, если у Вас в ресурсах находится значение myawesomeicon.png, поменяйте его на myawesomeicon. Но также имейте в виду, что файл необходим типа PNG, и, кроме того, это должен быть одноцветный квадрат 35×35 пикселей.
  • Обратите внимание, что Вам всё равно необходимо добавить ключ UIApplicationShortcutItemIconType. Однако, при добавлении UIApplicationShortcutItemIconFile ключ IconType будет проигнорирован.
  • UIApplicationShortcutItemSubtitle является дополнительным ключом. Если Вы здесь что-либо пропишите, то это будет показано мелким шрифтом под объектом ключевого значения UIApplicationShortcutItemTitle. Ключ subtitle редко используется в популярных приложениях.
  • С помощью ключа UIApplicationShortcutItemTitle Вы указываете подпись под иконкой Вашего действия. Лучше сделать эту подпись короткой и содержательной, то есть прописать что-то подобное «добавить», «поиск» и т.д. Я в случае с моим приложением включил туда надпись: «добавить заявление о расходах».
  • Есть ещё один ключ UIApplicationShortcutItemType. Этот ключ также является обязательным и он определяет пункт, который выбрал пользователь. Он может быть любым до тех пор, пока является уникальным. Обычно в качестве шаблона используется идентификатор приложения с индексом, увеличивающим число.

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

Быстрое меню

Если Вы хотите на практике понаблюдать за тем, как это всё работает, то Вам понадобится MacBook Pro с поддержкой 3D touch на сенсорной панели либо же iPhone, который также поддерживает функцию 3D-нажатий. Хотя у эмуляторов и есть опции меню для имитации уровней силы нажатия, похоже на то, что они нескоро будут реализованы на практике.

 

Реализация Quick Action в коде

Итак, раз наше меню уже готово, давайте реализуем в нём некоторую логику. Если вы используете Xamarin.Forms, то следует перейти в iOS-проект, поскольку данные компоненты напрямую касаются именно iOS.

Хотя это и не является строго необходимым, вероятно, будет лучше, если Вы поместите идентификаторы ярлыков в некотором статическом классе для более простого использования. Так что создайте статический класс ShortcutIdentifier в Вашем iOS-проекте и реализуйте его примерно вот так:

 

Конечно, имена могут быть более значимыми. В моем случае они могут выглядеть следующим образом:

 

Просто убедитесь том, что строковые значения находятся в соответствии с теми, которые размещены в Вашем файле info.plist.

Здесь открывается несколько разных путей для того, чтобы это сделать; различие, главном образом, возникает из-за вида используемой архитектуры и того типа действия, которое Вы планируете реализовать. Я реализовал функциональность с помощью MessagingCenter. Хотя мне и не нравится использовать его слишком часто, но он позволил более ловко управиться с тем, что мне требовалось сделать, без необходимости в перестройке многих вещей. Для получения дополнительной информации о том, как его использовать (или, наоборот, не использовать), ознакомитесь с этой статьёй от Адама Педли.

Но давайте сначала о главном, я по той причине открыл мой AppDelegate.cs, потому что он является основной точкой входа у нашего приложения, и поэтому здесь нам следует определять нажимает ли пользователь на ярлык.

Сперва мы добавим сюда пару вещей, которых тут ещё нет.

 

На основании представленных комментариев задача должна быть вполне понятна.

В основном мы переопределяем PerformActionForShortcutItem, чтобы получать уведомление, когда требуется задействовать Quick Action, и мы можем задать метод, который займётся их обработкой.

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

Сейчас в PageModel моего основного экрана я подписал сообщение…

 

И указал, как его следует обрабатывать.

 

Тут присутствует некоторый код от FreshMvvm, потому что именно этот фреймворк я и использовал для разработки этого приложения. Главным образом эта функция вызывает любые другие страницы, поэтому у нас не возникает каких-либо странных повисаний навигации, ну и затем нам нужно выполнить команду для добавления нового запроса, который тут уже есть.

И вот и всё! Теперь, когда я запускаю приложение через меню Quick Action, я вижу новый пункт «добавление», как оно и требовалось, и тем самым отвоёвываю в сегодняшнем дне несколько драгоценных миллисекунд!

Дайте мне знать, что Вы думаете по этому поводу или о чём ещё вы бы желали узнать. В следующий раз я собираюсь заняться виджетом.

Кроме того, мне будет приятно узнать об интересных оригинальных реализациях функции Quick Actions, которые могут быть Вам известны.

Автор: Gerald Versluis
ИсточникБлог автора

Александр Алексеев
Александр Алексеев

Xamarin - разработчик. Работаю с .NET платформой с 2012 года, программирую в основном с использованием C#. За это время успел поработать с ASP.NET, Entity Framework, MSSQL, Git

Написать ответ