web-dev-qa-db-fra.com

Comment désactiver l'interaction utilisateur sur la vue SwiftUI?

Disons que j'ai une hiérarchie de vues SwiftUI qui ressemble à ceci:

ZStack() {
    ScrollView {
        ...
    }
    Text("Hello.")
}

La vue Text empêche les événements tactiles d'atteindre le ScrollView sous-jacent.

Avec UIKit, j'utiliserais quelque chose comme .isUserInteractionEnabled pour contrôler cela, mais je ne trouve aucun moyen de le faire avec SwiftUI.

J'ai essayé d'ajouter un Gesture avec un GestureMask de .none sur la vue texte, mais cela ne semble pas fonctionner.

J'espère que je manque quelque chose d'évident ici, car je dois mettre des informations d'état en haut de la vue de défilement.

9
chockenberry

Qu'en est-il de l'utilisation de .allowsHitTesting ()?

https://developer.Apple.com/documentation/swiftui/image/3269586-allowshittesting

D'après ma compréhension, il devrait passer le geste à la vue arrière s'il est désactivé.

ZStack() {
    ScrollView {
        ...
    }
    Text("Hello.").allowsHitTesting(false)
}
8
MihaiL

Il existe un modificateur sur Afficher pour désactiver ou activer l'interaction avec l'utilisateur:

disabled(_ disabled: Bool)

3
LuLuGaGa

Il s'agit très probablement d'un bogue dans SwiftUI, mais la solution de contournement pour ce problème était de supprimer une .border() que j'avais mise sur la vue Text pour le débogage des limites.

3
chockenberry

Vous voulez vous assurer de remplir votre vue avec un peu de couleur, sauf la couleur claire (vous pouvez toujours changer l'opacité). J'ai également ajouté du flou pour masquer les éléments. Voici ce qui a fonctionné pour moi:

SwiftUI:

ZStack{
    SomeView().blur(radius: 12)
    Rectangle()
        .fill(Color.white.opacity(0))
        .allowsHitTesting(false)
}

Une autre façon de désactiver les interactions des utilisateurs comme les tapotements de défilement ou de bouton, mais associez une action aux taps d'utilisateurs (par exemple, un message aux utilisateurs que cette fonctionnalité arrive ou se cache derrière un mur payant):

SwiftUI:

VStack{
    SomeView().blur(radius: 12)
}
.contentShape(Rectangle())
.onTapGesture {
    print("No access!")
}
0
Repose