[iOS 15] Header buttons stop responding after pushing and popping a screen over the pager
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Aptitud para principiantes
- 58/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- ios, react-native, swift, typescript
Línea de trabajo
Start with ios/PagerViewProvider.swift and inspect how setupView() creates the hosting controller; the proposed workaround belongs in a separate PagerViewIOS15NavigationBarCompat.swift file. Reproduce push then pop on an iOS 15 simulator and check whether the navigation bar covers the header buttons. Done means the buttons respond after returning, while iOS 16 and later retain the existing behavior.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Environment
- react-native-pager-view 9.0.4 in the repro app; the relevant code (
PagerViewProvider.setupView()) is unchanged in 9.0.9 - iOS 15.2 simulator (the reporter also reproduced it on a 15.1 device; newer iOS versions are not affected)
- React Native 0.84.1, New Architecture (Fabric)
@react-navigation/{native,stack,bottom-tabs,material-top-tabs}v7,react-native-screens4.27
Description
On iOS 15, after pushing a screen on top of a screen that contains a PagerView and then going back, the React Navigation header buttons (headerLeft / headerRight) stop responding. They never fire again for that screen.
The cause is not React Navigation. On iOS 15 UIHostingController installs SwiftUI's UIKitNavigationBarBridge, which calls -[UINavigationController setNavigationBarHidden:NO] on the enclosing navigation controller whenever the hosting view appears. react-native-screens creates an RNSContainerNavigationController with a hidden bar for the bottom-tab hasTwoStates container; the bridge re-shows an empty UINavigationBar on top of the screen — exactly over the React Navigation header — and that bar swallows every touch there.
Measured with lldb on an iOS 15.2 simulator after push → pop:
UINavigationBar in the window |
what hitTest at the header button returns |
|
|---|---|---|
| before | present at (0 47; 428 44), hidden = NO |
_UINavigationBarContentView (not the button) |
| after the proposed fix | none visible | the React Native button view |
Breakpoint trace of the cause (on -[UINavigationController setNavigationBarHidden:animated:], hidden = NO):
#0 -[UINavigationController setNavigationBarHidden:animated:]
#1 SwiftUI.UIKitNavigationBarBridge.hostingControllerWillAppear(animated:)
#2 SwiftUI._UIHostingView.viewControllerWillAppear(...)
#3 SwiftUI.UIHostingController._viewWillAppear(_:)
...
#16 -[RNSScreenContainerView attachScreen:atIndex:] ← react-native-screens re-attaches the screen on pop
Reproducible Demo
https://github.com/zewillze/react-native-pager-view-ios15-issue
- Run the repro on an iOS 15.x simulator/device.
- Tap a list row (pushes
Detailinside a@react-navigation/stack). - Go back.
- Tap the "Button" or "+" header button — nothing happens.
The screen structure matters: bottom tabs → stack (with a JS header) → material top tabs (the pager). The bottom-tab container provides the hidden UINavigationController, and the pager's UIHostingController is what triggers the bridge when it re-appears.
Optional check without touches, after step 3 — dump the window hierarchy:
po [[[UIApplication sharedApplication] keyWindow] performSelector:@selector(recursiveDescription)]
Before: a UINavigationBar at (0 47; 428 44) with hidden = NO. After the fix: none.
Proposed fix
Wrap the UIHostingController created in ios/PagerViewProvider.swift so it restores the enclosing navigation bar's hidden state around viewWillAppear.
To keep it easy to drop with iOS 15, the workaround lives in its own file (PagerViewIOS15NavigationBarCompat.swift) and every entry point returns early on iOS 16+ via if #available(iOS 16, *). Deleting that file and replacing the single call site with UIHostingController(...) is all that is needed once iOS 15 support is removed — the same isolation pattern used for the iOS 15 scrollEnabled fix (#1148).
The change is 2 files (+68/−1), preserves 9.0.9's ignoreSafeArea: true behaviour, and I have verified it on an iOS 15.2 simulator. I'll open a PR referencing this issue.
- Lenguaje dominante
- TypeScript
- Estrellas
- 3.4k
- Forks
- 488
- Merge medio
- 2 d 11 h
- PR fusionados (30 d)
- 26
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de callstack/react-native-pager-view
-
[iOS] Focused TextInput keeps focus and keyboard after switching pages (v9)Posiblemente ocupada @TaduJR la tomó hace 2 días. Abierto
Dificultad 4/5 1-2 días Aptitud para principiantes 69/100
callstack/react-native-pager-view#1192 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 3/5 1-2 días Aptitud para principiantes 73/100
callstack/react-native-pager-view#1191 ·
Los mantenedores suelen responder en 1 día
-
iOS: PagerScrollDelegate proxies to itself and overflows the stack when the weak originalDelegate diesPosiblemente ocupada @lvlrSajjad la tomó hace 38 días. Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 25/100
callstack/react-native-pager-view#1146 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
callstack/react-native-pager-view#1144 · 1 reacción ·
Los mantenedores suelen responder en 1 día
-
Dificultad 4/5 3-5 días Aptitud para principiantes 45/100
callstack/react-native-pager-view#1141 · 1 reacción ·
Los mantenedores suelen responder en 1 día
Todos los issues de callstack/react-native-pager-view
Issues similares
-
agent/scanner help wanted hive/claimed-by-scanner kind/bug stage/020-claimed
Dificultad 2/5 1-3 horas Aptitud para principiantes 90/100
hivecommons/rationguard#315 ·
Los mantenedores suelen responder en 1 día
-
agent-ready area: ui-sdk priority: p3 type: chore
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
schlessera/brain-kit#2534 ·
Los mantenedores suelen responder en 1 día
-
bug lane:gh-5
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
LLM-4-People/bridlewise-testing#122 ·
Los mantenedores suelen responder en 1 día
-
bug priority: P2
Dificultad 1/5 Menos de una hora Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día
-
enhancement priority:low ready-for-dev
Dificultad 2/5 1-3 horas Aptitud para principiantes 67/100
Los mantenedores suelen responder en 1 día