From f4b2722bf4259a6a7f0000b54c2d32712ab39117 Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Mon, 17 Apr 2023 08:54:09 -0700 Subject: [PATCH] feat(transitions): support zIndex on ios shared elements + support page props on android (#10261) --- apps/automated/package.json | 4 +- .../src/navigation/custom-transition.ios.ts | 22 +- .../src/navigation/transition-tests.ts | 17 +- apps/toolbox/package.json | 4 +- .../transitions/transition-example-detail.xml | 12 +- .../pages/transitions/transition-example.ts | 20 +- .../pages/transitions/transition-example.xml | 2 +- apps/ui/package.json | 4 +- package.json | 22 +- packages/core/index.d.ts | 3 +- packages/core/index.ts | 3 +- packages/core/package.json | 2 +- .../ui/builder/component-builder/index.ts | 2 +- packages/core/ui/builder/index.ts | 2 +- .../ui/builder/module-name-sanitizer.d.ts | 6 - .../core/ui/builder/module-name-sanitizer.ts | 24 - packages/core/ui/core/view-base/index.ts | 2 +- packages/core/ui/core/view/view-common.ts | 2 +- .../ui/frame/fragment.transitions.android.ts | 28 ++ packages/core/ui/frame/frame-common.ts | 9 +- packages/core/ui/frame/index.android.ts | 10 - packages/core/ui/frame/index.ios.ts | 6 +- packages/core/ui/index.ts | 4 +- packages/core/ui/styling/style-scope.ts | 2 +- .../core/ui/transition/fade-transition.ios.ts | 6 +- packages/core/ui/transition/index.d.ts | 16 +- packages/core/ui/transition/index.ios.ts | 5 +- .../ui/transition/modal-transition.ios.ts | 24 +- .../ui/transition/page-transition.android.ts | 92 +++- .../core/ui/transition/page-transition.ios.ts | 39 +- .../shared-transition-helper.ios.ts | 463 ++++++++++-------- .../core/ui/transition/shared-transition.ts | 120 ++++- .../ui/transition/slide-transition.ios.ts | 4 +- packages/core/utils/common.ts | 78 ++- packages/core/utils/native-helper.d.ts | 3 +- packages/core/utils/native-helper.ios.ts | 37 +- tools/assets/App_Resources/iOS/Podfile | 10 + tools/assets/App_Resources/iOS/build.xcconfig | 2 +- 38 files changed, 740 insertions(+), 371 deletions(-) delete mode 100644 packages/core/ui/builder/module-name-sanitizer.d.ts delete mode 100644 packages/core/ui/builder/module-name-sanitizer.ts create mode 100644 tools/assets/App_Resources/iOS/Podfile diff --git a/apps/automated/package.json b/apps/automated/package.json index 154e9cf95..0de8f239a 100644 --- a/apps/automated/package.json +++ b/apps/automated/package.json @@ -11,8 +11,8 @@ "nativescript-theme-core": "file:../../node_modules/nativescript-theme-core" }, "devDependencies": { - "@nativescript/android": "~8.4.0", - "@nativescript/ios": "~8.4.0", + "@nativescript/android": "~8.5.0", + "@nativescript/ios": "~8.5.0", "@nativescript/webpack": "file:../../dist/packages/nativescript-webpack.tgz", "typescript": "~4.9.5" }, diff --git a/apps/automated/src/navigation/custom-transition.ios.ts b/apps/automated/src/navigation/custom-transition.ios.ts index 2191afb1e..16a013889 100644 --- a/apps/automated/src/navigation/custom-transition.ios.ts +++ b/apps/automated/src/navigation/custom-transition.ios.ts @@ -1,4 +1,5 @@ -import { PageTransition, SharedTransition, SharedTransitionHelper, Transition } from '@nativescript/core'; +import { PageTransition, SharedTransition, SharedTransitionAnimationType, SharedTransitionHelper, Transition, Utils } from '@nativescript/core'; +import { CORE_ANIMATION_DEFAULTS } from '@nativescript/core/utils'; export class CustomTransition extends Transition { constructor(duration: number, curve: any) { @@ -72,9 +73,24 @@ class PageTransitionController extends NSObject implements UIViewControllerAnima transitionDuration(transitionContext: UIViewControllerContextTransitioning): number { const owner = this.owner.deref(); if (owner) { - return owner.getDuration(); + const state = SharedTransition.getState(owner.id); + switch (state?.activeType) { + case SharedTransitionAnimationType.present: + if (Utils.isNumber(state?.pageEnd?.duration)) { + return state.pageEnd?.duration / 1000; + } else { + return Utils.getDurationWithDampingFromSpring(state.pageEnd?.spring).duration; + } + + case SharedTransitionAnimationType.dismiss: + if (Utils.isNumber(state?.pageReturn?.duration)) { + return state.pageReturn?.duration / 1000; + } else { + return Utils.getDurationWithDampingFromSpring(state.pageReturn?.spring).duration; + } + } } - return 0.35; + return CORE_ANIMATION_DEFAULTS.duration; } animateTransition(transitionContext: UIViewControllerContextTransitioning): void { diff --git a/apps/automated/src/navigation/transition-tests.ts b/apps/automated/src/navigation/transition-tests.ts index 48fb9092d..e25d48247 100644 --- a/apps/automated/src/navigation/transition-tests.ts +++ b/apps/automated/src/navigation/transition-tests.ts @@ -52,8 +52,8 @@ export function test_Transitions() { // helper.navigateWithEntry({ create: mainPageFactory, clearHistory: true, animated: false }); } -export function test_SharedElementTransitions() { - helper.navigate(() => { +export function test_SharedElementTransitions(done) { + const mainPage = helper.navigate(() => { const page = new Page(); page.id = 'SharedelementTransitionsTestPage_MAIN'; page.style.backgroundColor = new Color(255, Math.round(Math.random() * 255), Math.round(Math.random() * 255), Math.round(Math.random() * 255)); @@ -76,12 +76,12 @@ export function test_SharedElementTransitions() { const navigationTransition = SharedTransition.custom(new CustomSharedElementPageTransition()); - var testId = `SharedElementTransition[${JSON.stringify(navigationTransition)}]`; + const testId = `SharedElementTransition[${JSON.stringify(navigationTransition)}]`; if (Trace.isEnabled()) { Trace.write(`Testing ${testId}`, Trace.categories.Test); } - var navigationEntry: NavigationEntry = { - create: function (): Page { + const navigationEntry: NavigationEntry = { + create(): Page { let page = new Page(); page.id = testId; page.style.backgroundColor = new Color(255, Math.round(Math.random() * 255), Math.round(Math.random() * 255), Math.round(Math.random() * 255)); @@ -99,11 +99,16 @@ export function test_SharedElementTransitions() { grid.addChild(sharedElement); page.content = grid; + + page.once('navigatedTo', () => { + done(); + }); + return page; }, animated: true, transition: navigationTransition, }; - helper.navigateWithEntry(navigationEntry); + mainPage.frame.navigate(navigationEntry); } diff --git a/apps/toolbox/package.json b/apps/toolbox/package.json index 636850fce..e3376a7d5 100644 --- a/apps/toolbox/package.json +++ b/apps/toolbox/package.json @@ -12,8 +12,8 @@ "@nativescript/imagepicker": "^1.0.6" }, "devDependencies": { - "@nativescript/android": "~8.4.0", - "@nativescript/ios": "~8.4.0", + "@nativescript/android": "~8.5.0", + "@nativescript/ios": "~8.5.0", "@nativescript/webpack": "file:../../dist/packages/nativescript-webpack.tgz", "typescript": "~4.9.5" } diff --git a/apps/toolbox/src/pages/transitions/transition-example-detail.xml b/apps/toolbox/src/pages/transitions/transition-example-detail.xml index 27d1397f3..5cea63e6d 100644 --- a/apps/toolbox/src/pages/transitions/transition-example-detail.xml +++ b/apps/toolbox/src/pages/transitions/transition-example-detail.xml @@ -6,17 +6,17 @@