Skip to content

Let a ScrollView take the pull over its whole frame - #541

Merged
marcprux merged 1 commit into
skiptools:mainfrom
Ceylo:fix/scrollview-fills-scrolled-axis
Oct 23, 2026
Merged

marcprux merged 1 commit into
skiptools:mainfrom
Ceylo:fix/scrollview-fills-scrolled-axis

Conversation

@Ceylo

@Ceylo Ceylo commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

What

With .refreshable, pulling bellow the contents inside of a ScrollView does nothing. User has to pull specifically on the (potentially short) content. On iOS it works anywhere in the scrollview. This PR brings iOS' behavior to Android.

Before / after

A temporary Showcase page, ScrollView { Text("Refreshes: \(refreshCount)") }.refreshable { refreshCount += 1 }, pulled from below the text and held:

before after

After release: Refreshes: 0 before, Refreshes: 1 after, in Lite and Fuse.

Side effects

  • Dragging up from below the scrollview contents collapses a large title the same way dragging up from the actual contents would.
  • A DragGesture on the ScrollView, or a tap target behind it, no longer receives gestures that start there.

Skip Pull Request Checklist:

  • REQUIRED: I have signed the Contributor Agreement
  • REQUIRED: I have tested my change locally with swift test
  • OPTIONAL: I have tested my change on an iOS simulator or device. Not run: the change is Kotlin-only.
  • OPTIONAL: I have tested my change on an Android emulator or device
  • REQUIRED: I have checked whether this change requires a corresponding update in the Skip Fuse UI repository (link related PR if applicable). No API change, so no paired PR.
  • OPTIONAL: I have added an example of any UI changes to the Showcase sample app. Not added: the short page above was local only.

  • AI was used to generate or assist with generating this PR. Please specify below how you used AI to help you, and what steps you have taken to manually verify the changes.

Written with Claude Code: the fix, the test and this description. Every claim above comes from a run: swift test, the mutation run, and the Showcase in Lite and Fuse on an emulator before and after.

`.refreshable` on a ScrollView is `Modifier.pullRefresh`, a nested-scroll
connection that only sees the deltas a scrollable child dispatches. Only the
container Box filled; the scrolled Column stayed at its content size. With short
content, a pull was therefore accepted only over the content, where a
UIScrollView accepts it over its whole frame.

Fill the height before making the Column vertically scrollable, as RenderList
already does for its LazyColumn. Content taller than the viewport is
unaffected: verticalScroll still measures it with an unbounded height. A
horizontal ScrollView is left as it was, since the pull is vertical.
@cla-bot cla-bot Bot added the cla-signed label Oct 2, 2026
@Ceylo
Ceylo marked this pull request as ready for review October 2, 2026 17:37
@Ceylo

Ceylo commented Oct 22, 2026

Copy link
Copy Markdown
Contributor Author

@marcprux I simplified/rewrote the PR description. I hope it's more digest now 🙂

@marcprux

Copy link
Copy Markdown
Member

@marcprux I simplified/rewrote the PR description. I hope it's more digest now 🙂

Much more digest, thanks!

@marcprux
marcprux merged commit 4329ebc into skiptools:main Oct 23, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants