Skip to content

iOS: Thread locked on gesture dismissal when sheet presented in stack. #508

@ystefanov6

Description

@ystefanov6

Before submitting a new issue

  • I tested using the latest version of the library.
  • I tested using a supported version of React Native.
  • I checked for existing issues that might answer my question.

Bug Summary

First of all love the library, amazing stuff, you have my support. I noticed an issue recently with sheet dismissal particularly when using swipe back gestures when the sheet is presented in a stack with default card animation. You'll see from the 1st clip as soon as the swipe back or swipe down gesture is initiated, the thread is blocked until the sheet dismisses fully, and then the swipe animation jumps and resumes animating at the position relative to where your finger is. If I swipe quickly and release, the native screen transition won't trigger at all, only the sheet will dismiss, and I have to swipe back again to have it actually go back in the stack.

This is tested on the latest beta 3.9.0-beta.1 and the latest stable 3.8.2 version using iPhone 17 Pro running both SDK 55 and SDK 54. The 1st video shows the effect occurring on a stripped starter expo project on SDK 54 with only true sheet as external dep. The 2nd video is my project on SDK 55, where the sheet acts like an always-active chat sheet.

Ideally the sheet dismisses in parallel without blocking the navigation. Interpolating the sheet dismissal progress with the transition progress from react-native-screens could also be interesting:
import { useTransitionProgress } from "react-native-screens"; const { progress } = useTransitionProgress();

Affected Platforms

  • iOS
  • Android
  • Web
  • Other

Library Version

3.8.2 - 3.9.0-beta.1

Environment Info

System:
  OS: macOS 26.1
  CPU: (12) arm64 Apple M4 Pro
  Memory: 1016.63 MB / 24.00 GB
  Shell:
    version: "5.9"
    path: /bin/zsh
Binaries:
  Node:
    version: 22.16.0
    path: /Users/yuliyansavchev/.nvm/versions/node/v22.16.0/bin/node
  Yarn:
    version: 1.22.22
    path: /Users/yuliyansavchev/.nvm/versions/node/v22.16.0/bin/yarn
  npm:
    version: 10.9.2
    path: /Users/yuliyansavchev/.nvm/versions/node/v22.16.0/bin/npm
  Watchman: Not Found
Managers:
  CocoaPods:
    version: 1.16.2
    path: /opt/homebrew/bin/pod
SDKs:
  iOS SDK:
    Platforms:
      - DriverKit 25.2
      - iOS 26.2
      - macOS 26.2
      - tvOS 26.2
      - visionOS 26.2
      - watchOS 26.2
  Android SDK: Not Found
IDEs:
  Android Studio: Not Found
  Xcode:
    version: 26.2/17C52
    path: /usr/bin/xcodebuild
Languages:
  Java: Not Found
  Ruby:
    version: 2.6.10
    path: /usr/bin/ruby
npmPackages:
  "@react-native-community/cli":
    installed: 20.1.1
    wanted: latest
  react:
    installed: 19.1.0
    wanted: 19.1.0
  react-native:
    installed: 0.81.5
    wanted: 0.81.5
  react-native-macos: Not Found
npmGlobalPackages:
  "*react-native*": Not Found
Android:
  hermesEnabled: Not found
  newArchEnabled: Not found
iOS:
  hermesEnabled: Not found
  newArchEnabled: Not found

Steps to Reproduce

  1. Create simple layout with two screens, origin and destination using expo-router.
  2. Add a TrueSheet to the destination screen with some initial detent and make the sheet be visible on mount with initialDetentIndex={0}.
  3. Swipe back to go back in the stack.

Repro

https://github.com/ystefanov6/repro-true-sheet-gesture-dismiss

Additional Context

ScreenRecording_02-08-2026.19-09-51_1.MP4
Screen.Recording.Feb.8.2026.mp4

Metadata

Metadata

Assignees

No one assigned

    Labels

    acceptedIssue is acknowledged and acceptedbugSomething isn't workingrepro providedGood! Repro is provided

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions