@apexnative/navigation 1.0.0-alpha.0 → 1.0.0-alpha.10
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 +128 -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/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/cli/upgrade/changelog.js +2 -2
- 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/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 +57 -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 +10 -8
- 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 +32 -0
- package/ios/Layouts/Screen/ANNScreenSettling.mm +137 -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/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/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 +4 -25
- 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/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
|
@@ -7,15 +7,17 @@
|
|
|
7
7
|
#import "ANNMoreNavigationDelegate.h"
|
|
8
8
|
#import "ANNNavigationState.h"
|
|
9
9
|
#import "ANNNodeRegistry.h"
|
|
10
|
+
#import "ANNParking.h"
|
|
10
11
|
#import "ANNPendingLayers.h"
|
|
11
12
|
#import "ANNScreenBars.h"
|
|
13
|
+
#import "ANNScreenPlace.h"
|
|
12
14
|
#import "ANNScrollToTop.h"
|
|
13
15
|
#import "ANNShownScreens.h"
|
|
14
16
|
#import "ANNStackController.h"
|
|
17
|
+
#import "ANNStackQueue.h"
|
|
15
18
|
#import "ANNSystemUI.h"
|
|
16
19
|
#import "ANNTabLongPress.h"
|
|
17
20
|
#import "ANNTabsDesign.h"
|
|
18
|
-
#import "ANNTabsPreloadWindow.h"
|
|
19
21
|
#import "InteractivePopGestureDelegate.h"
|
|
20
22
|
#import <React/RCTLog.h>
|
|
21
23
|
|
|
@@ -23,13 +25,17 @@
|
|
|
23
25
|
// waits for it; the drive only must not stay).
|
|
24
26
|
static const NSTimeInterval ANNSwitchDriveLimit = 2;
|
|
25
27
|
|
|
26
|
-
// How long a step of `afterInitialTab` waits for its tab's root to mount before the next one starts
|
|
27
|
-
// lent React view stays in the preload window at most without mounting.
|
|
28
|
+
// How long a step of `afterInitialTab` waits for its tab's root to mount before the next one starts.
|
|
28
29
|
static const NSTimeInterval ANNTabMountLimit = 0.5;
|
|
29
30
|
|
|
30
31
|
// The key of the tabs' ready handlers on the screens of their selected tab (`afterInitialTab`).
|
|
31
32
|
static NSString *const ANNTabsReadyKey = @"ApexNavigation.tabs";
|
|
32
33
|
|
|
34
|
+
// The key of the tabs' ready handlers on the screens of a parked tab, and the longest such a tab waits for them in the
|
|
35
|
+
// parking: past it, its screens render their content where the tab shows.
|
|
36
|
+
static NSString *const ANNTabsUnseenKey = @"ApexNavigation.tabs.unseen";
|
|
37
|
+
static const NSTimeInterval ANNUnseenRenderLimit = 5;
|
|
38
|
+
|
|
33
39
|
// Whether UIKit pops the stack of a tab tapped again itself: the core answers "select" and lets it. NO would make the
|
|
34
40
|
// core pop it for every source and answer "don't" (the simulator decides).
|
|
35
41
|
static const BOOL ANNUIKitPopsOnRepeatPress = YES;
|
|
@@ -81,8 +87,12 @@ static void ANNStacksOfNode(UIViewController *node, NSMutableArray<ANNStackContr
|
|
|
81
87
|
// The `UITab` of each tab, in layout order (iOS 18 and later).
|
|
82
88
|
NSArray *_uiTabs;
|
|
83
89
|
NSHashTable<UIViewController *> *_renderedTabs;
|
|
84
|
-
|
|
85
|
-
|
|
90
|
+
// The tabs rendered before they show (`together`, the chain of `afterInitialTab`) wait unseen and hidden in the
|
|
91
|
+
// tabs' view until their screens rendered their content, as on Android: a screen's safe area view lays out only in
|
|
92
|
+
// a window. They leave it then, since the core takes a view in a window for one that shows, and their screens keep
|
|
93
|
+
// the place they rendered at until they appear. Those not parked yet wait for the tabs' view in a window.
|
|
94
|
+
ANNParking *_unseenParking;
|
|
95
|
+
NSHashTable<UIViewController *> *_tabsToPark;
|
|
86
96
|
// The chain of `afterInitialTab`: started once; a destroy ends it by its number.
|
|
87
97
|
BOOL _chainStarted;
|
|
88
98
|
NSUInteger _chainNumber;
|
|
@@ -137,7 +147,8 @@ static void ANNStacksOfNode(UIViewController *node, NSMutableArray<ANNStackContr
|
|
|
137
147
|
if (self) {
|
|
138
148
|
_tabs = [childViewControllers copy] ?: @[];
|
|
139
149
|
_renderedTabs = [NSHashTable weakObjectsHashTable];
|
|
140
|
-
|
|
150
|
+
_unseenParking = [ANNParking new];
|
|
151
|
+
_tabsToPark = [NSHashTable weakObjectsHashTable];
|
|
141
152
|
_staleTabs = [NSHashTable weakObjectsHashTable];
|
|
142
153
|
_pressedIndex = NSNotFound;
|
|
143
154
|
_codeChoiceIndex = NSNotFound;
|
|
@@ -444,7 +455,7 @@ static void ANNStacksOfNode(UIViewController *node, NSMutableArray<ANNStackContr
|
|
|
444
455
|
}
|
|
445
456
|
|
|
446
457
|
// The selected tab's waited screens by the command's rule; with `together` the top screen of every other tab too, by
|
|
447
|
-
//
|
|
458
|
+
// its content rendered unseen (More's tabs too).
|
|
448
459
|
- (NSArray<UIViewController *> *)waitedComponentViewControllers {
|
|
449
460
|
NSMutableArray<UIViewController *> *screens =
|
|
450
461
|
[[[self selectedTabNode] waitedComponentViewControllers] mutableCopy]
|
|
@@ -464,7 +475,7 @@ static void ANNStacksOfNode(UIViewController *node, NSMutableArray<ANNStackContr
|
|
|
464
475
|
|
|
465
476
|
- (ANNWaitedReadiness)waitedReadinessOfScreen:(UIViewController *)screen {
|
|
466
477
|
NSUInteger index = [self indexOfTabHolding:screen];
|
|
467
|
-
return index != NSNotFound && index != _selectedTabIndex ?
|
|
478
|
+
return index != NSNotFound && index != _selectedTabIndex ? ANNWaitedReadinessUnseen
|
|
468
479
|
: ANNWaitedReadinessContent;
|
|
469
480
|
}
|
|
470
481
|
|
|
@@ -474,12 +485,12 @@ static void ANNStacksOfNode(UIViewController *node, NSMutableArray<ANNStackContr
|
|
|
474
485
|
if (self.nodeHelper.destroyed) {
|
|
475
486
|
return;
|
|
476
487
|
}
|
|
477
|
-
[self renderTabAtIndex:_selectedTabIndex
|
|
488
|
+
[self renderTabAtIndex:_selectedTabIndex unseen:NO];
|
|
478
489
|
switch (_attachMode) {
|
|
479
490
|
case ANNTabsAttachModeTogether:
|
|
480
491
|
for (NSUInteger index = 0; index < _tabs.count; index++) {
|
|
481
492
|
if (index != _selectedTabIndex) {
|
|
482
|
-
[self renderTabAtIndex:index
|
|
493
|
+
[self renderTabAtIndex:index unseen:YES];
|
|
483
494
|
}
|
|
484
495
|
}
|
|
485
496
|
break;
|
|
@@ -561,6 +572,10 @@ static void ANNStacksOfNode(UIViewController *node, NSMutableArray<ANNStackContr
|
|
|
561
572
|
}
|
|
562
573
|
[_longPress detach];
|
|
563
574
|
[self.nodeHelper unregisterNode];
|
|
575
|
+
[_tabsToPark removeAllObjects];
|
|
576
|
+
for (UIViewController *tab in _unseenParking.parkedNodes) {
|
|
577
|
+
[self unparkTab:tab showing:NO];
|
|
578
|
+
}
|
|
564
579
|
for (UIViewController *tab in _tabs) {
|
|
565
580
|
@try {
|
|
566
581
|
[tab destroy];
|
|
@@ -569,7 +584,6 @@ static void ANNStacksOfNode(UIViewController *node, NSMutableArray<ANNStackContr
|
|
|
569
584
|
tab.layoutInfo.componentId ?: @"", exception.reason ?: exception.name);
|
|
570
585
|
}
|
|
571
586
|
}
|
|
572
|
-
[self closePreloadWindow];
|
|
573
587
|
[[self tabsPresenter] tabsWillGo];
|
|
574
588
|
[_components stopAll];
|
|
575
589
|
}
|
|
@@ -591,6 +605,13 @@ static void ANNStacksOfNode(UIViewController *node, NSMutableArray<ANNStackContr
|
|
|
591
605
|
[[self tabsPresenter] barDidLayOutInWindow];
|
|
592
606
|
}
|
|
593
607
|
[[self tabsPresenter] tabsDidLayOut];
|
|
608
|
+
// A tab UIKit shows by a way of its own leaves the parking too.
|
|
609
|
+
UIViewController *shown = self.selectedViewController;
|
|
610
|
+
if (shown && [_unseenParking isParked:shown]) {
|
|
611
|
+
[self unparkTab:shown showing:YES];
|
|
612
|
+
}
|
|
613
|
+
[self layOutParkedTabs];
|
|
614
|
+
[self parkUnseenTabs];
|
|
594
615
|
}
|
|
595
616
|
|
|
596
617
|
- (void)viewWillAppear:(BOOL)animated {
|
|
@@ -598,15 +619,17 @@ static void ANNStacksOfNode(UIViewController *node, NSMutableArray<ANNStackContr
|
|
|
598
619
|
[[self tabsPresenter] tabsDidLayOut];
|
|
599
620
|
}
|
|
600
621
|
|
|
601
|
-
// `afterInitialTab` goes on at the tabs' first appearance at the latest.
|
|
622
|
+
// `afterInitialTab` goes on at the tabs' first appearance at the latest; a dot that waited for the window shows.
|
|
602
623
|
- (void)viewDidAppear:(BOOL)animated {
|
|
603
624
|
[super viewDidAppear:animated];
|
|
604
625
|
[self scheduleChain];
|
|
626
|
+
[[self tabsPresenter] tabsDidAppear];
|
|
605
627
|
}
|
|
606
628
|
|
|
607
|
-
#pragma mark - Rendering
|
|
629
|
+
#pragma mark - Rendering
|
|
608
630
|
|
|
609
|
-
|
|
631
|
+
// A tab renders once. `unseen`: it renders before it shows, and waits in the parking until then.
|
|
632
|
+
- (void)renderTabAtIndex:(NSUInteger)index unseen:(BOOL)unseen {
|
|
610
633
|
if (index >= _tabs.count) {
|
|
611
634
|
return;
|
|
612
635
|
}
|
|
@@ -616,62 +639,202 @@ static void ANNStacksOfNode(UIViewController *node, NSMutableArray<ANNStackContr
|
|
|
616
639
|
}
|
|
617
640
|
[_renderedTabs addObject:tab];
|
|
618
641
|
[tab render];
|
|
619
|
-
if (
|
|
620
|
-
[
|
|
642
|
+
if (unseen) {
|
|
643
|
+
[_tabsToPark addObject:tab];
|
|
644
|
+
[self parkUnseenTabs];
|
|
621
645
|
}
|
|
622
646
|
}
|
|
623
647
|
|
|
624
|
-
// The
|
|
625
|
-
//
|
|
626
|
-
- (void)
|
|
627
|
-
|
|
628
|
-
if (![node isKindOfClass:ANNComponentViewController.class]) {
|
|
648
|
+
// The tabs rendered unseen go into the parking once the tabs' view is in a window, at the back of it and hidden, so
|
|
649
|
+
// that a switch's transition never shows them; the shown tab never, nor a tab with nothing to render (native screens).
|
|
650
|
+
- (void)parkUnseenTabs {
|
|
651
|
+
if (_tabsToPark.count == 0 || !self.viewIfLoaded.window || self.nodeHelper.destroyed) {
|
|
629
652
|
return;
|
|
630
653
|
}
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
654
|
+
UIViewController *shown = self.selectedViewController;
|
|
655
|
+
UIViewController *selected = [self selectedTabNode];
|
|
656
|
+
for (UIViewController *tab in _tabsToPark.allObjects) {
|
|
657
|
+
[_tabsToPark removeObject:tab];
|
|
658
|
+
if (tab == shown || tab == selected || tab.viewIfLoaded.window ||
|
|
659
|
+
[_unseenParking isParked:tab]) {
|
|
660
|
+
continue;
|
|
661
|
+
}
|
|
662
|
+
NSArray<ANNComponentViewController *> *screens = [self unrenderedScreensOfTab:tab];
|
|
663
|
+
if (screens.count == 0) {
|
|
664
|
+
continue;
|
|
665
|
+
}
|
|
666
|
+
[_unseenParking park:tab inView:self.view];
|
|
667
|
+
tab.view.hidden = YES;
|
|
668
|
+
[self layOutParkedTabs];
|
|
669
|
+
[self placeScreensOfParkedTab:tab shownFirst:screens];
|
|
670
|
+
[self unparkTab:tab whenScreensRender:screens];
|
|
635
671
|
}
|
|
636
|
-
|
|
637
|
-
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
// The screens the tab shows first whose content didn't render yet.
|
|
675
|
+
- (NSArray<ANNComponentViewController *> *)unrenderedScreensOfTab:(UIViewController *)tab {
|
|
676
|
+
NSMutableArray<ANNComponentViewController *> *screens = [NSMutableArray new];
|
|
677
|
+
for (UIViewController *node in [tab waitedComponentViewControllers]) {
|
|
678
|
+
if (![node isKindOfClass:ANNComponentViewController.class]) {
|
|
679
|
+
continue;
|
|
680
|
+
}
|
|
681
|
+
ANNComponentViewController *screen = (ANNComponentViewController *)node;
|
|
682
|
+
if (screen.reactView && !screen.reactView.isReady) {
|
|
683
|
+
[screens addObject:screen];
|
|
684
|
+
}
|
|
638
685
|
}
|
|
639
|
-
|
|
686
|
+
return screens;
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
// A parked tab lays out where the shown tab is: beside the sidebar on iPad too.
|
|
690
|
+
- (void)layOutParkedTabs {
|
|
691
|
+
UIView *shownView = self.selectedViewController.viewIfLoaded;
|
|
692
|
+
if (!shownView.window) {
|
|
640
693
|
return;
|
|
641
694
|
}
|
|
642
|
-
[
|
|
695
|
+
CGRect frame = [self.view convertRect:shownView.bounds fromView:shownView];
|
|
696
|
+
for (UIViewController *tab in _unseenParking.parkedNodes) {
|
|
697
|
+
UIView *view = tab.viewIfLoaded;
|
|
698
|
+
if (view && !CGRectEqualToRect(view.frame, frame)) {
|
|
699
|
+
view.frame = frame;
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
// UIKit gives the views of a tab not shown no safe area: the screens on top of its stacks lay out with their place
|
|
705
|
+
// there, measured in the view of what the tabs show (`ANNScreenPlace`), the safe area and bars they get as the tab
|
|
706
|
+
// shows. A screen the tab shows first keeps the place it rendered at until it appears: as the tab shows, UIKit first
|
|
707
|
+
// gives it a part of its safe area (the bar without the status bar). The others (a closed side menu's) keep it until
|
|
708
|
+
// UIKit gives them a safe area of their own.
|
|
709
|
+
- (void)placeScreensOfParkedTab:(UIViewController *)tab
|
|
710
|
+
shownFirst:(NSArray<ANNComponentViewController *> *)shownFirst {
|
|
711
|
+
NSHashTable<ANNComponentViewController *> *placed = [NSHashTable weakObjectsHashTable];
|
|
712
|
+
NSMutableArray<ANNStackController *> *stacks = [NSMutableArray new];
|
|
713
|
+
ANNStacksOfNode(tab, stacks);
|
|
714
|
+
for (ANNStackController *stack in stacks) {
|
|
715
|
+
UIViewController *top = stack.topViewController;
|
|
716
|
+
for (ANNComponentViewController *screen in top ? ANNStackScreensOfEntry(top) : @[]) {
|
|
717
|
+
[self placeScreen:screen
|
|
718
|
+
onTop:top
|
|
719
|
+
ofStack:stack
|
|
720
|
+
ofParkedTab:tab
|
|
721
|
+
kept:[shownFirst containsObject:screen]];
|
|
722
|
+
[placed addObject:screen];
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
for (ANNComponentViewController *screen in shownFirst) {
|
|
726
|
+
if (![placed containsObject:screen]) {
|
|
727
|
+
[self placeScreen:screen onTop:nil ofStack:nil ofParkedTab:tab kept:YES];
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
// The place of one screen of a parked tab: on top of its stack, or a screen of its own. A screen covered since it
|
|
733
|
+
// rendered (a push onto its stack before the tab showed) lays out with its own safe area.
|
|
734
|
+
- (void)placeScreen:(ANNComponentViewController *)screen
|
|
735
|
+
onTop:(nullable UIViewController *)top
|
|
736
|
+
ofStack:(nullable UINavigationController *)stack
|
|
737
|
+
ofParkedTab:(UIViewController *)tab
|
|
738
|
+
kept:(BOOL)kept {
|
|
643
739
|
__weak ANNBottomTabsController *weakSelf = self;
|
|
740
|
+
__weak UIViewController *weakTab = tab;
|
|
644
741
|
__weak ANNComponentViewController *weakScreen = screen;
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
742
|
+
__weak UINavigationController *weakStack = stack;
|
|
743
|
+
__weak UIViewController *weakTop = top;
|
|
744
|
+
BOOL inStack = stack != nil;
|
|
745
|
+
__block ANNScreenPlace *last = nil;
|
|
746
|
+
screen.placeWhileParked = ^ANNScreenPlace * {
|
|
747
|
+
ANNComponentViewController *placed = weakScreen;
|
|
748
|
+
UINavigationController *placedStack = weakStack;
|
|
749
|
+
UIViewController *entry = weakTop;
|
|
750
|
+
if (inStack && (!placedStack || !entry || placedStack.topViewController != entry)) {
|
|
751
|
+
return nil;
|
|
752
|
+
}
|
|
753
|
+
UIView *host = [weakSelf placeHostForTab:weakTab];
|
|
754
|
+
if (!placed || !host) {
|
|
755
|
+
return last;
|
|
756
|
+
}
|
|
757
|
+
ANNScreenPlace *measured =
|
|
758
|
+
inStack ? [ANNScreenPlace placeOfEntry:entry
|
|
759
|
+
inStack:placedStack
|
|
760
|
+
measuredIn:host
|
|
761
|
+
options:[ANNStackOptionsScreen(entry)
|
|
762
|
+
resolveOptionsWithDefault]]
|
|
763
|
+
: [ANNScreenPlace placeOfScreen:placed measuredIn:host];
|
|
764
|
+
if (measured) {
|
|
765
|
+
last = measured;
|
|
766
|
+
}
|
|
767
|
+
return last;
|
|
768
|
+
};
|
|
769
|
+
screen.placeKeptUntilAppearance = kept;
|
|
770
|
+
[screen updateRootLayout];
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
// Where the screens of a tab rendered unseen measure their place: the view of what the tabs show now (UIKit's More
|
|
774
|
+
// navigation too). Nil once the tab itself shows.
|
|
775
|
+
- (nullable UIView *)placeHostForTab:(UIViewController *)tab {
|
|
776
|
+
UIViewController *shown = self.selectedViewController;
|
|
777
|
+
UIView *host = shown.viewIfLoaded;
|
|
778
|
+
UIView *tabView = tab.viewIfLoaded;
|
|
779
|
+
if (!tab || !host.window || shown == tab || [self selectedTabNode] == tab ||
|
|
780
|
+
(tabView && [host isDescendantOfView:tabView])) {
|
|
781
|
+
return nil;
|
|
782
|
+
}
|
|
783
|
+
return host;
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
// The parked tab leaves the parking once every screen it waits for rendered its content, or at the limit.
|
|
787
|
+
- (void)unparkTab:(UIViewController *)tab
|
|
788
|
+
whenScreensRender:(NSArray<ANNComponentViewController *> *)screens {
|
|
789
|
+
__weak ANNBottomTabsController *weakSelf = self;
|
|
790
|
+
__weak UIViewController *weakTab = tab;
|
|
791
|
+
NSHashTable<ANNComponentViewController *> *waited = [NSHashTable weakObjectsHashTable];
|
|
792
|
+
for (ANNComponentViewController *screen in screens) {
|
|
793
|
+
[waited addObject:screen];
|
|
794
|
+
}
|
|
795
|
+
for (ANNComponentViewController *screen in screens) {
|
|
796
|
+
[screen
|
|
797
|
+
setReadyHandler:^{
|
|
798
|
+
for (ANNComponentViewController *other in waited.allObjects) {
|
|
799
|
+
if (other.reactView && !other.reactView.isReady) {
|
|
800
|
+
return;
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
[weakSelf unparkTab:weakTab showing:NO];
|
|
804
|
+
}
|
|
805
|
+
forKey:ANNTabsUnseenKey];
|
|
806
|
+
}
|
|
807
|
+
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(ANNUnseenRenderLimit * NSEC_PER_SEC)),
|
|
650
808
|
dispatch_get_main_queue(), ^{
|
|
651
|
-
[weakSelf
|
|
809
|
+
[weakSelf unparkTab:weakTab showing:NO];
|
|
652
810
|
});
|
|
653
811
|
}
|
|
654
812
|
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
813
|
+
// The tab rendered, is about to show, or the tabs go: it leaves the parking, and UIKit places its view as it shows it.
|
|
814
|
+
// `showing`: it shows in this turn, so UIKit's departure of a tab without a parent (More's, with the tab API) ends
|
|
815
|
+
// here.
|
|
816
|
+
- (void)unparkTab:(UIViewController *)tab showing:(BOOL)showing {
|
|
817
|
+
if (!tab) {
|
|
818
|
+
return;
|
|
659
819
|
}
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
}
|
|
820
|
+
[_tabsToPark removeObject:tab];
|
|
821
|
+
if (![_unseenParking isParked:tab]) {
|
|
822
|
+
return;
|
|
664
823
|
}
|
|
665
|
-
|
|
824
|
+
tab.viewIfLoaded.hidden = NO;
|
|
825
|
+
[_unseenParking unpark:tab endingDeparture:showing && !tab.parentViewController];
|
|
666
826
|
}
|
|
667
827
|
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
828
|
+
+ (BOOL)isInUnseenTab:(UIViewController *)node {
|
|
829
|
+
UIViewController *child = node;
|
|
830
|
+
for (UIViewController *parent = node.layoutParent; parent;
|
|
831
|
+
child = parent, parent = parent.layoutParent) {
|
|
832
|
+
if ([parent isKindOfClass:ANNBottomTabsController.class] &&
|
|
833
|
+
[((ANNBottomTabsController *)parent)->_unseenParking isParked:child]) {
|
|
834
|
+
return YES;
|
|
835
|
+
}
|
|
671
836
|
}
|
|
672
|
-
|
|
673
|
-
[_preloadWindow close];
|
|
674
|
-
_preloadWindow = nil;
|
|
837
|
+
return NO;
|
|
675
838
|
}
|
|
676
839
|
|
|
677
840
|
// `afterInitialTab`: the selected tab's shown screens ready (by their content), then the others one by one.
|
|
@@ -738,7 +901,7 @@ static void ANNStacksOfNode(UIViewController *node, NSMutableArray<ANNStackContr
|
|
|
738
901
|
if (next == NSNotFound) {
|
|
739
902
|
return;
|
|
740
903
|
}
|
|
741
|
-
[self renderTabAtIndex:next
|
|
904
|
+
[self renderTabAtIndex:next unseen:YES];
|
|
742
905
|
__block BOOL stepped = NO;
|
|
743
906
|
__weak ANNBottomTabsController *weakSelf = self;
|
|
744
907
|
dispatch_block_t step = ^{
|
|
@@ -768,8 +931,17 @@ static void ANNStacksOfNode(UIViewController *node, NSMutableArray<ANNStackContr
|
|
|
768
931
|
if (index >= _tabs.count) {
|
|
769
932
|
return;
|
|
770
933
|
}
|
|
771
|
-
[self renderTabAtIndex:index
|
|
934
|
+
[self renderTabAtIndex:index unseen:NO];
|
|
772
935
|
UIViewController *tab = _tabs[index];
|
|
936
|
+
// Its screens rendered unseen measure their place once more while the tab that shows now is still the host: the
|
|
937
|
+
// device may have turned since, or the shown tab laid out again.
|
|
938
|
+
for (UIViewController *node in [tab waitedComponentViewControllers]) {
|
|
939
|
+
if ([node isKindOfClass:ANNComponentViewController.class] &&
|
|
940
|
+
((ANNComponentViewController *)node).placeKeptUntilAppearance) {
|
|
941
|
+
[(ANNComponentViewController *)node updateRootLayout];
|
|
942
|
+
}
|
|
943
|
+
}
|
|
944
|
+
[self unparkTab:tab showing:YES];
|
|
773
945
|
if ([_staleTabs containsObject:tab]) {
|
|
774
946
|
[_staleTabs removeObject:tab];
|
|
775
947
|
[ANNBottomTabsPresenter repaintNode:tab];
|
|
@@ -817,7 +989,7 @@ static void ANNStacksOfNode(UIViewController *node, NSMutableArray<ANNStackContr
|
|
|
817
989
|
if (index >= _tabs.count || self.nodeHelper.destroyed) {
|
|
818
990
|
return NO;
|
|
819
991
|
}
|
|
820
|
-
[self
|
|
992
|
+
[self finishEarlierSelection];
|
|
821
993
|
_pressedIndex = NSNotFound;
|
|
822
994
|
// The release of a long press: UIKit would select the tab under the finger.
|
|
823
995
|
if (source == ANNTabPressSourceBar && index == _longPressedIndex) {
|
|
@@ -957,6 +1129,14 @@ static void ANNStacksOfNode(UIViewController *node, NSMutableArray<ANNStackContr
|
|
|
957
1129
|
[self sendPendingSelected];
|
|
958
1130
|
}
|
|
959
1131
|
|
|
1132
|
+
// Before anything newer on these tabs (a press, a long press, a More pick, a choice from code): a switch still running
|
|
1133
|
+
// ends with its appearances and schedules its `Selected`, and a `Selected` still waiting goes, as Android's
|
|
1134
|
+
// `flushPendingSelected` does.
|
|
1135
|
+
- (void)finishEarlierSelection {
|
|
1136
|
+
[self endSwitch];
|
|
1137
|
+
[self sendPendingSelected];
|
|
1138
|
+
}
|
|
1139
|
+
|
|
960
1140
|
- (void)sendPendingSelected {
|
|
961
1141
|
if (!_hasPendingSelected) {
|
|
962
1142
|
return;
|
|
@@ -980,8 +1160,8 @@ static void ANNStacksOfNode(UIViewController *node, NSMutableArray<ANNStackContr
|
|
|
980
1160
|
if (index >= _tabs.count || self.nodeHelper.destroyed) {
|
|
981
1161
|
return;
|
|
982
1162
|
}
|
|
983
|
-
// A pending `Selected`
|
|
984
|
-
[self
|
|
1163
|
+
// A running switch and a pending `Selected` go before the event of a later press.
|
|
1164
|
+
[self finishEarlierSelection];
|
|
985
1165
|
if (marksSelection) {
|
|
986
1166
|
_longPressedIndex = index;
|
|
987
1167
|
}
|
|
@@ -1024,7 +1204,7 @@ static void ANNStacksOfNode(UIViewController *node, NSMutableArray<ANNStackContr
|
|
|
1024
1204
|
// first, then UIKit's, then the state at once.
|
|
1025
1205
|
- (void)selectTabFromCode:(NSUInteger)index {
|
|
1026
1206
|
ANNAssertMainQueue();
|
|
1027
|
-
[self
|
|
1207
|
+
[self finishEarlierSelection];
|
|
1028
1208
|
_pressedIndex = NSNotFound;
|
|
1029
1209
|
if (index == _selectedTabIndex || index >= _tabs.count || self.nodeHelper.destroyed) {
|
|
1030
1210
|
return;
|
|
@@ -1235,7 +1415,7 @@ static void ANNStacksOfNode(UIViewController *node, NSMutableArray<ANNStackContr
|
|
|
1235
1415
|
if (pick && index == _selectedTabIndex) {
|
|
1236
1416
|
return;
|
|
1237
1417
|
}
|
|
1238
|
-
[self
|
|
1418
|
+
[self finishEarlierSelection];
|
|
1239
1419
|
_pressedIndex = NSNotFound;
|
|
1240
1420
|
if (pick) {
|
|
1241
1421
|
[self sendPressedOfTabAtIndex:index wasSelected:NO];
|
|
@@ -126,8 +126,13 @@ static const CGFloat ANNWideRowMargin = 16;
|
|
|
126
126
|
if (self.superview != host) {
|
|
127
127
|
[host addSubview:self];
|
|
128
128
|
}
|
|
129
|
-
|
|
130
|
-
|
|
129
|
+
if (host.subviews.lastObject != self) {
|
|
130
|
+
[host bringSubviewToFront:self];
|
|
131
|
+
}
|
|
132
|
+
// The system bar keeps its place and shows nothing; UIKit makes its subviews anew on a size change. Not the bar's
|
|
133
|
+
// `alpha`: UIKit puts it back to 1 when the bar shows, on a pop with `hidesBottomBarWhenPushed`, and on iOS 27 on
|
|
134
|
+
// a rotation and a theme change, after the tabs' layout (a check here misses it); alpha 0 also drops the system's
|
|
135
|
+
// soft fade at the bottom.
|
|
131
136
|
for (UIView *subview in bar.subviews) {
|
|
132
137
|
if (!subview.hidden) {
|
|
133
138
|
subview.hidden = YES;
|
|
@@ -193,6 +198,7 @@ static const CGFloat ANNWideRowMargin = 16;
|
|
|
193
198
|
extra = MAX(0, CGRectGetMinY(barFrame) - CGRectGetMinY(frame));
|
|
194
199
|
}
|
|
195
200
|
BOOL hidden = wide ? _hiddenByOptions : (tabs.barHidden || bar.hidden);
|
|
201
|
+
// A new size lays the cells out again by itself; the same frame changes nothing.
|
|
196
202
|
if (!CGRectEqualToRect(self.frame, frame)) {
|
|
197
203
|
self.frame = frame;
|
|
198
204
|
}
|
|
@@ -203,7 +209,6 @@ static const CGFloat ANNWideRowMargin = 16;
|
|
|
203
209
|
_background.layer.cornerRadius = radius;
|
|
204
210
|
}
|
|
205
211
|
[self setExtraSafeArea:hidden ? 0 : extra];
|
|
206
|
-
[self setNeedsLayout];
|
|
207
212
|
}
|
|
208
213
|
|
|
209
214
|
- (void)setHiddenByOptions:(BOOL)hiddenByOptions {
|
|
@@ -10,8 +10,8 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
10
10
|
/// `ANNBottomTabsController`.
|
|
11
11
|
@interface ANNBottomTabsPresenter : ANNNodePresenter
|
|
12
12
|
|
|
13
|
-
/// The repaint of a node the repaint pass left (a tab not in a window)
|
|
14
|
-
/// resolved options.
|
|
13
|
+
/// The repaint of a node the repaint pass left (a tab not in a window), as it is about to show: the nodes of its
|
|
14
|
+
/// subtree whose views are in its view (what shows with it), children first, with their resolved options.
|
|
15
15
|
+ (void)repaintNode:(UIViewController *)node;
|
|
16
16
|
|
|
17
17
|
#pragma mark - Creation, in this order
|
|
@@ -55,6 +55,10 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
55
55
|
/// The tabs laid out (and before they appear): the dots, the buttons' `testID`s, the custom row.
|
|
56
56
|
- (void)tabsDidLayOut;
|
|
57
57
|
|
|
58
|
+
/// The tabs appeared, in a window: a dot set while they were out of it (under a modal over the whole screen) is
|
|
59
|
+
/// placed now, as no layout may follow.
|
|
60
|
+
- (void)tabsDidAppear;
|
|
61
|
+
|
|
58
62
|
/// The bar laid out in a window for the first time: the titles are set again, so that the bar measures them at their
|
|
59
63
|
/// real place.
|
|
60
64
|
- (void)barDidLayOutInWindow;
|