Repository navigation
Description
Correction available for review — 2026-10-30
Implemented in #11590, which is open and ready for review. The correction separates the default navigation delegate from custom-transition callbacks, preserving native content Back for default navigation. The PR includes failing-before/passing-after regression tests, native iPadOS 18.6/26.0 validation, committed and cancelled gestures, custom/shared transition checks, rotation evidence and a real demonstration video.
The branch now includes current main at 49c79f4 (PR head c5f591a). Its current unit-test step, Android native job, dependency review and preview publication passed. The iOS job is stuck in Start iOS Simulator, before the native tests; this is not a native test failure. Maintainer assistance is needed to restart that run. The correction has not been merged or published in a stable Core release.
The reproduction and control results below describe the original published Core 9.1.3 baseline.
Issue Description
On an iPadOS 26.0 simulator, a plain NativeScript Core 9.1.3 Frame inset 280 points from the leading window edge does not begin Back navigation from a native content-edge drag, even with default transitions. The same input pops a plain UIKit child UINavigationController at the same inset. Full-width Core edge Back and inset native header Back work.
This was isolated from a drawer investigation: the Core reproduction imports no Vue or router code and uses no package patch, replacement delegate, synthetic pop or custom gesture. The report concerns default navigation in inset content, not the separate inherited CSS-direction crash in #11587.
Expected: default Frame navigation on iPadOS 26 should permit UIKit's native content-pop gesture when eligible, or document why that configuration is unsupported. Actual: the inset drag leaves Detail visible; the header Back still returns to Root.
Reproduction
Reproduction commit: 9c9b86b.
From the reproduction checkout, first generate demo/App_Resources following the demo setup. Then install the demo's locked dependencies with npm ci in demo, then build there with ns build ios --for-device false --env.backedgeTest. On a dedicated iPad simulator in landscape, tap Push detail and drag right from x=282 through empty lower content. The app does not pop; the header Back works. Launch with full-width to compare x=0. The README supplies the automated XCTest command and a matching UIKit app. The runner reinstalls only the two fixture apps on the selected simulator.
Isolation results
Twelve observations per OS passed their explicit baseline assertions on iPadOS 18.6 and 26.0. These are baseline observations, including unavailable gestures, not a claim that every gesture works.
| Control | 18.6 full width | 18.6 inset | 26.0 full width | 26.0 inset |
|---|---|---|---|---|
| UIKit, no delegate | Pop | No pop | Pop | Pop |
| UIKit, didShow only | Pop | No pop | Pop | Pop |
| UIKit, animation callback returns nil | No pop | No pop | No pop | No pop |
| UIKit, interaction callback returns nil | Pop | No pop | Pop | Pop |
| UIKit, both callbacks | No pop | No pop | No pop | No pop |
| Published Core Frame | Pop | No pop | Pop | No pop |
Adding only the optional custom animation callback to the UIKit control reproduces the missing gesture, despite returning nil. Adding only the interaction callback does not. This isolated Core's always-present custom animation delegate callback; the implementation and validation are recorded in #11590.
Core 9.1.3 and current main (6bb01ea) use a single UINavigationControllerDelegateImpl exposing both callbacks even for default navigation. Page viewDidAppear assigns the navigation controller as the screen-edge recognizer delegate, but only changes enabled on the iOS 26 content recognizer. The controls do not bypass those policies. Any change should preserve custom/shared transitions, cancellation and lifecycle bookkeeping; simply replacing a gesture delegate is not proposed here.
The iPadOS 18.6 inset result is recorded as a platform control, not claimed as a Core regression: UIKit's older recognizer is screen-edge based. Physical iPad confirmation and newer OS versions remain untested.
Environment
- macOS 26.6.2 (25G83), Apple silicon arm64
- Xcode 27.0 (27A266a)
- Node 20.19.4, NativeScript CLI 9.1.2
- @nativescript/core 9.1.3, @nativescript/ios 9.1.0
- iPad Pro 11-inch M4 simulators: iPadOS 18.6 and 26.0
- Default animated Frame navigation; no custom transition or unpublished Core patch
Related investigation: rafaelaugustos/vue-router-ns#168. Existing GitHub issues were searched for content-pop/swipe reports; no matching open report was found. This is a reproducible runtime behavior report. The implementation and current validation status are linked at the top of this issue.
Video
ipad-inset-back-controls-168.mp4
Actual iPadOS 26 simulator, three chronological excerpts: Core inset drag leaves Detail until header Back; UIKit with didShow only pops interactively; UIKit exposing the nil-returning animation callback leaves Detail until header Back. This records the baseline limitation, not a Core fix.
Activity