From f154a0bcb4375eedbc09473b7a8622afad316b87 Mon Sep 17 00:00:00 2001 From: Levitating Pineapple Date: Mon, 23 Sep 2024 23:02:53 +0300 Subject: [PATCH] distance based animation duration --- .../Shared/Views/Helpers/SwiftUISheet.swift | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/apps/ios/Shared/Views/Helpers/SwiftUISheet.swift b/apps/ios/Shared/Views/Helpers/SwiftUISheet.swift index 16358dfb41..f044ac0770 100644 --- a/apps/ios/Shared/Views/Helpers/SwiftUISheet.swift +++ b/apps/ios/Shared/Views/Helpers/SwiftUISheet.swift @@ -42,9 +42,13 @@ struct SwiftUISheet: ViewModifier { .onChanged { relativeOffset = min(max(relativeOffset - $0.translation.height / sheetHeight, 0), 1) } - .onEnded { - isPresented = relativeOffset + $0.predictedEndTranslation.height / sheetHeight > 0.5 - animate(with: $0.velocity.height) + .onEnded { _ in + let ip = relativeOffset > 0.6 + if ip == isPresented { + animate() + } else { + isPresented = ip + } } ) .frame(maxHeight: .infinity, alignment: .bottom) @@ -60,9 +64,14 @@ struct SwiftUISheet: ViewModifier { } else { 0 } } - private func animate(with releaseVelocity: CGFloat? = nil) { - // TODO: Tune animation speed depending on drag gesture's final velocity - withAnimation { relativeOffset = isPresented ? 1 : 0 } + private func animate() { + let newOffset: Double = isPresented ? 1 : 0 + let distance: Double = abs(newOffset - relativeOffset) + if distance != 0 { + withAnimation( + .easeOut(duration: max(0.1, distance * 0.3)) + ) { relativeOffset = isPresented ? 1 : 0 } + } } struct ClipShape: Shape {