Repository navigation
[iOS] Reset ScrollView frame when recycling - #59362
meta-codesync[bot] merged 1 commit into
Conversation
a875177 to
2f4e0a0
Compare
Visual regressionNo visual differences at android: no capture |
|
Hey @tomekzaw 👋 May I also kindly ask you to check this issue, please? 🙏 Initially I discovered it using So you may have more context on this? 🤔 |
|
@bartlomiejbloniarz has imported this pull request. If you are a Meta employee, you can view this in D129585510. |
javache
left a comment
There was a problem hiding this comment.
Review automatically exported from Phabricator review in Meta.
|
This pull request was successfully merged by @kirillzyusko in f6c9a85 When will my fix make it into a release? | How to file a pick request? |
|
Awesome, thank you @javache and @bartlomiejbloniarz for your time and review ❤️ |
Summary:
An interactive native-stack swipe-back with keyboard dismissal and native-driven
Animatedheight updates can leave the internalUIScrollViewwith a negative frame origin.prepareForRecycleresets the outer component's frame, but retains the inner view's geometry. Reopening the screen reuses that offset view, shifting its content upward and leaving a gap at the bottom.Reset
_scrollView.frametoself.boundsat the end ofprepareForRecycle.Warning
To reproduce this problem I had to use new experimental shared Animated backend + drive
heightupdates. And also use native-stack. I didn't find a way to reproduce it withoutreact-native-screens/native-stack, but I strongly believe that root cause lives inreact-nativecore.Minimal runnable reproduction | App.js code | Reproduction changes
The repro uses React Native Animated, native-stack, screens and safe-area-context. It has no Reanimated, Worklets or keyboard-controller dependency (though original problem was discovered with
react-native-keyboard-controller(#1200) /react-native-reanimated/react-native-worklets- in this PR I tried to isolate changes as close to bare RN as possible, but I still had to usereact-native-screensfor native navigation with gestures and all that stuff. Without navigation I didn't find a way to reproduce this problem - but repro confirms that it's not reanimated/keyboard-controlelr specific issue).The public Experimental release preset enables the shared Animated backend and C++ Native Animated.
Related report: react-native-keyboard-controller#1200.
Changelog:
[IOS] [FIXED] - Reset the inner ScrollView frame when recycling to prevent a stale offset on reuse.
Test Plan:
Verified using iPhone 16 Pro Simulator (iOS 18.5), Xcode 27.0, React Native 0.87.1 / Fabric.
Reproduction
At the pinned reproduction commit:
Enable the simulator's software keyboard. The interpolation constants target this device's 402 × 874 pt screen.
Important
The first opening maps native
onScrollevents to height usingAnimated.eventwithuseNativeDriver: true. Keyboard dismissal triggers a second resize after 100 ms.Then run
yarn apply-fix, rebuild withyarn ios --simulator "iPhone 16 Pro", and repeat the same steps.Results
Screenshots — iPhone 16 Pro Simulator, iOS 18.5
Videos — iPhone 16 Pro Simulator, iOS 18.5
before.mp4
after-english.mp4