Pull to refresh

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

Reading time 2 min
Views 3.2K
Жесты на мобильных устройствах, выполняемые стилусом или пальцем, могут быть эффективнее и удобнее стандартных взаимодействий с кнопками и меню в зависимости от контекста и задачи. Однако, необходимость запоминания жестов и связанных с ними команд вызывают некоторые трудности. Кроме того, ограниченность пространства на мобильных устройствах и наличие кликабельных и подвижных элементов в 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.: В дальнейшем планирую добавить функционалы для кастомизации жестов и параметров в целом.
Tags:
Hubs:
+13
Comments 0
Comments Leave a comment

Articles