Skip to content

fix(ios): restore opaque scroll-edge appearance on iOS 26+ - #567

Draft
thiagobrez wants to merge 2 commits into
mainfrom
codex/issue-532-ios26-scroll-edge
Draft

fix(ios): restore opaque scroll-edge appearance on iOS 26+#567
thiagobrez wants to merge 2 commits into
mainfrom
codex/issue-532-ios26-scroll-edge

Conversation

@thiagobrez

@thiagobrez thiagobrez commented Sep 3, 2026

Copy link
Copy Markdown
Collaborator

PR Description

Fixes #532.

scrollEdgeAppearance="transparent" and "opaque" are intended to differ at the same content/scroll position: transparent keeps the floating Liquid Glass presentation with content visible beneath it, while opaque provides a solid theme-appropriate backing behind the complete tab bar. Default/unconfigured behavior remains UIKit's platform default, and an explicit tabBarStyle.backgroundColor replaces the system background for non-transparent appearances.

The JavaScript prop and UITabBarAppearance mapping were already correct. Runtime inspection showed the expected opaque and transparent appearance objects reaching UIKit, but iOS 26+ Liquid Glass does not render their background opacity as a backing surface. The smallest public-API correction sets UITabBar.backgroundColor on iOS 26+ only: transparent clears it, custom non-transparent colors are preserved, opaque/translucent={false} falls back to dynamic systemBackground, and default/unconfigured with no color remains clear.

This keeps the existing appearance object responsible for item styling, shadows, and older iOS behavior. It adds no delays, forced update loops, private APIs, global appearance proxies, overlays, masks, or new abstractions. macOS, tvOS, visionOS, pre-iOS-26 behavior, dynamic colors, custom colors, custom tab bars, and non-scroll-edge configuration are unchanged.

How to test?

Local validation completed:

  • yarn install --immutable
  • yarn lint (0 errors; 3 pre-existing warnings)
  • yarn typecheck
  • yarn build
  • RCT_NEW_ARCH_ENABLED=1 yarn build:ios
  • Core Jest test: src/__tests__/index.test.tsx (passed; repository's one existing todo)
  • Full ReactNativeBottomTabs example workspace build for the iOS simulator with code signing disabled
  • Native CocoaPods library scheme build for a generic iOS device with code signing disabled
  • git diff --check

All required GitHub Actions checks passed: lint, SwiftLint, library build, Android example build, and iOS example build. CodeQL analysis also passed for Actions, C/C++, and JavaScript/TypeScript.

Device verification used the repository example app and the installed agent-device 0.20.10 workflow (open → snapshot -i → interact/scroll → explicitly verify → close):

  • Device: iPhone 17 Pro simulator (CD1ADD09-474F-4618-899B-689243327BC6)
  • Runtime: iOS 27.0 (within the requested iOS 26-or-newer range; no iOS 26.x runtime is installed)
  • Xcode: 27.0 Beta 4 (27A5228h)
  • React Native: 0.81.4, New Architecture enabled
  • Metro: repository example bundle on port 8085

The final binary was verified at equivalent top/bottom article positions for default, transparent, opaque, and custom-color configurations. Additional checks covered minimize-on-scroll collapse/restore, hide/show, light/dark dynamic systemBackground, translucent={false}, and the custom-tab-bar example.

The mandatory adversarial gate ran exactly once with Claude Code Fable/High, followed by exactly one GPT-5.6-Sol/High remediation pass; Fable was not rerun. One valid custom-color finding was fixed, the lifecycle concern was disproven with device evidence, the exact-iOS-26 objection was disproven by the explicit iOS-26-or-newer requirement while documenting the runtime limitation, and committed media was retained per the task requirement. See the unchanged review JSON and finding dispositions.

Screenshots

Complete reproduction, diagnosis, environment, and evidence index: issue #532 evidence README.

Baseline (before fix):

Final verification:

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.

scrollEdgeAppearance seems to have no effect on iOS 26+

1 participant