From 083fdf87b8886f61b498c52d972aa96637bd0e10 Mon Sep 17 00:00:00 2001 From: Brody Roberts Date: Mon, 2 Feb 2026 09:53:50 -0800 Subject: [PATCH 1/3] fix --- Sources/FlowStack/FlowTransition.swift | 4 ++-- Sources/FlowStack/View+InteractiveDismiss.swift | 16 +++++++++++----- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/Sources/FlowStack/FlowTransition.swift b/Sources/FlowStack/FlowTransition.swift index 30edb9f..3eb984e 100644 --- a/Sources/FlowStack/FlowTransition.swift +++ b/Sources/FlowStack/FlowTransition.swift @@ -162,11 +162,10 @@ extension AnyTransition { let scaleRatio = context.shouldScaleHorizontally ? zoomRect.size.width / proxy.size.width : 1.0 content - .onInteractiveDismissGesture(threshold: 80, isDismissing: isDismissing, swipeUpToDismiss: context.swipeUpToDismiss, onDismiss: { + .onInteractiveDismissGesture(threshold: 80, isEnabled: !isDisabled, isDismissing: isDismissing, swipeUpToDismiss: context.swipeUpToDismiss, onDismiss: { defer { isDismissing = true } guard !isDisabled else { return } dismiss() - isDismissing = true }, onPan: { offset in defer { self.isEnded = false } guard !isDisabled else { return } @@ -180,6 +179,7 @@ extension AnyTransition { } }) .onPreferenceChange(InteractiveDismissDisabledKey.self) { isDisabled in + print("🦦 isDisabled \(isDisabled)") self.isDisabled = isDisabled } .preference(key: SizePreferenceKey.self, value: proxy.size) diff --git a/Sources/FlowStack/View+InteractiveDismiss.swift b/Sources/FlowStack/View+InteractiveDismiss.swift index c19ca55..007a729 100644 --- a/Sources/FlowStack/View+InteractiveDismiss.swift +++ b/Sources/FlowStack/View+InteractiveDismiss.swift @@ -42,6 +42,7 @@ struct InteractiveDismissContainer: UIViewControllerRepresentable { var threshold: Double var onPan: (CGPoint) -> Void + var isEnabled: Bool var isDismissing: Bool var swipeUpToDismiss: Bool @@ -56,11 +57,12 @@ struct InteractiveDismissContainer: UIViewControllerRepresentable { } func updateUIViewController(_ uiViewController: InteractiveDismissViewController, context: Context) { + context.coordinator.isEnabled = isEnabled context.coordinator.isDismissing = isDismissing } func makeCoordinator() -> InteractiveDismissCoordinator { - InteractiveDismissCoordinator(threshold: threshold, onPan: onPan, isDismissing: isDismissing, swipeUpToDismiss: swipeUpToDismiss, onDismiss: onDismiss, onEnded: onEnded) + InteractiveDismissCoordinator(threshold: threshold, isEnabled: isEnabled, onPan: onPan, isDismissing: isDismissing, swipeUpToDismiss: swipeUpToDismiss, onDismiss: onDismiss, onEnded: onEnded) } } @@ -125,6 +127,7 @@ class InteractiveDismissCoordinator: NSObject, ObservableObject, UIGestureRecogn var threshold: Double var onPan: (CGPoint) -> Void + var isEnabled: Bool var isDismissing: Bool { didSet { guard isDismissing else { return } @@ -169,10 +172,11 @@ class InteractiveDismissCoordinator: NSObject, ObservableObject, UIGestureRecogn } } - init(threshold: Double, onPan: @escaping (CGPoint) -> Void, isDismissing: Bool, swipeUpToDismiss: Bool, onDismiss: @escaping () -> Void, onEnded: @escaping (Bool) -> Void) { + init(threshold: Double, isEnabled: Bool, onPan: @escaping (CGPoint) -> Void, isDismissing: Bool, swipeUpToDismiss: Bool, onDismiss: @escaping () -> Void, onEnded: @escaping (Bool) -> Void) { self.threshold = threshold self.onPan = onPan + self.isEnabled = isEnabled self.isDismissing = isDismissing self.swipeUpToDismiss = swipeUpToDismiss self.onDismiss = onDismiss @@ -183,11 +187,13 @@ class InteractiveDismissCoordinator: NSObject, ObservableObject, UIGestureRecogn super.init() self.panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(panGestureUpdated(recognizer:))) + self.panGestureRecognizer.isEnabled = isEnabled self.panGestureRecognizer.delegate = self self.edgeGestureRecognizer = UIScreenEdgePanGestureRecognizer(target: self, action: #selector(edgeGestureUpdated(recognizer:))) self.edgeGestureRecognizer.edges = [.left] self.edgeGestureRecognizer.delegate = self + self.edgeGestureRecognizer.isEnabled = isEnabled self.panGestureRecognizer.require(toFail: self.edgeGestureRecognizer) } @@ -212,7 +218,7 @@ class InteractiveDismissCoordinator: NSObject, ObservableObject, UIGestureRecogn onPan(offset) let shouldDismiss = offset.y > threshold || (offset.x > threshold && isEdge) || (-offset.y > threshold * 2 && swipeUpToDismiss) - if shouldDismiss != isPastThreshold && shouldDismiss, edgeGestureRecognizer.isEnabled, panGestureRecognizer.isEnabled { + if shouldDismiss != isPastThreshold && shouldDismiss, isEnabled { impactGenerator.impactOccurred() } @@ -278,7 +284,7 @@ class InteractiveDismissCoordinator: NSObject, ObservableObject, UIGestureRecogn } extension View { - func onInteractiveDismissGesture(threshold: Double = 50, isDismissing: Bool = false, swipeUpToDismiss: Bool, onDismiss: @escaping () -> Void, onPan: @escaping (CGPoint) -> Void = { _ in }, onEnded: @escaping (Bool) -> Void = { _ in }) -> some View { - InteractiveDismissContainer(threshold: threshold, onPan: onPan, isDismissing: isDismissing, swipeUpToDismiss: swipeUpToDismiss, onDismiss: onDismiss, onEnded: onEnded, content: self) + func onInteractiveDismissGesture(threshold: Double = 50, isEnabled: Bool = true, isDismissing: Bool = false, swipeUpToDismiss: Bool, onDismiss: @escaping () -> Void, onPan: @escaping (CGPoint) -> Void = { _ in }, onEnded: @escaping (Bool) -> Void = { _ in }) -> some View { + InteractiveDismissContainer(threshold: threshold, onPan: onPan, isEnabled: isEnabled, isDismissing: isDismissing, swipeUpToDismiss: swipeUpToDismiss, onDismiss: onDismiss, onEnded: onEnded, content: self) } } From 38dc0d1dfee9a702aebf9c922864e155ee81bd24 Mon Sep 17 00:00:00 2001 From: Brody Roberts Date: Mon, 2 Feb 2026 09:54:33 -0800 Subject: [PATCH 2/3] Done --- Sources/FlowStack/FlowTransition.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Sources/FlowStack/FlowTransition.swift b/Sources/FlowStack/FlowTransition.swift index 3eb984e..55a7014 100644 --- a/Sources/FlowStack/FlowTransition.swift +++ b/Sources/FlowStack/FlowTransition.swift @@ -179,7 +179,6 @@ extension AnyTransition { } }) .onPreferenceChange(InteractiveDismissDisabledKey.self) { isDisabled in - print("🦦 isDisabled \(isDisabled)") self.isDisabled = isDisabled } .preference(key: SizePreferenceKey.self, value: proxy.size) From b6ca657f5917106342897e9d94eb14ce9683433c Mon Sep 17 00:00:00 2001 From: Brody Roberts Date: Mon, 2 Feb 2026 09:59:51 -0800 Subject: [PATCH 3/3] edit --- Sources/FlowStack/View+InteractiveDismiss.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/Sources/FlowStack/View+InteractiveDismiss.swift b/Sources/FlowStack/View+InteractiveDismiss.swift index 007a729..3e6ed07 100644 --- a/Sources/FlowStack/View+InteractiveDismiss.swift +++ b/Sources/FlowStack/View+InteractiveDismiss.swift @@ -187,13 +187,11 @@ class InteractiveDismissCoordinator: NSObject, ObservableObject, UIGestureRecogn super.init() self.panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(panGestureUpdated(recognizer:))) - self.panGestureRecognizer.isEnabled = isEnabled self.panGestureRecognizer.delegate = self self.edgeGestureRecognizer = UIScreenEdgePanGestureRecognizer(target: self, action: #selector(edgeGestureUpdated(recognizer:))) self.edgeGestureRecognizer.edges = [.left] self.edgeGestureRecognizer.delegate = self - self.edgeGestureRecognizer.isEnabled = isEnabled self.panGestureRecognizer.require(toFail: self.edgeGestureRecognizer) }