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.
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)
}
Il existe un modificateur sur Afficher pour désactiver ou activer l'interaction avec l'utilisateur:
disabled(_ disabled: Bool)
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.
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!")
}