Хабрахабр

Gesturizer: 3D-touch и жесты в iOS приложения

Жесты на мобильных устройствах, выполняемые стилусом или пальцем, могут быть эффективнее и удобнее стандартных взаимодействий с кнопками и меню в зависимости от контекста и задачи. Однако, необходимость запоминания жестов и связанных с ними команд вызывают некоторые трудности. Кроме того, ограниченность пространства на мобильных устройствах и наличие кликабельных и подвижных элементов в UI усложняют распознавание жестов. Для решения данных проблем, предоставляю вашему вниманию библиотеку iOSGesturizer.

В кратце, данная библиотека позволяет обучаться и использовать разные виды жестов, выполненные одним пальцем, по всей площади дисплея и в любых iOS приложениях на девайсах с поддержкой 3D-touch. Теперь подробнее разберем на примере.
Возьмем готовый простой проект FoodTracker от Apple, который используется в их обучающих материалах. После того как библиотека была добавлена в этот проект через CocoaPods или обычным переносом файлов, откроем два файла из проекта.

В файле AppDelegate.swift инициализируем переменную window: UIWindow как экземпляр класса GesturizerWindow:

var window: UIWindow? = GesturizerWindow()

Теперь откроем файл MealTableViewController.swift и добавим viewDidAppear(_ animated: Bool):


override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) let window = UIApplication.shared.keyWindow! as! GesturizerWindow let view = GesturizerView() view.gestureHandler = {index in let alert = UIAlertView() alert.message = view.names[index] alert.addButton(withTitle: "OK") alert.show() } window.setGestureView(view: view) }

Через gestureHandler мы определили методы при распознавании жестов. В данном случае выводится имя жеста во всплывающем окне (cut, copy, или paste). Запустим проект и получаем следующее:

image

Как вы можете заметить, приложение распознает три вида жеста. Для отображения возможных жестов (пример слева), после сильного нажатия нужно подождать одну секунду и выполнить нужное вам движение пальцем. А после изучения, можно выполнять жесты и без ожидания (пример справа).

С точки зрения архитектуры все это дело выглядит вот так:

image

GesturizerWindow в первую очередь обрабатывает все касания экрана и определяет передать event на GesturizerView или на View-шки ниже. Стоит отметить, что GesturizerView нужен только для рисования жестов в Training Mode, в то время как обработка силы нажатия и распознование жестов происходит в GesturizerWindow. И к счастью для нас, GesturizerWindow не создает задержек в приложении, поскольку для распознования жестов используется быстрый и простой алгоритм 1$-Recognizer, который не требует обучения и тренировочных данных.

Если вам идея показалось интересной, жду pull-запросы.

P.S.: В дальнейшем планирую добавить функционалы для кастомизации жестов и параметров в целом.

Теги
Показать больше

Похожие статьи

Кнопка «Наверх»
Закрыть