Skip to content
CAI
Software that uses CAICheck a score

yysskk/SwipeMenuViewController

61.3

Adequate · 1 October 2026

2.5k

lines of production code

Swift

primary language

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a Swift UI library providing a swipeable tab bar and horizontally paging content container for both UIKit and SwiftUI applications. It offers customizable tab styles, selection indicators, and synchronized paging behavior, with a dedicated SwiftUI component available for iOS 18+. The project has migrated to a Swift Package Manager distribution model, requiring iOS 16+ and Swift 6, and includes a programmatic example app to demonstrate its capabilities.

How it got here

2017 — Swift Package Manager migration

7 changes.

The project migrated its distribution model to Swift Package Manager only, removing legacy CocoaPods and Carthage support along with associated Xcode project and workspace files. The library was updated to require iOS 16+ and Swift 6, introducing SwiftUI support and modernizing APIs. The example application was also rewritten to use programmatic UIKit and modern iOS lifecycle management.

2020–2026 — SwiftUI integration and modernization

5 changes.

The project introduced SwipeMenuViewController, a new container for swipeable tab bars, alongside a corresponding SwiftUI component and a rewritten programmatic example app. This period focused on expanding platform support by adding Swift Package Manager compatibility, enforcing Swift 6 language mode, and establishing a comprehensive unit test suite using the Swift Testing framework.

Features

Add SwiftUI SwipeMenu component

Introduces a new SwiftUI \SwipeMenu\ view (iOS 18+) that provides a scrollable tab bar above a horizontally paging content area, mirroring the existing UIKit \SwipeMenuView\. The component supports flexible and segmented tab styles, customizable selection indicators (underline, circle, or none), and continuous color interpolation for tab titles during swipes. It exposes \onWillChangeIndex\ and \onDidChangeIndex\ callbacks to track page changes, ensuring that if a user drag interrupts a programmatic scroll, the callbacks report the page where the content actually landed rather than the intended destination.

Sources/SwipeMenuViewController/SwiftUI · high confidence

Introduce SwipeMenuViewController with customizable tab bar and paging content

This release introduces SwipeMenuViewController, a container view controller that manages a swipeable tab bar and horizontally paging content area. It automatically synchronizes with child view controllers by default, but also supports fully custom paging via the SwipeMenuViewDataSource protocol. The component includes SwipeMenuViewOptions for configuring tab styles (flexible or segmented), selection indicators (underline or circle), safe-area behavior, and multi-line titles. The implementation is main-actor-isolated for thread safety and includes fixes for tab indicator artifacts, safe-area inset handling, and duplicate page view stacking during reloads.

Sources/SwipeMenuViewController · high confidence

Removals

Removed Xcode project file

The SwipeMenuViewController.xcodeproj file has been deleted, indicating the removal of the legacy Xcode project structure from the repository. This change aligns with the project's migration to a standard Swift Package Manager (SPM) layout, as referenced in the commit history, and removes the old CocoaPods/Carthage-compatible project configuration.

SwipeMenuViewController.xcodeproj · high confidence

Removed legacy iOS framework support files

The \Info.plist\ and \SwipeMenuViewController.h\ files for the iOS framework have been removed. This cleanup aligns with the project's shift to a standard Swift Package Manager layout, eliminating the legacy Objective-C header and bundle configuration that are no longer required.

Sources/Supporting files · high confidence

Removed user-specific Xcode scheme files

The Xcode project configuration no longer includes user-specific scheme definitions for the Example app and the SwipeMenuViewController framework. These personal workspace settings, which previously controlled build, test, and launch actions for the developer 'a14764', have been deleted to keep the repository free of local IDE state.

SwipeMenuViewController.xcodeproj/xcuserdata · high confidence

Behavioural changes

Example app rewritten in programmatic UIKit with a SwiftUI counterpart

The Example app has been rebuilt as a standalone Xcode project using programmatic UIKit, replacing the previous implementation. It now features a \MenuViewController\ that demonstrates the \SwipeMenuViewController\ with floating Liquid Glass buttons for accessing options and a SwiftUI demo. The options editor (\OptionsViewController\) allows live adjustment of settings like page count, style, and decoration, which are applied via \reloadData\. A parallel SwiftUI implementation (\SwiftUIMenuView\ and \SwiftUIOptionsView\) provides the same demo using the \SwipeMenu\ component and declarative state management. The shared configuration logic is centralized in \SwipeMenuSettings\, which includes unit tests for both UIKit and SwiftUI option mapping.

Example/Example · high confidence

Rebuilt example app with programmatic UIKit and modern iOS lifecycle

The Example app has been rewritten from a storyboard-based setup to a standalone, programmatic UIKit project using the \UIWindowScene\ lifecycle. This migration removes the traditional \AppDelegate\ and \ViewController\ boilerplate in favor of a \SceneDelegate\, updates the deployment target to iOS 26.0, and adopts Swift 6.0 with modern concurrency settings. The app now demonstrates \SwipeMenuViewController\ and \SwipeMenu\ (SwiftUI) with live option tweaking, and the Xcode project is generated via XcodeGen from \project.yml\ rather than being committed directly.

Example · high confidence

Removed Xcode workspace file

The SwipeMenuViewController.xcworkspace file has been deleted, removing the workspace configuration that previously referenced the SwipeMenuViewController.xcodeproj. This aligns with the project's shift to a standard Swift Package Manager layout, eliminating the need for a separate workspace container.

SwipeMenuViewController.xcworkspace · high confidence

Removed legacy LaunchScreen and Main storyboards

The example application no longer uses the \LaunchScreen.storyboard\ and \Main.storyboard\ files for its initial interface. These files have been deleted, indicating that the app's launch screen and main view controller are now defined programmatically or via other means rather than Interface Builder storyboards.

Example/Base.lproj · high confidence

SwipeMenuViewController 5.0.0: Swift 6, iOS 16+, SPM-only, and SwiftUI support

This release updates the library to require iOS 16+ and Swift 6.2, distributing exclusively via Swift Package Manager (CocoaPods/Carthage support removed). It introduces a new SwiftUI \SwipeMenu\ component for iOS 18+, adds configuration options for selected tab fonts, multi-line titles, and rounded underline corners, and fixes several bugs including indicator misalignment, safe-area handling, and duplicate page views on reload. Existing APIs using 'addition' terminology have been renamed to 'indicator' to match UIKit conventions.

(repo-wide) · high confidence

Test coverage

Add Swift Testing unit test suite for SwipeMenuViewController

Added a comprehensive unit test suite using the Swift Testing framework to verify the behavior of the SwipeMenuViewController library. The tests cover ContentScrollView page setup and reloading, SwipeMenuView geometry calculations and indicator positioning, option defaults and Sendability, delegate callback pairing during jumps, and memory management (retain cycles).

Tests · high confidence

Dependencies

Add Swift Package Manager support with iOS 16 requirement

The library is now available via Swift Package Manager through a new Package.swift manifest. This integration requires iOS 16.0 or later and configures the main target and its test suite to use Swift 6 language mode with default MainActor isolation.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 62 → 61 (-1.1)
  • Rubric changed (rubric-2026.09.11 → rubric-2026.09.18) — scores are not directly comparable.

Lenses

  • Code Health 99 → 99 (+0.0)
  • Architecture 85 → 96 (+11.2)
  • Maturity 66 → 66 (+0.0)
  • Readiness 67 → 62 (-4.8)
  • Security 50 → 50 (+0.0)

Resolved (2)

  • Dependency hygiene PARTLY measured — SwiftPM pinning read, dependency currency NOT established
  • Documentation: no usage examples (README.md)

New (7)

  • Coverage not measured — Swift suite
  • Duplicate delegate methods. SwipeMenuViewController implements SwipeMenuViewDelegate methods directly, but SwipeMenuView also has a delegate property of type SwipeMenuViewDelegate. This suggests that SwipeMenuViewController is acting as its own delegate, or that the delegate pattern is duplicated between the ViewController and the View.
  • Inconsistent naming and parameter semantics for reload operations. SwipeMenuView uses 'isOrientationChange' to trigger a specific reload behavior, while TabView uses 'animated'. The parameter names do not reflect the same intent (state change vs UI animation), and the types of the 'options' parameter differ (SwipeMenuViewOptions vs TabView), suggesting duplicated configuration logic.
  • Inconsistent naming and return types for view/controller retrieval. 'viewControllerForPageAt' returns a UIViewController, while 'viewForPageAt' returns a UIView?. The naming 'viewForPageAt' in the context of a ContentScrollView that likely manages view controllers is confusing. Also, one is optional, one is not.
  • Inconsistent naming for data source methods. 'numberOfPages' is used for ContentScrollView, while 'numberOfItems' is used for TabView. These are conceptually the same operation (providing the count of elements in a collection).
  • Inconsistent naming for title retrieval. 'titleForPageAt' vs 'titleForItemAt'. Also, the return types differ: one is non-optional String, the other is optional String?. This creates inconsistency in how the API handles missing titles.
  • While the signatures are identical, these methods operate on different layers of the UI hierarchy (TabView vs ContentScrollView). However, the naming 'jump' is non-standard for iOS/Swift UI components (typically 'scrollTo', 'select', or 'setSelectedIndex'). More importantly, SwipeMenuView also exposes 'currentIndex' property, but lacks a 'selectedIndex' setter, creating ambiguity on how to programmatically change the view.

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

yysskk/SwipeMenuViewController was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 1 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 5bb15922af5cb7559f3cbfef9e12ed4557c0d550 — the exact code this score is about.
  • Scored under rubric-2026.09.18 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-e569280dd5e2.