Skip to content

fix(pager-view): keep Hard glass on every page while pinned during iOS 27 tab transitions - #238

Merged
huhuanming merged 3 commits into
mainfrom
fix/pager-home-glass-transition
Nov 10, 2026
Merged

huhuanming merged 3 commits into
mainfrom
fix/pager-home-glass-transition

Conversation

@huhuanming

@huhuanming huhuanming commented Nov 10, 2026 •

Copy link
Copy Markdown
Contributor

Problem

On iOS 26/27 Wallet Home, scroll Spot until the tab bar pins, then swipe horizontally. Spot shows the liquid-glass (Hard scroll edge) material behind the header and tab bar. The incoming page (e.g. History) shows a black band instead and only turns to glass after settling. Three further artifacts appeared while fixing it:

  • the Hard divider hairline at the tab bar's bottom edge flashes during the switch;
  • masked header content (e.g. a banner image) could show through and then vanish;
  • a half drag that snaps back to Spot leaves Spot without its glass.

Cause: the incoming page's list is often not mounted yet, laid out below the bars, or resting at its top. Its scroll view cannot render the edge effect behind the bars, and the page is masked above the boundary, so the bare background shows.

Change (local smooth Hard pager, RNCCollapsiblePagerViewComponentView.mm)

The stand-in is iOS 27 only. The separator-cover and settlement changes sit behind iOS 26 checks, but they only act while transition owners exist.

  • Stand-in edge: only while the sticky header is pinned. An incoming page that cannot cover the bars itself gets an empty, noninteractive UIScrollView at its origin, offset past its top, with owned transparent top/sticky element hosts. It draws only UIKit's Hard material (no snapshot). The page stays masked. Pages whose own list is scrolled and covers the bars keep their own temporary interactions. Nothing is added when not pinned.
  • Separator covers: kept for the whole transition, falling back to the shared overlay/sticky hosts. This removes the hairline flash.
  • Settlement: the settled owner is attached first, and the previous transition owner's interactions are removed on the next run loop, so the edge does not re-fade. When a drag returns to its source, the adopted interaction becomes the settled one again instead of being torn down with its duplicate. This fixes the lost glass after cancel.
  • SPEC: new section "iOS 27 pinned stand-in transition edges".

Verification

Consumer: OneKey iOS dev shell (iOS 27 simulator; native UI on the main thread only), with this file patched into node_modules/react-native-pager-view (6.7.0-35) and the shell rebuilt locally. Test wallet is watch-only BTC with Spot and History tabs.

  • I recorded two half-drag cancellations, then a full Spot → History → Spot swipe (226 frames) and checked it frame by frame:
    • black band: 0 frames (max band gap 3.6)
    • hairline flash: 0 frames, down from 64 before
    • header content leak: 0 frames
  • Spot keeps its glass after snapping back.
  • Vertical scrolling still works.
  • Tab tap while pinned still works.

Not verified:

🤖 Generated with Claude Code

…S 27 tab transitions

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…es not apply

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…geometry

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@huhuanming
huhuanming enabled auto-merge (squash) November 10, 2026 03:57
@sidmorizon

Copy link
Copy Markdown
Contributor

Devin Cloud review ↗

@huhuanming
huhuanming merged commit aef4a96 into main Nov 10, 2026
15 checks passed
@huhuanming
huhuanming deleted the fix/pager-home-glass-transition branch November 10, 2026 06:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants