[iOS] UIKit's scroll to a focused field can leave the pager between pages
I maintainer di solito rispondono entro 1 giorno
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 52/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Stack tecnologico
- ios, react-native, typescript
Direzione di ricerca
Start with the example app screen “Issue #1154 Page Change Focus Repro” and set styles.events to height: 44 to reproduce the timing. Trace the iOS pager handling of interrupted setPage calls alongside the focus and keyboard events, then run the described release-build sequence. Done means the pager settles on page 2, reports matching selection and scroll state, and the focused input and keyboard behave consistently.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Environment
react-native-pager-view:main- React Native 0.88.0, new architecture
- iPhone 18 Pro simulator, iOS 27.0, release build
Description
When a text field on another page takes focus, UIKit scrolls the pager's collection view to reveal it: scrollRectToVisible, twice and animated, once while the field becomes first responder and once from the keyboard notification. That scroll replaces the slide TabView is running and stops at the smallest offset that shows the field, and UIKit leaves the pager there.
The selection and the screen then disagree. onPageSelected reports page 2 while the pager rests nearest page 1, the log reads selected 2 and then state idle at 1, and the screen shows a sliver of page 0 beside page 1. Because the pager is not on a page boundary nothing reports a rest, so the input on the page being left keeps focus with the keyboard open.
Measuring the collection view's offset at scrollViewDidEndScrollingAnimation, against a 402 pt page:
| run | end offset |
|---|---|
| interrupt, with the arriving page's input focused in the same handler | 377 |
| interrupt, no focus | 804 |
| interrupt, keyboard already open from the previous page | 804 |
focus on arrival, single setPage, no interrupt |
402 |
Both ingredients are needed, and 377 is not arbitrary: it is the least the pager can scroll to bring that field on screen.
A per-instance override is viable, since PagerGestureObserver.installGestureArbitration already gives the pager's collection view its own runtime subclass. It is a behaviour change: an app that focuses an input on a page it is not showing would see nothing move, where today the pager is dragged between pages instead. An enclosing scroll view is unaffected, since in a pager inside a ScrollView inside a KeyboardAvoidingView the pager receives no reveal at all in 6 of 6 runs, and every one goes to the outer scroll view and the field's own editor.
Reproducible Demo
The example app has the screen already: Issue #1154 Page Change Focus Repro. Its event log reflows as it grows, which shifts the timing, so give the events box a fixed height first (height: 44 on styles.events) to see this reliably.
- Open the screen in a release build
- Tap onPress, so the arriving page's input is focused in the same handler as the command
- Tap the input on page 0, so the keyboard opens
- Tap Go 1 then 2, which sends
setPage(1)and thensetPage(2)fromonPageSelected - The pager stops between pages and stays there. The status line reads
Selected: 2, the log endsstate idle at 1, and the input on page 1 is still focused with the keyboard open
With that fixed height, two runs in six end this way on main. Without it the screen's own timing hides it most of the time, though the same case failed CI on #1224 with Selected: 1 | Focused: input 1 | Keyboard: visible | Scrolls: 9.
A fix is open as #1234, which declines the reveal from iOS 16 rather than repairing the landing after it.
- Lingua principale
- TypeScript
- Stelle
- 3.4k
- Fork
- 491
- Merge medio
- 2g 4h
- PR unite (30g)
- 51
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di callstack/react-native-pager-view
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 55/100
callstack/react-native-pager-view#1232 · 2 reazioni ·
I maintainer di solito rispondono entro 1 giorno
-
[iOS] setPage does not animate when the pager resizes with the keyboardForse già presa @TaduJR l’ha presa 4 giorni fa. Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 52/100
callstack/react-native-pager-view#1223 · 3 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Resolution: Needs Repro
Difficoltà 4/5 3-5 giorni Idoneità per principianti 32/100
callstack/react-native-pager-view#1222 · 2 commenti · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 58/100
callstack/react-native-pager-view#1189 ·
I maintainer di solito rispondono entro 1 giorno
-
iOS: PagerScrollDelegate proxies to itself and overflows the stack when the weak originalDelegate diesForse già presa @lvlrSajjad l’ha presa 56 giorni fa. Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 25/100
callstack/react-native-pager-view#1146 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di callstack/react-native-pager-view
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
earendil-works/pi-claude-code#36 ·
I maintainer di solito rispondono entro 6 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
I maintainer di solito rispondono entro 1 giorno
-
Resources: New work of jabodetabekForse già presa @rmt-svc l’ha presa oggi. Apertaresources
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
railmapgen/rmp-gallery#4167 ·
I maintainer di solito rispondono entro 2 giorni
-
documentation p1
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 83/100
microsoft/monaco-editor#5577 ·
I maintainer di solito rispondono entro 1 giorno