Изучение данного блока предполагает предварительное знание синтаксиса языка Swift. Для успешного освоения этого материала, необходимо иметь базовое понимание синтаксиса языка Swift. Это включает в себя знание основных структур данных, операторов, циклов, функций, абстракций и других ключевых элементов языка. Без этих фундаментальных знаний будет сложно понять более сложные концепции и примеры, которые будут рассматриваться в данном блоке.


Жесты — механизм, позволяющий разработчикам реагировать на пользовательские взаимодействия с интерфейсом. Жесты включают такие действия, как нажатия, долгие нажатия, перетаскивания, масштабирование, вращение и многое другое. SwiftUI предоставляет ряд встроенных жестов, которые можно использовать для создания интуитивно понятных интерфейсов, а также возможность создания собственных жестов.

Как работают жесты в SwiftUI

SwiftUI обрабатывает события касания и другие сенсорные данные, чтобы обнаруживать и обрабатывать жесты. Эти данные включают позицию пальцев, длительность касания, угол вращения и другие параметры, которые затем преобразуются в действия, определенные разработчиком. Под капотом SwiftUI использует сочетание UIView (для iOS) или NSView (для macOS) и различных API для работы с событиями ввода. Жесты являются оберткой над этими API и предоставляют более удобный способ работы с пользователем.

Типы жестов и их примеры

TapGesture

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

Реализация: TapGesture обрабатывает событие касания (touch event) и проверяет, соответствует ли оно заданному количеству нажатий. Если количество нажатий совпадает, жест срабатывает.

Примеры:

  1. Простое нажатие
struct SimpleTapGestureExample: View {
    @State private var isTapped = false

    var body: some View {
        Text(isTapped ? "Tapped!" : "Tap me")
            .padding()
            .background(isTapped ? Color.green : Color.blue)
            .cornerRadius(10)
            .onTapGesture {
                isTapped.toggle()
            }
    }
}

1.gif

  1. Распознавание нескольких нажатий

 Чтобы поменялось значение tapCount, пользователю необходимо произвести двойной тап на кнопку

struct MultipleTapGestureExample: View {
    @State private var tapCount = 0

    var body: some View {
        VStack {
            Text("Double-tap to count")
            Text("Tapped \\(tapCount) times")
                .padding()
                .background(Color.orange)
                .cornerRadius(10)
                .onTapGesture(count: 2) {
                    tapCount += 1
                }
        }
    }
}

2.gif

  1. Распознавание нажатия с координатами
struct CoordinateTapGestureExample: View {
    @State private var location = CGPoint.zero

    var body: some View {
        VStack {
            Text("Tap location: \\(Int(location.x)), \\(Int(location.y))")
                .padding()
            Rectangle()
                .fill(Color.purple)
                .frame(width: 200, height: 200)
                .onTapGesture { loc in
                    location = loc
                }
        }
    }
}