Gestes en SwiftUI

Introduction aux Gestes

Dans SwiftUI, les gestes permettent de rendre les vues sensibles aux interactions tactiles, telles que les tapes, les glissements, les drags, et d'autres mouvements d'écran standards. Grâce à divers modificateurs, vous pouvez gérer la logique derrière ces gestes, notamment le geste de tap.

Gestes de Tap

Pour détecter un geste de tap, vous devez utiliser le modificateur .onTapGesture(). Voici un exemple :

var body: some View {
    Text("Bonjour, le monde!")
        .onTapGesture {
            print("Vue tapée")
        }
}

Chaque fois que la vue est tapée, le bloc de code à l'intérieur de .onTapGesture() s'exécute. Ce modificateur peut également prendre un argument entier nommé count qui spécifie le nombre de taps nécessaires avant d'exécuter le code.

Ainsi, vous pouvez écrire :

.onTapGesture(count: 3) {
    // Code à exécuter après 3 taps
}

Si le nombre est fixé à 3, cela signifie qu'il faudra taper trois fois pour activer le bloc de code.

Gestes de Long Press

Pour gérer les gestes de long press, on utilise le modificateur .onLongPressGesture(). Ce modificateur propose un paramètre supplémentaire nommé minimumDuration, qui définit le temps minimum écoulé avant que l'action ne soit exécutée. Par exemple :

var body: some View {
    Text("Bonjour, le monde!")
        .onLongPressGesture(minimumDuration: 2) {
            print("Vue maintenue tapée pour 2 secondes")
        }
}

Après avoir appuyé pendant 2 secondes sur la vue, un message s'affichera dans la console.

Gestes Avancés

Pour des gestes plus avancés et personnalisables, le modificateur .gesture() peut être utilisé. Vous pouvez l'associer à des structures de geste comme : - DragGesture() - LongPressGesture() - MagnificationGesture() - RotationGesture() - TapGesture()

Ces gestes possèdent des modificateurs spéciaux, généralement .onEnded() et .onChanged(), qui sont utilisés pour agir lorsque le geste est en cours (.onChanged()) ou complété (.onEnded()).

Voici un exemple avec le geste de magnification :

@State private var currentScale = 0.0
@State private var finalScale = 1.0
var body: some View {
    Text("Bonjour, le monde!")
        .scaleEffect(finalScale + currentScale)
        .gesture(
            MagnificationGesture()
                .onChanged { scale in
                    currentScale = scale - 1
                }
                .onEnded { scale in
                    finalScale += currentScale
                    currentScale = 0
                }
        )
}

Cependant, dans cet exemple, la vue ne revient pas à son état normal. Pour remédier à cela, il convient de réinitialiser la propriété currentScale dans le modificateur .onEnded() :

.onEnded { scale in
    withAnimation(.spring()) {
        currentScale = 0
    }
}

Ceci donne un effet de ressort à la vue lorsqu'elle revient à sa taille d'origine.