by Guest » 03 Jan 2025, 19:04
Ich möchte, dass die Elemente in LazyVGrid einen Tippmodifikator haben (ihre Skalierung ändern) und gleichzeitig scrollen können. Ich habe für jedes Element einen Tippmodifikator eingerichtet und es funktioniert wirklich, aber die Möglichkeit, durch den Inhalt zu scrollen, verschwindet. Wenn ich jedoch meinen benutzerdefinierten Tippeffekt deaktiviere, ist das Scrollen wieder verfügbar. Wie kann ich einen Klickeffekt erzielen und gleichzeitig durch den Inhalt scrollen?
Code: Select all
struct ScaledTappable: ViewModifier {
@State var state = false
var tapHandler: () -> Void
func body(content: Content) -> some View {
content
.scaleEffect(state ? 0.9 : 1)
.gesture(
DragGesture(minimumDistance: 0)
.onChanged({ value in
withAnimation(.smooth(duration: 0.2)) {
state = true
}
})
.onEnded({ value in
withAnimation(.bouncy(duration: 0.5)) {
state = false
tapHandler()
}
})
)
}
}
extension View {
@ViewBuilder
func tappable(enabled: Bool = true, onTap: @escaping () -> Void) -> some View {
if enabled {
self.modifier(ScaledTappable(tapHandler: onTap))
} else {
self.opacity(0.3)
}
}
}
Ich möchte, dass die Elemente in LazyVGrid einen Tippmodifikator haben (ihre Skalierung ändern) und gleichzeitig scrollen können. Ich habe für jedes Element einen Tippmodifikator eingerichtet und es funktioniert wirklich, aber die Möglichkeit, durch den Inhalt zu scrollen, verschwindet. Wenn ich jedoch meinen benutzerdefinierten Tippeffekt deaktiviere, ist das Scrollen wieder verfügbar. Wie kann ich einen Klickeffekt erzielen und gleichzeitig durch den Inhalt scrollen?
[code]struct ScaledTappable: ViewModifier {
@State var state = false
var tapHandler: () -> Void
func body(content: Content) -> some View {
content
.scaleEffect(state ? 0.9 : 1)
.gesture(
DragGesture(minimumDistance: 0)
.onChanged({ value in
withAnimation(.smooth(duration: 0.2)) {
state = true
}
})
.onEnded({ value in
withAnimation(.bouncy(duration: 0.5)) {
state = false
tapHandler()
}
})
)
}
}
extension View {
@ViewBuilder
func tappable(enabled: Bool = true, onTap: @escaping () -> Void) -> some View {
if enabled {
self.modifier(ScaledTappable(tapHandler: onTap))
} else {
self.opacity(0.3)
}
}
}
[/code]