Skip to content

Conversation

@NathanWalker
Copy link
Contributor

@NathanWalker NathanWalker commented Nov 6, 2025

Introduces a new SplitView component, enabling advanced multi-column layouts (primary, secondary, supplementary, inspector) for applications, with full support for iOS split view layouts.

ns-splitview-ios.mov

Overview

SplitView is a container coordinating up to four column roles backed by native UISplitViewController columns:

Role iOS Column Purpose
primary Primary Main navigation/content root (eg list)
secondary Secondary Detail/content view for selected item
supplementary Supplementary Additional contextual view (eg filters)
inspector Inspector Optional tools/inspector panel (iOS 17+ triple column style or when available)

Each role is provided by a child Frame (or any controller-backed view). Frames push their own Pages independently while remaining embedded inside the SplitView layout.

Instantiation

You can use declarative markup as an example:

<SplitView displayMode="twoBesideSecondary" splitBehavior="tile"
           preferredPrimaryColumnWidthFraction="0.25"
           preferredSupplementaryColumnWidthFraction="0.33"
           preferredInspectorColumnWidthFraction="0.20">
  <Frame splitRole="primary"    defaultPage="..." />
  <Frame splitRole="secondary"  defaultPage="..." />
  <Frame splitRole="supplementary" defaultPage="..." />
  <Frame splitRole="inspector"  defaultPage="..." />
</SplitView>

Programmatic creation:

import { SplitView } from '@nativescript/core';
const sv = new SplitView();
// add child Frames with set splitRole property before adding to SplitView

Static Members

  • SplitView.getInstance(): SplitViewBase | null – Returns the last created SplitView instance (singleton convenience), or null if none.
  • SplitView.SplitStyle (from common) – Determines double vs triple column style. iOS mapping selects UISplitViewControllerStyle.DoubleColumn or TripleColumn.

Properties (from common + iOS behavior)

  • displayMode: string – Maps to UISplitViewController.preferredDisplayMode.
    • Accepted values: automatic, secondaryOnly, oneBesideSecondary, oneOverSecondary, twoBesideSecondary, twoOverSecondary, twoDisplaceSecondary.
  • splitBehavior: string – iOS 14+ only. Maps to preferredSplitBehavior.
    • Values: automatic, tile, overlay, displace.
  • preferredPrimaryColumnWidthFraction: number – Fractional width (0–1) for primary column.
  • preferredSupplementaryColumnWidthFraction: number – Fraction for supplementary column (applies in triple style).
  • preferredInspectorColumnWidthFraction: number – Fraction for inspector column (SDK / OS version gated; only applied when available).
  • inspectorShowing: boolean (readonly state) – Internal flag tracking visibility of inspector column.

Role Assignment

Children declare a role using splitRole="primary|secondary|supplementary|inspector". If omitted, order of addition is used as fallback.

Methods

  • showPrimary() / hidePrimary() – Show/hide primary column.
  • showSecondary() / hideSecondary() – Show/hide secondary column.
  • showSupplementary() – Shows supplementary column (no explicit hide; hiding handled by displayMode changes).
  • showInspector() / hideInspector() – Toggle inspector column if supported (feature detection via preferredInspectorColumnWidthFraction property presence on native controller).
  • onSecondaryViewCollapsed(secondaryVC, primaryVC) – Hook invoked when system collapses secondary onto primary (e.g., trait/environment changes). Override for custom behavior.
  • onRoleChanged(view, oldRole, newRole) – Internal: invoked when a child view's role property changes; rebinds controllers.

Events

  • inspectorChange – Fired when inspector column visibility changes.
    • Payload: { showing: boolean } under data property on the event args.
    • Usage:
      splitView.on('inspectorChange', (args) => {
        console.log('Inspector visible?', args.data.showing);
      });

Version / Platform Considerations

  • splitBehavior requires iOS 14+.
  • Inspector column support requires iOS 17+

Minimal Usage Example

<SplitView displayMode="twoBesideSecondary" splitBehavior="tile"
           preferredPrimaryColumnWidthFraction="0.25"
           preferredSupplementaryColumnWidthFraction="0.33"
           preferredInspectorColumnWidthFraction="0.20">
  <Frame splitRole="primary" defaultPage="pages/master" />
  <Frame splitRole="secondary" defaultPage="pages/detail" />
  <Frame splitRole="supplementary" defaultPage="pages/context" />
  <Frame splitRole="inspector" defaultPage="pages/inspector" />
</SplitView>

Programmatic Event Hook

splitView.on('inspectorChange', ({ data }) => {
  if (data.showing) {
    console.log('Inspector opened');
  } else {
    console.log('Inspector closed');
  }
});

@NathanWalker NathanWalker added this to the 9.0 milestone Nov 6, 2025
@nx-cloud
Copy link

nx-cloud bot commented Nov 6, 2025

View your CI Pipeline Execution ↗ for commit 0bd09f3

Command Status Duration Result
nx test apps-automated -c=android ✅ Succeeded 5m 11s View ↗
nx run-many --target=test --configuration=ci --... ✅ Succeeded 3s View ↗

☁️ Nx Cloud last updated this comment at 2025-11-07 03:24:52 UTC

@NathanWalker NathanWalker requested a review from Copilot November 6, 2025 19:42
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR introduces a new SplitView component that wraps iOS's UISplitViewController to provide multi-column layouts (primary/secondary/supplementary/inspector). The implementation includes common base classes, iOS-specific functionality, an Android stub, and supporting changes to the Frame navigation system and ListView to enable sectioned item events.

Key changes:

  • New SplitView component with support for up to 4 columns (primary, secondary, supplementary, inspector)
  • Frame navigation delegate enhancements to emit viewControllerShown events
  • ListView section index support added to ItemEventData

Reviewed Changes

Copilot reviewed 18 out of 21 changed files in this pull request and generated 7 comments.

Show a summary per file
File Description
packages/core/ui/split-view/split-view-common.ts Base class defining SplitView types, properties, and common behavior
packages/core/ui/split-view/index.ios.ts iOS implementation using UISplitViewController with column management
packages/core/ui/split-view/index.android.ts Android stub implementation (no native split view support)
packages/core/ui/split-view/index.d.ts TypeScript type definitions
packages/core/ui/frame/index.ios.ts Added navigation controller delegates to emit viewControllerShown events
packages/core/ui/list-view/index.ios.ts Added section field to item events
packages/core/ui/list-view/index.d.ts Updated ItemEventData interface with optional section property
packages/core/ui/index.ts Exported SplitView component
apps/toolbox/src/* Demo app implementation showing SplitView usage
package-lock.json Dependency updates with peer flags added

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@NathanWalker NathanWalker merged commit 8b6c6eb into main Nov 7, 2025
5 of 6 checks passed
@NathanWalker NathanWalker deleted the feat/split-view branch November 7, 2025 03:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants