@apexnative/navigation 1.0.0-alpha.1 → 1.0.0-alpha.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ApexNavigation.podspec +2 -1
- package/CHANGELOG.md +132 -0
- package/README.md +147 -51
- package/android/CLAUDE.md +78 -25
- package/android/CORE.md +49 -25
- package/android/RECIPES.md +13 -6
- package/android/consumer-rules.pro +6 -0
- package/android/src/main/java/dev/apexnative/navigation/NavigationActivity.kt +85 -10
- package/android/src/main/java/dev/apexnative/navigation/NavigationApplication.kt +34 -13
- package/android/src/main/java/dev/apexnative/navigation/layout/LayoutChecks.kt +5 -1
- package/android/src/main/java/dev/apexnative/navigation/layout/LayoutNode.kt +6 -2
- package/android/src/main/java/dev/apexnative/navigation/nativescreen/NativeScreenContext.kt +2 -2
- package/android/src/main/java/dev/apexnative/navigation/options/AnimationsOptions.kt +2 -2
- package/android/src/main/java/dev/apexnative/navigation/options/BottomTabOptions.kt +1 -1
- package/android/src/main/java/dev/apexnative/navigation/options/BottomTabsOptions.kt +13 -8
- package/android/src/main/java/dev/apexnative/navigation/options/ButtonMenuOptions.kt +2 -2
- package/android/src/main/java/dev/apexnative/navigation/options/ButtonOptions.kt +3 -3
- package/android/src/main/java/dev/apexnative/navigation/options/HardwareBackButtonOptions.kt +9 -1
- package/android/src/main/java/dev/apexnative/navigation/options/LargeTitleOptions.kt +1 -1
- package/android/src/main/java/dev/apexnative/navigation/options/LayoutAnimation.kt +1 -1
- package/android/src/main/java/dev/apexnative/navigation/options/OptionKey.kt +18 -0
- package/android/src/main/java/dev/apexnative/navigation/options/OptionPaths.kt +91 -0
- package/android/src/main/java/dev/apexnative/navigation/options/OptionsCache.kt +8 -4
- package/android/src/main/java/dev/apexnative/navigation/options/SheetOptions.kt +7 -4
- package/android/src/main/java/dev/apexnative/navigation/options/SideMenuOptions.kt +6 -1
- package/android/src/main/java/dev/apexnative/navigation/options/StackAnimationOptions.kt +40 -2
- package/android/src/main/java/dev/apexnative/navigation/options/StatusBarOptions.kt +7 -3
- package/android/src/main/java/dev/apexnative/navigation/options/TitleOptions.kt +2 -2
- package/android/src/main/java/dev/apexnative/navigation/options/TopBarAppearanceOptions.kt +1 -1
- package/android/src/main/java/dev/apexnative/navigation/options/TopBarOptions.kt +16 -7
- package/android/src/main/java/dev/apexnative/navigation/options/UserChoices.kt +159 -0
- package/android/src/main/java/dev/apexnative/navigation/react/CommandAnswer.kt +29 -36
- package/android/src/main/java/dev/apexnative/navigation/react/CommandContract.kt +59 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ContentHeights.kt +95 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ContentMounts.kt +66 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ErrorTexts.kt +75 -60
- package/android/src/main/java/dev/apexnative/navigation/react/Hinge.kt +35 -23
- package/android/src/main/java/dev/apexnative/navigation/react/NavigationTurboModule.kt +12 -7
- package/android/src/main/java/dev/apexnative/navigation/react/OptionsCommands.kt +42 -4
- package/android/src/main/java/dev/apexnative/navigation/react/PendingCalls.kt +48 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ReactView.kt +54 -20
- package/android/src/main/java/dev/apexnative/navigation/react/ReloadCoordinator.kt +7 -6
- package/android/src/main/java/dev/apexnative/navigation/react/ScreenEnvironment.kt +177 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ScreenRegions.kt +19 -50
- package/android/src/main/java/dev/apexnative/navigation/react/ScrollEvents.kt +49 -128
- package/android/src/main/java/dev/apexnative/navigation/react/events/AppearanceDispatcher.kt +50 -81
- package/android/src/main/java/dev/apexnative/navigation/react/events/EventContract.kt +226 -0
- package/android/src/main/java/dev/apexnative/navigation/react/events/EventEmitter.kt +135 -94
- package/android/src/main/java/dev/apexnative/navigation/react/events/NavigationState.kt +154 -0
- package/android/src/main/java/dev/apexnative/navigation/react/events/ScreenAppearance.kt +0 -6
- package/android/src/main/java/dev/apexnative/navigation/safearea/SafeAreaView.kt +12 -10
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotContainers.kt +10 -7
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotScreenView.kt +39 -19
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotView.kt +16 -4
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotViews.kt +40 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/ImageKey.kt +66 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/ImageLoader.kt +7 -89
- package/android/src/main/java/dev/apexnative/navigation/utils/ImageRequests.kt +76 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/MaterialTheme.kt +5 -6
- package/android/src/main/java/dev/apexnative/navigation/utils/OptionImages.kt +262 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/SystemAnimations.kt +36 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/UiUtils.kt +3 -3
- package/android/src/main/java/dev/apexnative/navigation/utils/ViewController.kt +3 -1
- package/android/src/main/java/dev/apexnative/navigation/utils/ViewExtensions.kt +0 -13
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementController.kt +10 -7
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementDefinition.kt +9 -3
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementPlanner.kt +20 -15
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/SecondaryScreenPresenter.kt +13 -5
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/AppliedTabCalls.kt +49 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsCollapseBehavior.kt +5 -3
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsController.kt +108 -34
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsPresenter.kt +25 -24
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/CustomTabRowGeometry.kt +22 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabItems.kt +3 -3
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabsRoom.kt +0 -5
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentPresenter.kt +28 -7
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentViewController.kt +12 -9
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ContentReadiness.kt +2 -2
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/RenderWait.kt +27 -7
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenFrame.kt +1 -1
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenReadiness.kt +103 -56
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenSafeArea.kt +29 -11
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/externalcomponent/ExternalComponentViewController.kt +2 -6
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalAnimations.kt +22 -24
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalCoordinator.kt +109 -21
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalRecord.kt +21 -6
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalSheet.kt +476 -73
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalViews.kt +57 -25
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/SheetBack.kt +42 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/SheetStops.kt +83 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/BackCallbackCheck.kt +50 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/BackCallbackState.kt +49 -14
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/Navigator.kt +71 -12
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/RootCoordinator.kt +37 -11
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/overlay/OverlayCoordinator.kt +10 -8
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/Capabilities.kt +11 -4
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ContainerBackground.kt +3 -3
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ParentController.kt +6 -6
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuController.kt +42 -9
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuMotion.kt +19 -8
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuPresenter.kt +16 -7
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuRules.kt +43 -4
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitPanes.kt +23 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitViewController.kt +77 -17
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/BackPreview.kt +315 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/PreparedFrame.kt +3 -3
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackCommands.kt +30 -20
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackController.kt +216 -18
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackDisplay.kt +26 -1
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackQueue.kt +149 -41
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackTransitions.kt +26 -8
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackViews.kt +115 -6
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabMotion.kt +142 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabPresenter.kt +222 -48
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/ScreenSearch.kt +3 -5
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/StackSearchPresenter.kt +30 -34
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/BarComponents.kt +5 -51
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/BarRowTransition.kt +3 -2
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/ButtonPlaces.kt +11 -5
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/MenuChecks.kt +13 -56
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarPresenter.kt +219 -54
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarVisibility.kt +9 -2
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ScrollEventListener.kt +6 -9
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ViewController.kt +75 -21
- package/android/src/main/java/dev/apexnative/navigation/views/animations/AnimationLayer.kt +73 -0
- package/android/src/main/java/dev/apexnative/navigation/views/animations/Curves.kt +29 -11
- package/android/src/main/java/dev/apexnative/navigation/views/animations/ValueInterpolation.kt +14 -0
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabs.kt +9 -7
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabsLayout.kt +61 -2
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomBottomTabItemView.kt +0 -5
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomTabRow.kt +72 -10
- package/android/src/main/java/dev/apexnative/navigation/views/element/ElementStep.kt +31 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/ElementTransitions.kt +143 -135
- package/android/src/main/java/dev/apexnative/navigation/views/element/TargetsWait.kt +13 -5
- package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionLayer.kt +37 -112
- package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionTargets.kt +9 -6
- package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionViews.kt +100 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ElementPictures.kt +112 -4
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/FlightGeometry.kt +346 -36
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ImageMorph.kt +199 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/SharedAnimatorFactory.kt +56 -41
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/TextMorph.kt +176 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ViewMorph.kt +108 -0
- package/android/src/main/java/dev/apexnative/navigation/views/sidemenu/SideMenuView.kt +12 -3
- package/android/src/main/java/dev/apexnative/navigation/views/stack/ScreenEdge.kt +45 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/StackLayout.kt +140 -1
- package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/Fab.kt +14 -10
- package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabCopy.kt +85 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabMenu.kt +13 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TitleBar.kt +5 -17
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TopBar.kt +73 -34
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarButtonComponentCell.kt +6 -6
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarButtonView.kt +113 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarMenu.kt +219 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonBar.kt +125 -178
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonMenus.kt +34 -64
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonRow.kt +216 -0
- package/android/src/main/jni/ANNContentHeights.cpp +82 -0
- package/android/src/main/res/drawable/apex_navigation_ic_arrow_right.xml +14 -0
- package/android/src/main/res/layout/apex_navigation_menu_header.xml +19 -0
- package/android/src/main/res/layout/apex_navigation_menu_item.xml +68 -0
- package/android/src/main/res/values/styles.xml +1 -1
- package/android/src/main/res/values-night/styles.xml +1 -1
- package/cli/app.js +1 -1
- package/cli/doctor/checks/app.js +77 -14
- package/cli/doctor/checks/splash.js +4 -22
- package/cli/migrate/native.js +18 -0
- package/cli/project.js +10 -2
- package/cli/setup/index.js +18 -0
- package/cli/setup/source.js +2 -1
- package/cli/setup/steps/appDelegate.js +66 -11
- package/cli/setup/steps/mainApplication.js +134 -19
- package/cli/setup/steps/metro.js +46 -0
- package/cli/setup/steps/sceneDelegate.js +108 -0
- package/cli/splash/index.js +3 -1
- package/docs-md/architecture/native-screens.md +4 -0
- package/docs-md/architecture/theme-and-context.md +131 -12
- package/docs-md/architecture/transitions.md +58 -12
- package/docs-md/containers/arrangement.md +17 -1
- package/docs-md/containers/modals.md +8 -4
- package/docs-md/containers/overlays.md +3 -1
- package/docs-md/containers/side-menu.md +19 -2
- package/docs-md/containers/tabs.md +5 -1
- package/docs-md/flows/bottom-sheets.md +4 -2
- package/docs-md/flows/forms-in-a-modal.md +1 -1
- package/docs-md/fundamentals/screens-and-props.md +9 -1
- package/docs-md/fundamentals/starting-the-app.md +1 -1
- package/docs-md/guides/cli.md +4 -3
- package/docs-md/guides/deep-links.md +15 -33
- package/docs-md/help/glossary.md +4 -4
- package/docs-md/help/troubleshooting.md +44 -6
- package/docs-md/index.json +61 -1
- package/docs-md/migration/from-expo-router.md +1 -1
- package/docs-md/migration/from-react-native-navigation.md +9 -3
- package/docs-md/migration/from-react-navigation.md +2 -2
- package/docs-md/screen-ui/back-and-gestures.md +46 -2
- package/docs-md/screen-ui/bar-buttons.md +5 -5
- package/docs-md/screen-ui/search.md +1 -1
- package/docs-md/screen-ui/system-ui.md +17 -12
- package/docs-md/screen-ui/toolbar-and-fab.md +4 -2
- package/docs-md/screen-ui/top-bar.md +8 -4
- package/docs-md/start/installation.md +21 -3
- package/ios/Animations/ANNFrameDriver.h +55 -15
- package/ios/Animations/ANNFrameDriver.mm +216 -60
- package/ios/Animations/ANNTransitionAnimator.h +26 -5
- package/ios/Animations/ANNTransitionAnimator.mm +61 -13
- package/ios/Animations/ANNTransitionPlan.h +2 -2
- package/ios/Animations/ANNTransitionPlan.mm +10 -0
- package/ios/Animations/ANNTransitionWait.mm +6 -7
- package/ios/Animations/Elements/ANNElementFinder.h +57 -0
- package/ios/Animations/Elements/ANNElementFinder.mm +174 -2
- package/ios/Animations/Elements/ANNElementTransition.h +10 -8
- package/ios/Animations/Elements/ANNElementTransition.mm +19 -21
- package/ios/Animations/Elements/ANNSharedElementFlight.h +16 -11
- package/ios/Animations/Elements/ANNSharedElementFlight.mm +308 -69
- package/ios/Animations/Interpolators/ANNInterpolate.h +2 -30
- package/ios/Animations/Interpolators/ANNTransformParts.h +48 -0
- package/ios/Animations/Interpolators/ANNTransformParts.mm +507 -0
- package/ios/Animations/Interpolators/ANNViewTracks.h +9 -6
- package/ios/Animations/Interpolators/ANNViewTracks.mm +100 -30
- package/ios/CLAUDE.md +60 -24
- package/ios/CORE.md +44 -34
- package/ios/Contract/ANNCommandAnswer.h +13 -5
- package/ios/Contract/ANNCommandAnswer.mm +40 -32
- package/ios/Contract/ANNCommandContract.h +15 -0
- package/ios/Contract/ANNCommandContract.mm +78 -0
- package/ios/Contract/ANNCommandRunner.h +10 -9
- package/ios/Contract/ANNCommandRunner.mm +22 -28
- package/ios/Contract/ANNErrorTexts.h +6 -2
- package/ios/Contract/ANNErrorTexts.mm +18 -10
- package/ios/Contract/ANNLayoutNode.h +3 -3
- package/ios/Contract/ANNLayoutReader.h +3 -3
- package/ios/Core/ANNAppDelegate.mm +0 -2
- package/ios/Core/ANNAppearanceDispatcher.h +5 -4
- package/ios/Core/ANNAppearanceDispatcher.mm +12 -1
- package/ios/Core/ANNDeepLinkQueue.h +22 -2
- package/ios/Core/ANNDeepLinkQueue.mm +121 -14
- package/ios/Core/ANNErrorHandler.h +9 -4
- package/ios/Core/ANNErrorHandler.mm +20 -2
- package/ios/Core/ANNEventContract.h +246 -0
- package/ios/Core/ANNEventContract.mm +225 -0
- package/ios/Core/ANNEventEmitter.h +6 -2
- package/ios/Core/ANNEventEmitter.mm +117 -80
- package/ios/Core/ANNHinge.h +6 -0
- package/ios/Core/ANNHinge.mm +15 -4
- package/ios/Core/ANNJavaScriptCalls.h +33 -0
- package/ios/Core/ANNJavaScriptCalls.mm +52 -0
- package/ios/Core/ANNLayoutProtocol.h +5 -5
- package/ios/Core/ANNNavigationState.h +7 -5
- package/ios/Core/ANNNavigationState.mm +8 -7
- package/ios/Core/ANNNodeHelper.h +32 -12
- package/ios/Core/ANNNodeHelper.mm +100 -3
- package/ios/Core/ANNParking.h +5 -4
- package/ios/Core/ANNReloadCoordinator.mm +5 -12
- package/ios/Core/ANNRenderWait.h +20 -6
- package/ios/Core/ANNRenderWait.mm +143 -56
- package/ios/Core/ANNSceneDelegate.mm +25 -15
- package/ios/Core/ANNSystemUI.h +3 -2
- package/ios/Core/ANNSystemUI.mm +7 -0
- package/ios/Core/ANNUtils.h +7 -0
- package/ios/Core/ANNUtils.mm +10 -0
- package/ios/Core/ApexNavigation+Internal.h +1 -1
- package/ios/Core/ApexNavigation.mm +7 -6
- package/ios/Core/UIViewController+LayoutProtocol.h +9 -2
- package/ios/Core/UIViewController+LayoutProtocol.mm +8 -0
- package/ios/Layouts/Arrangement/ANNArrangementState.h +2 -17
- package/ios/Layouts/Arrangement/ANNArrangementState.mm +0 -38
- package/ios/Layouts/Arrangement/ANNArrangementViewController.mm +195 -21
- package/ios/Layouts/Modal/ANNModalCoordinator.h +1 -1
- package/ios/Layouts/Modal/ANNModalCoordinator.mm +57 -16
- package/ios/Layouts/Modal/ANNModalPresentation.h +8 -5
- package/ios/Layouts/Modal/ANNModalPresentation.mm +12 -12
- package/ios/Layouts/Modal/ANNSheetPresenter.mm +83 -1
- package/ios/Layouts/Overlay/ANNOverlayCoordinator.mm +2 -8
- package/ios/Layouts/Root/ANNRootCoordinator.mm +58 -19
- package/ios/Layouts/Root/ANNSplashViewController.h +5 -3
- package/ios/Layouts/Root/ANNSplashViewController.mm +147 -0
- package/ios/Layouts/Screen/ANNComponentPresenter.h +11 -3
- package/ios/Layouts/Screen/ANNComponentPresenter.mm +34 -6
- package/ios/Layouts/Screen/ANNComponentViewController.h +15 -13
- package/ios/Layouts/Screen/ANNComponentViewController.mm +130 -75
- package/ios/Layouts/Screen/ANNNativeScreenContext.mm +7 -5
- package/ios/Layouts/Screen/ANNPreviewInteraction.h +7 -4
- package/ios/Layouts/Screen/ANNPreviewInteraction.mm +72 -10
- package/ios/Layouts/Screen/ANNScreenEnvironment.h +63 -0
- package/ios/Layouts/Screen/ANNScreenEnvironment.mm +181 -0
- package/ios/Layouts/Screen/ANNScreenPlace.h +53 -0
- package/ios/Layouts/Screen/ANNScreenPlace.mm +205 -0
- package/ios/Layouts/Screen/ANNScreenRegions.h +3 -18
- package/ios/Layouts/Screen/ANNScreenRegions.mm +9 -44
- package/ios/Layouts/Screen/ANNScreenSafeArea.h +4 -9
- package/ios/Layouts/Screen/ANNScreenSafeArea.mm +14 -16
- package/ios/Layouts/Screen/ANNScreenSettling.h +34 -0
- package/ios/Layouts/Screen/ANNScreenSettling.mm +171 -0
- package/ios/Layouts/SideMenu/ANNSideMenuTypes.h +8 -0
- package/ios/Layouts/SideMenu/ANNSideMenuViewController.mm +83 -14
- package/ios/Layouts/SplitView/ANNSplitViewCommands.h +3 -2
- package/ios/Layouts/SplitView/ANNSplitViewCommands.mm +105 -39
- package/ios/Layouts/SplitView/ANNSplitViewController.mm +7 -8
- package/ios/Layouts/Stack/ANNPreviewPush.h +7 -6
- package/ios/Layouts/Stack/ANNPreviewPush.mm +142 -27
- package/ios/Layouts/Stack/ANNStackAnimatingDelegate.h +11 -2
- package/ios/Layouts/Stack/ANNStackAnimatingDelegate.mm +14 -7
- package/ios/Layouts/Stack/ANNStackCommands.mm +1 -0
- package/ios/Layouts/Stack/ANNStackController.h +8 -0
- package/ios/Layouts/Stack/ANNStackController.mm +184 -16
- package/ios/Layouts/Stack/ANNStackQueue.h +5 -2
- package/ios/Layouts/Stack/ANNStackQueue.mm +56 -43
- package/ios/Layouts/Stack/ANNSwipePopInteraction.h +26 -0
- package/ios/Layouts/Stack/ANNSwipePopInteraction.mm +185 -0
- package/ios/Layouts/Stack/InteractivePopGestureDelegate.mm +28 -4
- package/ios/Layouts/Stack/UINavigationController+ANNCommands.h +4 -2
- package/ios/Layouts/Stack/UINavigationController+ANNCommands.mm +2 -3
- package/ios/Layouts/Tabs/ANNBottomTabItemBuilder.h +4 -0
- package/ios/Layouts/Tabs/ANNBottomTabItemBuilder.mm +11 -0
- package/ios/Layouts/Tabs/ANNBottomTabsAccessoryView.h +12 -1
- package/ios/Layouts/Tabs/ANNBottomTabsAccessoryView.mm +23 -0
- package/ios/Layouts/Tabs/ANNBottomTabsController.h +3 -0
- package/ios/Layouts/Tabs/ANNBottomTabsController.mm +237 -57
- package/ios/Layouts/Tabs/ANNBottomTabsCustomRow.mm +8 -3
- package/ios/Layouts/Tabs/ANNBottomTabsPresenter.h +6 -2
- package/ios/Layouts/Tabs/ANNBottomTabsPresenter.mm +232 -43
- package/ios/Layouts/Tabs/ANNTabsDesign.h +6 -5
- package/ios/Layouts/Tabs/ANNTabsDesign.mm +9 -1
- package/ios/Layouts/Tabs/UITabBar+utils.h +5 -5
- package/ios/Layouts/Tabs/UITabBar+utils.mm +32 -13
- package/ios/Options/ANNAnimationOptions.h +2 -1
- package/ios/Options/ANNAnimationOptions.mm +1 -1
- package/ios/Options/ANNBottomTabsOptions.h +2 -0
- package/ios/Options/ANNBottomTabsOptions.mm +1 -0
- package/ios/Options/ANNOptions.h +25 -0
- package/ios/Options/ANNOptions.mm +157 -1
- package/ios/Options/ANNOptionsCache.h +7 -6
- package/ios/Options/ANNOptionsReader.mm +108 -0
- package/ios/Options/ANNSearchBarOptions.h +4 -3
- package/ios/Options/ANNSheetOptions.h +4 -1
- package/ios/Options/ANNSideMenuOptions.h +2 -0
- package/ios/Options/ANNSideMenuOptions.mm +2 -0
- package/ios/Options/ANNStackPopAnimationOptions.h +13 -0
- package/ios/Options/ANNStackPopAnimationOptions.mm +11 -0
- package/ios/Options/ANNUserChoice.h +57 -0
- package/ios/Options/ANNUserChoice.mm +44 -0
- package/ios/Options/Params/ANNImageSource.h +61 -0
- package/ios/Options/Params/ANNImageSource.mm +101 -0
- package/ios/Options/Params/ANNOptionImages.h +37 -0
- package/ios/Options/Params/ANNOptionImages.mm +284 -0
- package/ios/Options/Params/ANNParam.h +15 -0
- package/ios/Options/Params/ANNParam.mm +61 -0
- package/ios/Options/Params/Color.h +3 -0
- package/ios/Options/Params/Color.mm +21 -0
- package/ios/Options/Params/ColorParser.h +4 -3
- package/ios/Options/Params/ColorParser.mm +22 -4
- package/ios/Options/Params/Image.h +15 -2
- package/ios/Options/Params/Image.mm +35 -2
- package/ios/Options/Params/ImageParser.h +5 -5
- package/ios/Options/Params/ImageParser.mm +28 -46
- package/ios/Public/ApexNavigation/ANNSceneDelegate.h +3 -0
- package/ios/Public/ApexNavigation/ApexNavigation.h +1 -1
- package/ios/RECIPES.md +13 -6
- package/ios/React/ANNReactView.mm +6 -25
- package/ios/React/ANNSafeAreaViewComponentView.mm +28 -17
- package/ios/React/ANNSurfaceHostingView.h +14 -0
- package/ios/React/ANNSurfaceHostingView.mm +144 -1
- package/ios/React/Slots/ANNSlotComponentView.mm +24 -17
- package/ios/React/Slots/ANNSlotContainers.h +14 -6
- package/ios/React/Slots/ANNSlotContainers.mm +75 -2
- package/ios/React/Slots/ANNSlotHost.mm +1 -3
- package/ios/React/Slots/ANNSlotScreenView.mm +8 -2
- package/ios/TopBar/ANNBackButtonPresenter.mm +6 -5
- package/ios/TopBar/ANNBarAppearance.h +2 -1
- package/ios/TopBar/ANNBarAppearance.mm +111 -30
- package/ios/TopBar/ANNBarBackgroundComponent.mm +16 -0
- package/ios/TopBar/ANNBarButtonComponentView.h +4 -4
- package/ios/TopBar/ANNBarButtonComponentView.mm +1 -1
- package/ios/TopBar/ANNBarButtons.h +14 -8
- package/ios/TopBar/ANNBarButtons.mm +397 -80
- package/ios/TopBar/ANNIconButtonImage.h +1 -0
- package/ios/TopBar/ANNIconButtonImage.mm +34 -1
- package/ios/TopBar/ANNLargeTitlePresenter.h +13 -0
- package/ios/TopBar/ANNLargeTitlePresenter.mm +50 -7
- package/ios/TopBar/ANNMainList.h +3 -0
- package/ios/TopBar/ANNMainList.mm +4 -0
- package/ios/TopBar/ANNScrollEdgeEffects.h +22 -6
- package/ios/TopBar/ANNScrollEdgeEffects.mm +123 -16
- package/ios/TopBar/ANNSearchPresenter.mm +172 -21
- package/ios/TopBar/ANNSearchResultsViewController.mm +29 -6
- package/ios/TopBar/ANNTopBarPresenter.h +8 -2
- package/ios/TopBar/ANNTopBarPresenter.mm +155 -33
- package/ios/TurboModules/ANNTurboEventEmitter.mm +4 -35
- package/ios/TurboModules/ANNTurboModule.mm +104 -33
- package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotState.cpp +20 -0
- package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotState.h +5 -14
- package/lib/module/ARCHITECTURE.md +40 -27
- package/lib/module/adapters/NativeANNTurboModule.js.map +1 -1
- package/lib/module/api/app/AppRegistry.js +14 -2
- package/lib/module/api/app/AppRegistry.js.map +1 -1
- package/lib/module/api/app/createNavigation.js +190 -66
- package/lib/module/api/app/createNavigation.js.map +1 -1
- package/lib/module/api/commands/commands.js +54 -6
- package/lib/module/api/commands/commands.js.map +1 -1
- package/lib/module/api/events/navigationEvents.js +6 -2
- package/lib/module/api/events/navigationEvents.js.map +1 -1
- package/lib/module/api/hooks/useNavigation.js +8 -3
- package/lib/module/api/hooks/useNavigation.js.map +1 -1
- package/lib/module/api/hooks/useSafeAreaInsets.js +4 -3
- package/lib/module/api/hooks/useSafeAreaInsets.js.map +1 -1
- package/lib/module/api/linking/dispatchedLinks.js +23 -0
- package/lib/module/api/linking/dispatchedLinks.js.map +1 -0
- package/lib/module/api/linking/linking.js +11 -0
- package/lib/module/api/linking/linking.js.map +1 -1
- package/lib/module/api/navigation.js.map +1 -1
- package/lib/module/api/options/OptionsChain.js +2 -2
- package/lib/module/api/screens/arrangement.js +5 -2
- package/lib/module/api/screens/arrangement.js.map +1 -1
- package/lib/module/api/screens/defineScreen.js +45 -3
- package/lib/module/api/screens/defineScreen.js.map +1 -1
- package/lib/module/api/screens/nativeScreens.js +31 -6
- package/lib/module/api/screens/nativeScreens.js.map +1 -1
- package/lib/module/api/screens/registerScreens.js +193 -35
- package/lib/module/api/screens/registerScreens.js.map +1 -1
- package/lib/module/api/theme/theme.js +5 -0
- package/lib/module/api/theme/theme.js.map +1 -1
- package/lib/module/engine/commands.js +51 -9
- package/lib/module/engine/commands.js.map +1 -1
- package/lib/module/engine/layout.js +20 -11
- package/lib/module/engine/layout.js.map +1 -1
- package/lib/module/engine/nativeScreens.js +9 -0
- package/lib/module/engine/nativeScreens.js.map +1 -1
- package/lib/module/engine/options.js +49 -15
- package/lib/module/engine/options.js.map +1 -1
- package/lib/module/engine/optionsChange.js +102 -0
- package/lib/module/engine/optionsChange.js.map +1 -0
- package/lib/module/engine/places.js +52 -7
- package/lib/module/engine/places.js.map +1 -1
- package/lib/module/engine/props.js +30 -1
- package/lib/module/engine/props.js.map +1 -1
- package/lib/module/engine/refresh.js +85 -0
- package/lib/module/engine/refresh.js.map +1 -0
- package/lib/module/engine/rememberedOptions.js +61 -1
- package/lib/module/engine/rememberedOptions.js.map +1 -1
- package/lib/module/engine/screens.js +77 -16
- package/lib/module/engine/screens.js.map +1 -1
- package/lib/module/interfaces/contract/commands.json +101 -0
- package/lib/module/interfaces/contract/errors.json +275 -0
- package/lib/typescript/adapters/NativeANNTurboModule.d.ts +12 -2
- package/lib/typescript/adapters/NativeANNTurboModule.d.ts.map +1 -1
- package/lib/typescript/api/app/AppRegistry.d.ts.map +1 -1
- package/lib/typescript/api/app/createNavigation.d.ts +8 -3
- package/lib/typescript/api/app/createNavigation.d.ts.map +1 -1
- package/lib/typescript/api/commands/commands.d.ts.map +1 -1
- package/lib/typescript/api/commands/presentation.d.ts +4 -3
- package/lib/typescript/api/commands/presentation.d.ts.map +1 -1
- package/lib/typescript/api/events/navigationEvents.d.ts +3 -3
- package/lib/typescript/api/events/navigationEvents.d.ts.map +1 -1
- package/lib/typescript/api/hooks/useNavigation.d.ts +1 -1
- package/lib/typescript/api/hooks/useNavigation.d.ts.map +1 -1
- package/lib/typescript/api/hooks/useSafeAreaInsets.d.ts +4 -3
- package/lib/typescript/api/hooks/useSafeAreaInsets.d.ts.map +1 -1
- package/lib/typescript/api/index.d.ts +1 -1
- package/lib/typescript/api/index.d.ts.map +1 -1
- package/lib/typescript/api/linking/dispatchedLinks.d.ts +7 -0
- package/lib/typescript/api/linking/dispatchedLinks.d.ts.map +1 -0
- package/lib/typescript/api/linking/linking.d.ts +8 -0
- package/lib/typescript/api/linking/linking.d.ts.map +1 -1
- package/lib/typescript/api/navigation.d.ts +4 -1
- package/lib/typescript/api/navigation.d.ts.map +1 -1
- package/lib/typescript/api/options/OptionsChain.d.ts +2 -2
- package/lib/typescript/api/screens/arrangement.d.ts +12 -2
- package/lib/typescript/api/screens/arrangement.d.ts.map +1 -1
- package/lib/typescript/api/screens/defineScreen.d.ts +23 -4
- package/lib/typescript/api/screens/defineScreen.d.ts.map +1 -1
- package/lib/typescript/api/screens/nativeScreens.d.ts +8 -1
- package/lib/typescript/api/screens/nativeScreens.d.ts.map +1 -1
- package/lib/typescript/api/screens/registerScreens.d.ts.map +1 -1
- package/lib/typescript/api/theme/theme.d.ts +2 -0
- package/lib/typescript/api/theme/theme.d.ts.map +1 -1
- package/lib/typescript/engine/commands.d.ts +5 -0
- package/lib/typescript/engine/commands.d.ts.map +1 -1
- package/lib/typescript/engine/layout.d.ts.map +1 -1
- package/lib/typescript/engine/nativeScreens.d.ts +5 -0
- package/lib/typescript/engine/nativeScreens.d.ts.map +1 -1
- package/lib/typescript/engine/options.d.ts +5 -2
- package/lib/typescript/engine/options.d.ts.map +1 -1
- package/lib/typescript/engine/optionsChange.d.ts +28 -0
- package/lib/typescript/engine/optionsChange.d.ts.map +1 -0
- package/lib/typescript/engine/places.d.ts +7 -2
- package/lib/typescript/engine/places.d.ts.map +1 -1
- package/lib/typescript/engine/props.d.ts +8 -1
- package/lib/typescript/engine/props.d.ts.map +1 -1
- package/lib/typescript/engine/refresh.d.ts +35 -0
- package/lib/typescript/engine/refresh.d.ts.map +1 -0
- package/lib/typescript/engine/rememberedOptions.d.ts +13 -0
- package/lib/typescript/engine/rememberedOptions.d.ts.map +1 -1
- package/lib/typescript/engine/screens.d.ts +27 -6
- package/lib/typescript/engine/screens.d.ts.map +1 -1
- package/lib/typescript/interfaces/ComponentEvents.d.ts +4 -4
- package/lib/typescript/interfaces/ComponentEvents.d.ts.map +1 -1
- package/lib/typescript/interfaces/Events.d.ts +28 -10
- package/lib/typescript/interfaces/Events.d.ts.map +1 -1
- package/lib/typescript/interfaces/Options.d.ts +1 -1
- package/lib/typescript/interfaces/Options.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/animations.d.ts +80 -22
- package/lib/typescript/interfaces/options/animations.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/bottomTabs.d.ts +21 -7
- package/lib/typescript/interfaces/options/bottomTabs.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/buttons.d.ts +23 -15
- package/lib/typescript/interfaces/options/buttons.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/modals.d.ts +34 -26
- package/lib/typescript/interfaces/options/modals.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/sideMenu.d.ts +23 -6
- package/lib/typescript/interfaces/options/sideMenu.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/stack.d.ts +17 -3
- package/lib/typescript/interfaces/options/stack.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/system.d.ts +18 -11
- package/lib/typescript/interfaces/options/system.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/toolbar.d.ts +2 -2
- package/lib/typescript/interfaces/options/topBar.d.ts +68 -38
- package/lib/typescript/interfaces/options/topBar.d.ts.map +1 -1
- package/metro/acceptPlugin.js +57 -0
- package/metro/babelTransformer.js +45 -0
- package/metro/index.js +36 -0
- package/package.json +3 -1
- package/src/ARCHITECTURE.md +40 -27
- package/src/adapters/NativeANNTurboModule.ts +12 -2
- package/src/api/app/AppRegistry.ts +16 -2
- package/src/api/app/createNavigation.ts +203 -69
- package/src/api/commands/commands.ts +48 -7
- package/src/api/commands/presentation.ts +4 -3
- package/src/api/events/navigationEvents.ts +10 -4
- package/src/api/hooks/useNavigation.ts +9 -4
- package/src/api/hooks/useSafeAreaInsets.ts +4 -3
- package/src/api/index.ts +1 -0
- package/src/api/linking/dispatchedLinks.ts +18 -0
- package/src/api/linking/linking.ts +22 -1
- package/src/api/navigation.ts +4 -1
- package/src/api/options/OptionsChain.ts +2 -2
- package/src/api/screens/arrangement.ts +17 -4
- package/src/api/screens/defineScreen.ts +49 -5
- package/src/api/screens/nativeScreens.ts +40 -4
- package/src/api/screens/registerScreens.tsx +185 -42
- package/src/api/theme/theme.ts +5 -0
- package/src/engine/commands.ts +70 -13
- package/src/engine/layout.ts +27 -11
- package/src/engine/nativeScreens.ts +10 -1
- package/src/engine/options.ts +45 -19
- package/src/engine/optionsChange.ts +107 -0
- package/src/engine/places.ts +65 -7
- package/src/engine/props.ts +30 -1
- package/src/engine/refresh.ts +97 -0
- package/src/engine/rememberedOptions.ts +74 -1
- package/src/engine/screens.tsx +76 -21
- package/src/interfaces/ComponentEvents.ts +4 -4
- package/src/interfaces/Events.ts +29 -10
- package/src/interfaces/Options.ts +1 -0
- package/src/interfaces/contract/commands.json +101 -0
- package/src/interfaces/contract/errors.json +275 -0
- package/src/interfaces/options/animations.ts +81 -22
- package/src/interfaces/options/bottomTabs.ts +21 -7
- package/src/interfaces/options/buttons.ts +23 -15
- package/src/interfaces/options/modals.ts +34 -26
- package/src/interfaces/options/sideMenu.ts +24 -6
- package/src/interfaces/options/stack.ts +17 -3
- package/src/interfaces/options/system.ts +18 -11
- package/src/interfaces/options/toolbar.ts +2 -2
- package/src/interfaces/options/topBar.ts +68 -38
- package/android/src/main/java/dev/apexnative/navigation/react/ArrangementStates.kt +0 -41
- package/android/src/main/java/dev/apexnative/navigation/react/ScreenInsets.kt +0 -69
- package/android/src/main/java/dev/apexnative/navigation/react/events/NavigationStateReporter.kt +0 -62
- package/android/src/main/java/dev/apexnative/navigation/react/events/StateHold.kt +0 -62
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/CustomTabRowPlacer.kt +0 -223
- package/android/src/main/java/dev/apexnative/navigation/views/element/ElementStub.kt +0 -31
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ImageMatrixAnimator.kt +0 -138
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PlainViewAnimator.kt +0 -88
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PropertyAnimatorCreator.kt +0 -33
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ReactImageAnimator.kt +0 -66
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/TextChangeAnimator.kt +0 -179
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ViewChangeAnimator.kt +0 -139
- package/ios/Layouts/Screen/ANNScreenInsets.h +0 -30
- package/ios/Layouts/Screen/ANNScreenInsets.mm +0 -68
- package/ios/Layouts/Tabs/ANNTabsPreloadWindow.h +0 -27
- package/ios/Layouts/Tabs/ANNTabsPreloadWindow.mm +0 -55
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#import "ANNIconButtonImage.h"
|
|
2
2
|
#import "ANNUtils.h"
|
|
3
|
+
#import <React/RCTLog.h>
|
|
3
4
|
|
|
4
5
|
@implementation ANNIconButtonImage
|
|
5
6
|
|
|
@@ -9,6 +10,30 @@
|
|
|
9
10
|
cornerRadius:(CGFloat)cornerRadius
|
|
10
11
|
size:(CGSize)size
|
|
11
12
|
insets:(UIEdgeInsets)insets {
|
|
13
|
+
// An icon that can't be drawn so (no size, insets that leave no room, an exception of the renderer) shows as it is.
|
|
14
|
+
@try {
|
|
15
|
+
UIImage *image = [self variantsOfIcon:icon
|
|
16
|
+
tint:tint
|
|
17
|
+
background:background
|
|
18
|
+
cornerRadius:cornerRadius
|
|
19
|
+
size:size
|
|
20
|
+
insets:insets];
|
|
21
|
+
if (image) {
|
|
22
|
+
return image;
|
|
23
|
+
}
|
|
24
|
+
} @catch (NSException *exception) {
|
|
25
|
+
RCTLogWarn(@"[ApexNavigation] a button's image could not be drawn on its background: %@",
|
|
26
|
+
exception.reason);
|
|
27
|
+
}
|
|
28
|
+
return icon;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
+ (nullable UIImage *)variantsOfIcon:(UIImage *)icon
|
|
32
|
+
tint:(UIColor *)tint
|
|
33
|
+
background:(UIColor *)background
|
|
34
|
+
cornerRadius:(CGFloat)cornerRadius
|
|
35
|
+
size:(CGSize)size
|
|
36
|
+
insets:(UIEdgeInsets)insets {
|
|
12
37
|
// Each variant carries a scale with its style: an asset of style-only traits gives back an image of scale 1, its
|
|
13
38
|
// pixels taken as points (a 32 pt background drawn 96 pt wide). The current scale and the usual ones are drawn,
|
|
14
39
|
// so a screen of another scale still finds its style. Each variant is an original image, so that a variant UIKit
|
|
@@ -30,6 +55,9 @@
|
|
|
30
55
|
size:size
|
|
31
56
|
insets:insets
|
|
32
57
|
traits:traits];
|
|
58
|
+
if (!drawn) {
|
|
59
|
+
return nil;
|
|
60
|
+
}
|
|
33
61
|
[asset registerImage:[drawn imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]
|
|
34
62
|
withTraitCollection:traits];
|
|
35
63
|
}
|
|
@@ -54,7 +82,7 @@
|
|
|
54
82
|
]];
|
|
55
83
|
}
|
|
56
84
|
|
|
57
|
-
+ (UIImage *)drawIcon:(UIImage *)icon
|
|
85
|
+
+ (nullable UIImage *)drawIcon:(UIImage *)icon
|
|
58
86
|
tint:(UIColor *)tint
|
|
59
87
|
background:(UIColor *)background
|
|
60
88
|
cornerRadius:(CGFloat)cornerRadius
|
|
@@ -66,6 +94,11 @@
|
|
|
66
94
|
iconSize.height + insets.top + insets.bottom);
|
|
67
95
|
CGSize canvas = CGSizeMake(size.width > 0 ? size.width : padded.width,
|
|
68
96
|
size.height > 0 ? size.height : padded.height);
|
|
97
|
+
BOOL drawable = canvas.width > 0 && canvas.height > 0 && isfinite(canvas.width) &&
|
|
98
|
+
isfinite(canvas.height);
|
|
99
|
+
if (!drawable) {
|
|
100
|
+
return nil;
|
|
101
|
+
}
|
|
69
102
|
UIImage *drawn = icon;
|
|
70
103
|
if (tint) {
|
|
71
104
|
drawn = [icon imageWithTintColor:[tint resolvedColorWithTraitCollection:traits]
|
|
@@ -57,6 +57,19 @@ typedef struct {
|
|
|
57
57
|
/// goes, and the bar follows what it follows at rest.
|
|
58
58
|
- (void)screenDidAppear:(ANNNavigationOptions *)options list:(nullable UIScrollView *)list;
|
|
59
59
|
|
|
60
|
+
/// iOS 26: a push starts that brings the screen in with its content drawn already (it waited for it parked, out of the
|
|
61
|
+
/// stack). UIKit draws the large title, for the whole transition, inside the scroll view the bar follows, and takes
|
|
62
|
+
/// its place from that scroll view as the transition starts: a list below the bar clips it, a list laid out before the
|
|
63
|
+
/// push may give it the room of a small title, and a title that doesn't fold into the list has nothing to follow yet.
|
|
64
|
+
/// The screen's view gets the place of `screenInPop:list:inlineInRow:`, at rest at `top`, the top of the safe area the
|
|
65
|
+
/// screen takes on the stack (`stackTop` the stack's own), and the bar follows it until the screen appeared, also over
|
|
66
|
+
/// a main list. Called before UIKit's push.
|
|
67
|
+
- (void)screenInPush:(ANNNavigationOptions *)options
|
|
68
|
+
list:(nullable UIScrollView *)list
|
|
69
|
+
inlineInRow:(BOOL)inlineInRow
|
|
70
|
+
top:(CGFloat)top
|
|
71
|
+
stackTop:(CGFloat)stackTop;
|
|
72
|
+
|
|
60
73
|
/// The screen went without appearing (a swipe back given up): the place of the title of the pop goes, and the bar
|
|
61
74
|
/// follows what it followed before.
|
|
62
75
|
- (void)screenDidDisappear:(ANNNavigationOptions *)options list:(nullable UIScrollView *)list;
|
|
@@ -3,6 +3,13 @@
|
|
|
3
3
|
#import "ANNBarAppearance.h"
|
|
4
4
|
#import "ANNMainList.h"
|
|
5
5
|
#import "ANNScreenBars.h"
|
|
6
|
+
#import "ANNTabsDesign.h"
|
|
7
|
+
|
|
8
|
+
// The glass design of iOS 26 draws the large title inside the list the bar follows: the places, fills and bands of
|
|
9
|
+
// this file are for it. The compatibility mode keeps the title in the bar, as before iOS 26 (`ANNTabsDesign`).
|
|
10
|
+
static BOOL ANNTitleInList(void) {
|
|
11
|
+
return ANNTabsDesign.isGlass;
|
|
12
|
+
}
|
|
6
13
|
|
|
7
14
|
// How far the color reaches above the list's content: as far as a pull can show.
|
|
8
15
|
static const CGFloat ANNListFillHeight = 2000;
|
|
@@ -37,9 +44,11 @@ static UINavigationItemLargeTitleDisplayMode ANNItemModeOf(NSString *mode) {
|
|
|
37
44
|
// The push from a lower bar whose fill is pending: the old bar's bottom in the screen's coordinates.
|
|
38
45
|
BOOL _titlePlacePending;
|
|
39
46
|
CGFloat _oldBarBottom;
|
|
40
|
-
// The place of the title while a pop reveals the screen, and whether the bar follows it now
|
|
47
|
+
// The place of the title while a pop reveals the screen, and whether the bar follows it now; for a push, the bar
|
|
48
|
+
// follows it until the screen appeared, also with a main list.
|
|
41
49
|
UIScrollView *_titleHost;
|
|
42
50
|
BOOL _hostsTitle;
|
|
51
|
+
BOOL _hostsPushTitle;
|
|
43
52
|
// The largest room the bar took over the content while the screen showed at rest: that of an expanded title.
|
|
44
53
|
CGFloat _expandedRoom;
|
|
45
54
|
}
|
|
@@ -56,10 +65,8 @@ static UINavigationItemLargeTitleDisplayMode ANNItemModeOf(NSString *mode) {
|
|
|
56
65
|
![options.topBar.largeTitle.collapseOnScroll withDefault:YES]) {
|
|
57
66
|
return NO;
|
|
58
67
|
}
|
|
59
|
-
if (
|
|
60
|
-
|
|
61
|
-
return NO;
|
|
62
|
-
}
|
|
68
|
+
if (ANNTitleInList() && ANNAppDirection.reactNativeIsRightToLeft) {
|
|
69
|
+
return NO;
|
|
63
70
|
}
|
|
64
71
|
return YES;
|
|
65
72
|
}
|
|
@@ -99,13 +106,15 @@ static UINavigationItemLargeTitleDisplayMode ANNItemModeOf(NSString *mode) {
|
|
|
99
106
|
if (followed != _emptyScrollView) {
|
|
100
107
|
_emptyScrollView = nil;
|
|
101
108
|
}
|
|
102
|
-
// The place of a pop's title holds while the title can show and no main list at the top takes it over
|
|
109
|
+
// The place of a pop's title holds while the title can show and no main list at the top takes it over; that of a
|
|
110
|
+
// push, while the title can show.
|
|
103
111
|
BOOL dropsHost = NO;
|
|
104
112
|
if (_hostsTitle) {
|
|
105
|
-
if (canShow && (!collapses || !list)) {
|
|
113
|
+
if (canShow && (_hostsPushTitle || !collapses || !list)) {
|
|
106
114
|
followed = _titleHost;
|
|
107
115
|
} else {
|
|
108
116
|
_hostsTitle = NO;
|
|
117
|
+
_hostsPushTitle = NO;
|
|
109
118
|
dropsHost = YES;
|
|
110
119
|
}
|
|
111
120
|
}
|
|
@@ -128,6 +137,9 @@ static UINavigationItemLargeTitleDisplayMode ANNItemModeOf(NSString *mode) {
|
|
|
128
137
|
- (void)screenInPop:(ANNNavigationOptions *)options
|
|
129
138
|
list:(UIScrollView *)list
|
|
130
139
|
inlineInRow:(BOOL)inlineInRow {
|
|
140
|
+
if (!ANNTitleInList()) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
131
143
|
if (@available(iOS 26.0, *)) {
|
|
132
144
|
UIViewController *screen = _screen;
|
|
133
145
|
UIView *screenView = screen.viewIfLoaded;
|
|
@@ -159,6 +171,26 @@ static UINavigationItemLargeTitleDisplayMode ANNItemModeOf(NSString *mode) {
|
|
|
159
171
|
}
|
|
160
172
|
}
|
|
161
173
|
|
|
174
|
+
- (void)screenInPush:(ANNNavigationOptions *)options
|
|
175
|
+
list:(UIScrollView *)list
|
|
176
|
+
inlineInRow:(BOOL)inlineInRow
|
|
177
|
+
top:(CGFloat)top
|
|
178
|
+
stackTop:(CGFloat)stackTop {
|
|
179
|
+
if (!ANNTitleInList()) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
if (@available(iOS 26.0, *)) {
|
|
183
|
+
UIView *screenView = _screen.viewIfLoaded;
|
|
184
|
+
if (!screenView || inlineInRow || !ANNLargeTitleCanShow(options) || top - stackTop <= 0) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
[self placeTitleHostIn:screenView top:top];
|
|
188
|
+
_hostsTitle = YES;
|
|
189
|
+
_hostsPushTitle = YES;
|
|
190
|
+
[self applyCollapse:options list:list];
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
162
194
|
// A plain scroll view over the whole screen, at rest at its top under the bar (its content starts at `top`, where the
|
|
163
195
|
// content of the screen started as it was covered): UIKit puts the title just above that start, where the bar's title
|
|
164
196
|
// is at rest. It takes no touches and draws nothing itself; the core's search of the screen's list skips it.
|
|
@@ -195,6 +227,7 @@ static UINavigationItemLargeTitleDisplayMode ANNItemModeOf(NSString *mode) {
|
|
|
195
227
|
- (void)handBackTitle:(ANNNavigationOptions *)options list:(UIScrollView *)list {
|
|
196
228
|
BOOL hosted = _hostsTitle;
|
|
197
229
|
_hostsTitle = NO;
|
|
230
|
+
_hostsPushTitle = NO;
|
|
198
231
|
[self applyCollapse:options list:list];
|
|
199
232
|
if (hosted) {
|
|
200
233
|
[_titleHost removeFromSuperview];
|
|
@@ -252,6 +285,7 @@ static UINavigationItemLargeTitleDisplayMode ANNItemModeOf(NSString *mode) {
|
|
|
252
285
|
|
|
253
286
|
- (void)removeTitleHost {
|
|
254
287
|
_hostsTitle = NO;
|
|
288
|
+
_hostsPushTitle = NO;
|
|
255
289
|
[_titleHost removeFromSuperview];
|
|
256
290
|
}
|
|
257
291
|
|
|
@@ -259,6 +293,9 @@ static UINavigationItemLargeTitleDisplayMode ANNItemModeOf(NSString *mode) {
|
|
|
259
293
|
list:(UIScrollView *)list
|
|
260
294
|
inlineInRow:(BOOL)inlineInRow
|
|
261
295
|
backgroundComponent:(BOOL)backgroundComponent {
|
|
296
|
+
if (!ANNTitleInList()) {
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
262
299
|
if (@available(iOS 26.0, *)) {
|
|
263
300
|
UIViewController *screen = _screen;
|
|
264
301
|
UIColor *fill = [ANNBarAppearance solidColorOf:options.topBar.background.color
|
|
@@ -297,6 +334,9 @@ static UINavigationItemLargeTitleDisplayMode ANNItemModeOf(NSString *mode) {
|
|
|
297
334
|
- (void)fillTitlePlaceFrom:(CGFloat)oldBarBottom
|
|
298
335
|
list:(UIScrollView *)list
|
|
299
336
|
options:(ANNNavigationOptions *)options {
|
|
337
|
+
if (!ANNTitleInList()) {
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
300
340
|
if (@available(iOS 26.0, *)) {
|
|
301
341
|
[self removeTitlePlaceFill];
|
|
302
342
|
if (!ANNLargeTitleCanShow(options) || [ANNLargeTitlePresenter collapsesIntoList:options]) {
|
|
@@ -311,6 +351,9 @@ static UINavigationItemLargeTitleDisplayMode ANNItemModeOf(NSString *mode) {
|
|
|
311
351
|
// The pushed screen's content may render only during the push, so its list mounts later than the push starts: the
|
|
312
352
|
// fill is placed again at each mount and layout until the screen appeared.
|
|
313
353
|
- (void)updateTitlePlaceFill:(ANNNavigationOptions *)options list:(UIScrollView *)list {
|
|
354
|
+
if (!ANNTitleInList()) {
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
314
357
|
if (@available(iOS 26.0, *)) {
|
|
315
358
|
UIViewController *screen = _screen;
|
|
316
359
|
UIView *screenView = screen.viewIfLoaded;
|
package/ios/TopBar/ANNMainList.h
CHANGED
|
@@ -23,6 +23,9 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
23
23
|
/// search takes it, or what is in it, for the screen's list.
|
|
24
24
|
+ (void)excludeView:(UIView *)view;
|
|
25
25
|
|
|
26
|
+
/// The view is one of those (`excludeView:`).
|
|
27
|
+
+ (BOOL)isExcludedView:(UIView *)view;
|
|
28
|
+
|
|
26
29
|
@end
|
|
27
30
|
|
|
28
31
|
NS_ASSUME_NONNULL_END
|
|
@@ -22,6 +22,10 @@ static const CGFloat ANNMainListTolerance = 1;
|
|
|
22
22
|
objc_setAssociatedObject(view, ANNMainListExcludedKey, @YES, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
+
+ (BOOL)isExcludedView:(UIView *)view {
|
|
26
|
+
return objc_getAssociatedObject(view, ANNMainListExcludedKey) != nil;
|
|
27
|
+
}
|
|
28
|
+
|
|
25
29
|
- (UIScrollView *)keptList {
|
|
26
30
|
UIScrollView *list = _list;
|
|
27
31
|
UIView *screenView = _screenView;
|
|
@@ -5,9 +5,12 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
5
5
|
|
|
6
6
|
/// The scroll edge effect of a screen's lists (iOS 26; `scrollEdgeEffect.*`): each edge's own `hidden` / `style` beat
|
|
7
7
|
/// the general ones, through the public API. No top effect under a solid `background.color` (not a clear one) or
|
|
8
|
-
/// `background.component` unless the screen set its own for the top or for all edges. The
|
|
9
|
-
///
|
|
10
|
-
///
|
|
8
|
+
/// `background.component` unless the screen set its own for the top or for all edges. The lists are the scroll views
|
|
9
|
+
/// of the screen's view down to 16 levels, outside hidden views (`display: none`), not inside a list that scrolls
|
|
10
|
+
/// vertically (its rows) or a text view; a scroll view that doesn't (a pager, a carousel) is looked into for its
|
|
11
|
+
/// lists. The screen remembers the lists it set and gives them the system values back when it leaves, at its destroy
|
|
12
|
+
/// and when they leave its view for no screen (Fabric's pool; in another screen they may be that screen's already).
|
|
13
|
+
/// Before iOS 26 nothing. Main queue.
|
|
11
14
|
@interface ANNScrollEdgeEffects : NSObject
|
|
12
15
|
|
|
13
16
|
- (instancetype)initWithScreenView:(UIView *)screenView;
|
|
@@ -15,13 +18,26 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
15
18
|
- (instancetype)init NS_UNAVAILABLE;
|
|
16
19
|
+ (instancetype)new NS_UNAVAILABLE;
|
|
17
20
|
|
|
18
|
-
/// At the appearance and at a merge:
|
|
21
|
+
/// At the appearance and at a merge: the lists of the screen's view, set again whole. Without a walk (only the known
|
|
22
|
+
/// lists still in the view set again) when the options it reads and the traits are the same as at the last walk and
|
|
23
|
+
/// no content mounted since, while the screen's content tells all its mounts (`mountsReported`) and that walk found
|
|
24
|
+
/// no pager.
|
|
19
25
|
- (void)applyToAllWithOptions:(ANNNavigationOptions *)options;
|
|
20
26
|
|
|
21
|
-
///
|
|
27
|
+
/// The screen's content tells each of its mounts, also out of the window (a React root): without it every call walks
|
|
28
|
+
/// the view.
|
|
29
|
+
@property(nonatomic) BOOL mountsReported;
|
|
30
|
+
|
|
31
|
+
/// After a mount of the content: the main list only; lists React took out of the screen get the system values, and
|
|
32
|
+
/// the next `applyToAllWithOptions:` walks the view again.
|
|
22
33
|
- (void)applyToList:(nullable UIScrollView *)list options:(ANNNavigationOptions *)options;
|
|
23
34
|
|
|
24
|
-
/// The lists
|
|
35
|
+
/// The screen left: its lists get the system values back (a list Fabric recycles from it comes clean), and stay
|
|
36
|
+
/// known for its next appearance.
|
|
37
|
+
- (void)screenDidDisappear;
|
|
38
|
+
|
|
39
|
+
/// The lists set get the system values back and are forgotten (the screen's content goes, its destroy); the next
|
|
40
|
+
/// `applyToAllWithOptions:` walks the view again.
|
|
25
41
|
- (void)reset;
|
|
26
42
|
|
|
27
43
|
@end
|
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
#import "ANNScrollEdgeEffects.h"
|
|
2
2
|
#import "ANNBarAppearance.h"
|
|
3
|
+
#import "ANNMainList.h"
|
|
4
|
+
|
|
5
|
+
// How deep the walk looks for lists, as the main list's search.
|
|
6
|
+
static const NSUInteger ANNEdgeWalkMaxDepth = 16;
|
|
7
|
+
static const CGFloat ANNEdgeWalkTolerance = 1;
|
|
8
|
+
|
|
9
|
+
// A list that scrolls (or bounces) vertically: what is in it is its rows, which never meet a bar themselves.
|
|
10
|
+
static BOOL ANNScrollsVertically(UIScrollView *list) {
|
|
11
|
+
return list.alwaysBounceVertical ||
|
|
12
|
+
list.contentSize.height > CGRectGetHeight(list.bounds) + ANNEdgeWalkTolerance;
|
|
13
|
+
}
|
|
3
14
|
|
|
4
15
|
// What one edge gets: whether it is hidden and its style; `nil` style is automatic.
|
|
5
16
|
typedef struct {
|
|
@@ -18,6 +29,11 @@ static ANNEdgeEffect ANNEdgeEffectOf(ANNScrollEdgeEffectOptions *effect,
|
|
|
18
29
|
@implementation ANNScrollEdgeEffects {
|
|
19
30
|
__weak UIView *_screenView;
|
|
20
31
|
NSHashTable<UIScrollView *> *_lists;
|
|
32
|
+
// What the last walk read (nil: walk at the next call), and whether content mounted since or the walk found a
|
|
33
|
+
// scroll view whose lists come and go without a mount (a pager's pages).
|
|
34
|
+
NSArray *_walkInputs;
|
|
35
|
+
BOOL _mountedSinceWalk;
|
|
36
|
+
BOOL _walkFoundPager;
|
|
21
37
|
}
|
|
22
38
|
|
|
23
39
|
- (instancetype)initWithScreenView:(UIView *)screenView {
|
|
@@ -30,46 +46,137 @@ static ANNEdgeEffect ANNEdgeEffectOf(ANNScrollEdgeEffectOptions *effect,
|
|
|
30
46
|
|
|
31
47
|
- (void)applyToAllWithOptions:(ANNNavigationOptions *)options {
|
|
32
48
|
if (@available(iOS 26.0, *)) {
|
|
33
|
-
[self reset];
|
|
34
49
|
UIView *screenView = _screenView;
|
|
35
|
-
if (screenView) {
|
|
36
|
-
[self
|
|
50
|
+
if (!screenView) {
|
|
51
|
+
[self reset];
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
NSArray *inputs = [self inputsOf:options traits:screenView.traitCollection];
|
|
55
|
+
[self dropListsOutside:screenView];
|
|
56
|
+
// The lists are the same as at the last walk: they take the values again (the screen gave them the system
|
|
57
|
+
// ones as it went), without a walk.
|
|
58
|
+
if (_walkInputs && _mountsReported && !_mountedSinceWalk && !_walkFoundPager &&
|
|
59
|
+
ANNOptionValuesSame(_walkInputs, inputs)) {
|
|
60
|
+
for (UIScrollView *list in _lists.allObjects) {
|
|
61
|
+
[self apply:options to:list];
|
|
62
|
+
}
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
NSMutableArray<UIScrollView *> *found = [NSMutableArray new];
|
|
66
|
+
BOOL pager = NO;
|
|
67
|
+
[self collectIn:screenView depth:0 into:found pager:&pager];
|
|
68
|
+
// The screen's lists that the walk no longer finds get the system values; the others are set again.
|
|
69
|
+
for (UIScrollView *kept in _lists.allObjects) {
|
|
70
|
+
if ([found indexOfObjectIdenticalTo:kept] == NSNotFound) {
|
|
71
|
+
[ANNScrollEdgeEffects resetList:kept];
|
|
72
|
+
[_lists removeObject:kept];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
for (UIScrollView *list in found) {
|
|
76
|
+
[self apply:options to:list];
|
|
37
77
|
}
|
|
78
|
+
_walkInputs = inputs;
|
|
79
|
+
_mountedSinceWalk = NO;
|
|
80
|
+
_walkFoundPager = pager;
|
|
38
81
|
}
|
|
39
82
|
}
|
|
40
83
|
|
|
41
|
-
|
|
84
|
+
// What the effects of a list read: the effect's options, the bar's background (a solid one hides the top), the traits
|
|
85
|
+
// a clear color is told by.
|
|
86
|
+
- (NSArray *)inputsOf:(ANNNavigationOptions *)options traits:(UITraitCollection *)traits {
|
|
87
|
+
ANNTopBarBackgroundOptions *background = options.topBar.background;
|
|
88
|
+
return @[
|
|
89
|
+
options.scrollEdgeEffect, background.color, background.component.name,
|
|
90
|
+
@(traits.userInterfaceStyle), @(traits.accessibilityContrast)
|
|
91
|
+
];
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// The lists of `view`, bounded as the main list's search: hidden views (`display: none`) and the core's own views are
|
|
95
|
+
// left out with what is in them. A view at alpha 0 is not: an animation (a fade in, a transition) changes it without a
|
|
96
|
+
// mount. A list that scrolls vertically and a text view are set, not looked into; a scroll view that doesn't is looked
|
|
97
|
+
// into for the lists of its pages, and such a walk is never skipped.
|
|
98
|
+
- (void)collectIn:(UIView *)view
|
|
99
|
+
depth:(NSUInteger)depth
|
|
100
|
+
into:(NSMutableArray<UIScrollView *> *)found
|
|
101
|
+
pager:(BOOL *)pager {
|
|
102
|
+
if (depth > ANNEdgeWalkMaxDepth) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
42
105
|
for (UIView *subview in view.subviews) {
|
|
106
|
+
if (subview.hidden || [ANNMainList isExcludedView:subview]) {
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
43
109
|
if ([subview isKindOfClass:UIScrollView.class]) {
|
|
44
|
-
|
|
110
|
+
UIScrollView *list = (UIScrollView *)subview;
|
|
111
|
+
[found addObject:list];
|
|
112
|
+
if ([list isKindOfClass:UITextView.class] || ANNScrollsVertically(list)) {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
*pager = YES;
|
|
45
116
|
}
|
|
46
|
-
[self
|
|
117
|
+
[self collectIn:subview depth:depth + 1 into:found pager:pager];
|
|
47
118
|
}
|
|
48
119
|
}
|
|
49
120
|
|
|
50
121
|
- (void)applyToList:(UIScrollView *)list options:(ANNNavigationOptions *)options {
|
|
122
|
+
_mountedSinceWalk = YES;
|
|
51
123
|
if (@available(iOS 26.0, *)) {
|
|
52
|
-
|
|
53
|
-
UIView *screenView = _screenView;
|
|
54
|
-
for (UIScrollView *kept in _lists.allObjects) {
|
|
55
|
-
if (!screenView || ![kept isDescendantOfView:screenView]) {
|
|
56
|
-
[ANNScrollEdgeEffects resetList:kept];
|
|
57
|
-
[_lists removeObject:kept];
|
|
58
|
-
}
|
|
59
|
-
}
|
|
124
|
+
[self dropListsOutside:_screenView];
|
|
60
125
|
if (list) {
|
|
61
126
|
[self apply:options to:list];
|
|
62
127
|
}
|
|
63
128
|
}
|
|
64
129
|
}
|
|
65
130
|
|
|
66
|
-
|
|
131
|
+
// Whether `view` is in some screen: one of its views is the view of a view controller, in a window or not. A list in
|
|
132
|
+
// Fabric's pool is not: its component view (the list's own superview) has no superview there.
|
|
133
|
+
static BOOL ANNIsInAScreen(UIView *view) {
|
|
134
|
+
for (UIView *ancestor = view; ancestor; ancestor = ancestor.superview) {
|
|
135
|
+
if ([ancestor.nextResponder isKindOfClass:UIViewController.class]) {
|
|
136
|
+
return YES;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return NO;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// A list React took out of the screen is no longer the screen's: outside every screen (in the pool Fabric recycles
|
|
143
|
+
// its views from, shared by every surface) it gets the system values, so it comes clean into the screen that takes it;
|
|
144
|
+
// in another screen it may be that screen's already, which set its values: it is only forgotten.
|
|
145
|
+
- (void)dropListsOutside:(nullable UIView *)screenView {
|
|
146
|
+
for (UIScrollView *kept in _lists.allObjects) {
|
|
147
|
+
if (screenView && [kept isDescendantOfView:screenView]) {
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
if (@available(iOS 26.0, *)) {
|
|
151
|
+
if (!ANNIsInAScreen(kept)) {
|
|
152
|
+
[ANNScrollEdgeEffects resetList:kept];
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
[_lists removeObject:kept];
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// The screen's lists get the system values; with `keepingLists` they stay known, with what the last walk read, for
|
|
160
|
+
// the next appearance to set them again without a walk.
|
|
161
|
+
- (void)giveBackKeepingLists:(BOOL)keepingLists {
|
|
162
|
+
[self dropListsOutside:_screenView];
|
|
67
163
|
if (@available(iOS 26.0, *)) {
|
|
68
164
|
for (UIScrollView *list in _lists.allObjects) {
|
|
69
165
|
[ANNScrollEdgeEffects resetList:list];
|
|
70
166
|
}
|
|
71
167
|
}
|
|
72
|
-
|
|
168
|
+
if (!keepingLists) {
|
|
169
|
+
[_lists removeAllObjects];
|
|
170
|
+
_walkInputs = nil;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
- (void)screenDidDisappear {
|
|
175
|
+
[self giveBackKeepingLists:YES];
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
- (void)reset {
|
|
179
|
+
[self giveBackKeepingLists:NO];
|
|
73
180
|
}
|
|
74
181
|
|
|
75
182
|
+ (void)resetList:(UIScrollView *)list API_AVAILABLE(ios(26.0)) {
|