KeyboardTrackingView and KeyboardAccessoryView are bugged on iOS 26
Description
After upgrading to iOS 26, some strange bugs appeared while using KeyboardTrackingView or KeyboardAccessoryView.
- When hiding keyboard for the first time with interactive dismiss, a huge bottom margin appears in the inverted FlatList. And tracking view content disappears.
- When going back to screen while keyboard is opened, input in the tracking view is in the middle of the screen.
- Custom keyboard (by Yandex) permanently overlaps the input / accessory view from tracking view by several pixels.
Related to
- [x] Components
- [ ] Demo
- [ ] Docs
- [ ] Typings
Steps to reproduce
- FlatList + KeyboardTrackingView with text input inside + iOS 26 [+ custom keyboard]
- Open keyboard for the first time and dismiss with interactive dismiss
Expected behavior
No overlaps and huge bottom insets.
Actual behavior
- A huge bottom inset appears in FlatList
- Tracking view content disappears
- Overlap on the tracking content while custom keyboard is visible
More Info
Code snippet
<>
<FlatList inverted keyboardDismissMode="interactive" .../>
<Keyboard.KeyboardTrackingView trackInteractive>
<TextInput/>
</Keyboard.KeyboardTrackingView>
</>
Screenshots/Video
https://github.com/user-attachments/assets/37aed50a-e0f6-4d78-8797-43e6c45f30a0
Environment
- React Native version: 0.71.7
- React Native UI Lib version: 7.46.3
- "react-native-reanimated": "3.4.2",
- "react-native-gesture-handler": "2.9.0",
- Xcode 16.2
Affected platforms
- [ ] Android
- [x] iOS
- [ ] Web
Passing manageScrollView={false} to Keyboard.KeyboardTrackingView fixes issue with huge bottom inset, but its children (TextInput) are still blank for the first closing, and it still has issue with overlapping by keyboard.
Looks like blank tracking view content (but not inset) is fixed by changing intrinsicContentSize of ObservingInputAccessoryViewTemp to:
// New
- (CGSize)intrinsicContentSize
{
return CGSizeMake(self.bounds.size.width, _height);
}
// Old
- (CGSize)intrinsicContentSize
{
return CGSizeMake(self.bounds.size.width, _keyboardState == KeyboardStateWillShow || _keyboardState == KeyboardStateWillHide ? 0 : _height);
}
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.