WenchaoD/FSPagerView
FSPagerView is an elegant Screen Slide Library. It is extremely helpful for making Banner View、Product Show、Welcome/Guide Pages、Screen/ViewController Sliders.
Stale — last commit 1y ago
worst of 4 axeslast commit was 1y ago; no tests detected…
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
last commit was 1y ago; no CI workflows detected
- ✓10 active contributors
- ✓MIT licensed
- ⚠Stale — last commit 1y ago
Show 3 more →Show less
- ⚠Single-maintainer risk — top contributor 89% of recent commits
- ⚠No CI workflows detected
- ⚠No test directory detected
What would change the summary?
- →Use as dependency Mixed → Healthy if: 1 commit in the last 365 days; add a test suite
- →Deploy as-is Mixed → Healthy if: 1 commit in the last 180 days
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Forkable" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/wenchaod/fspagerview)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/wenchaod/fspagerview on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: WenchaoD/FSPagerView
Generated by RepoPilot · 2026-05-10 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/WenchaoD/FSPagerView shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
WAIT — Stale — last commit 1y ago
- 10 active contributors
- MIT licensed
- ⚠ Stale — last commit 1y ago
- ⚠ Single-maintainer risk — top contributor 89% of recent commits
- ⚠ No CI workflows detected
- ⚠ No test directory detected
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live WenchaoD/FSPagerView
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/WenchaoD/FSPagerView.
What it runs against: a local clone of WenchaoD/FSPagerView — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in WenchaoD/FSPagerView | Confirms the artifact applies here, not a fork |
| 2 | License is still MIT | Catches relicense before you depend on it |
| 3 | Default branch master exists | Catches branch renames |
| 4 | Last commit ≤ 523 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of WenchaoD/FSPagerView. If you don't
# have one yet, run these first:
#
# git clone https://github.com/WenchaoD/FSPagerView.git
# cd FSPagerView
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of WenchaoD/FSPagerView and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "WenchaoD/FSPagerView(\\.git)?\\b" \\
&& ok "origin remote is WenchaoD/FSPagerView" \\
|| miss "origin remote is not WenchaoD/FSPagerView (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(MIT)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"MIT\"" package.json 2>/dev/null) \\
&& ok "license is MIT" \\
|| miss "license drift — was MIT at generation time"
# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
&& ok "default branch master exists" \\
|| miss "default branch master no longer exists"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 523 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~493d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/WenchaoD/FSPagerView"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
FSPagerView is a UICollectionView-based screen pagination library for iOS/tvOS that enables infinite, automatically-scrolling carousel views with rich 3D transformers and fully customizable page controls. It solves the problem of building polished banner sliders, product showcases, and onboarding flows without managing complex scroll view logic or state synchronization. Dual-structure monorepo: FSPagerView/ contains the core library code (Objective-C & Swift implementations sharing UICollectionView base), while FSPageViewExample-Swift/ and FSPagerViewExample-Objc/ are separate example projects demonstrating banner, transformer, and page-control patterns. The library is packaged as a CocoaPod and SPM package (.swiftpm/xcode/).
👥Who it's for
iOS app developers (Swift & Objective-C) who need production-ready carousel components for marketing banners, product galleries, and guided onboarding experiences without building UICollectionView pagination from scratch.
🌱Maturity & risk
This is a mature, production-ready library. It supports Swift 5.0+ and Objective-C, has CocoaPods/Carthage/SPM package manager support, includes two full example projects (Swift and Objc), and shows active maintenance with cross-platform compatibility (iOS & tvOS). The extensive feature set (infinite scrolling, auto-sliding, 3D transformers, customizable page controls) and polished API suggest solid real-world usage.
Single-maintainer repo (WenchaoD) with no visible CI/CD pipeline, test suite, or GitHub Actions in the file structure—maintenance risk if the creator becomes unavailable. No obvious breaking-change log or semantic versioning strategy visible. Dependency on UICollectionView internals means iOS API changes could require updates, though the core architecture is stable.
Active areas of work
Based on file structure, active development includes both Swift and Objective-C implementations with example coverage of basic banners, transformer animations, and page controls. The presence of .swiftpm/ suggests recent SPM support was added. No recent commit log visible in provided data, so active maintenance status is unclear.
🚀Get running
Clone the repo and open either example project:
git clone https://github.com/WenchaoD/FSPagerView.git
cd FSPagerView/FSPageViewExample-Swift
open FSPagerViewExample.xcodeproj
Or install via CocoaPods: pod 'FSPagerView'
Daily commands: For Swift example:
cd FSPageViewExample-Swift
open FSPagerViewExample.xcodeproj
# Build & run in Xcode (⌘R)
For Objective-C example:
cd FSPagerViewExample-Objc
open FSPagerViewExample-Objc.xcodeproj
# Build & run in Xcode (⌘R)
🗺️Map of the codebase
- FSPagerView/FSPagerView/FSPagerView.h: Objective-C header exposing the primary public API; essential for understanding protocol contracts and configuration properties
- FSPageViewExample-Swift/FSPagerViewExample/BasicExampleViewController.swift: Reference implementation for basic infinite banner scrolling with auto-slide timer—best starting point for understanding real usage
- FSPageViewExample-Swift/FSPagerViewExample/TransformerExampleViewController.swift: Demonstrates the 3D transformer system and CATransform3D effects; critical for advanced customization
- FSPageViewExample-Swift/FSPagerViewExample/PageControlExampleViewController.swift: Shows how to integrate and customize the page control indicator UI alongside the pager view
- FSPagerView.podspec: Defines the library's CocoaPods distribution, version, dependencies, and supported platforms (iOS 8.0+, tvOS 9.0+)
🛠️How to make changes
For new carousel features: Edit FSPagerView/FSPagerView/ (core UICollectionView logic). For transformers: Look in example ViewControllers' TransformerExampleViewController.swift/h for 3D effect patterns. For page controls: Study PageControlExampleViewController.swift/h to see customization hooks. To add features: Start by duplicating a transformer or example VC, then modify the core library's delegate/datasource methods.
🪤Traps & gotchas
No visible test suite in the file list—QA relies on manual testing via example projects. UICollectionView internals dependency: Relying heavily on UICollectionView's scrolling and layout APIs means iOS version updates could break edge cases (e.g., scroll deceleration logic). Infinite scrolling math: Duplicating cells via modulo requires careful datasource logic; off-by-one errors can break pagination. Page control state sync: Manually syncing FSPageControl indicator position with scroll offset is error-prone if automatic scroll logic changes. No explicit Objective-C nullability annotations visible—could cause Swift interop warnings.
💡Concepts to learn
- Infinite Scrolling via Modulo Arithmetic — FSPagerView's core trick for seamless looping—understanding modulo wrapping of cell indices is essential to avoid off-by-one bugs and to customize pagination behavior
- UICollectionView Cell Reuse & IndexPath Mapping — FSPagerView delegates cell configuration to datasource—misunderstanding reuse pools or IndexPath math causes visual glitches and memory leaks in large carousels
- CATransform3D & 3D Affine Transforms — The transformer system applies perspective and rotation matrices to cells during scroll—reading the perspective matrices in TransformerExampleViewController requires understanding 3D graphics transforms
- UIScrollView Deceleration Distance & Paging Boundaries — FSPagerView's
decelerationDistanceproperty controls multi-cell momentum scrolling—understanding scroll deceleration curves is key to tuning swipe-to-next behavior - Timer-based Auto-Scroll with Invalidation Patterns — The
automaticSlidingIntervalfeature uses NSTimer scheduling—understanding timer lifecycle and deallocation prevents memory leaks in carousel implementations - Swift-Objective-C Interoperability (Bridging Headers) — FSPagerView maintains both Swift and Objc implementations in a single package—the
.hheader and bridging patterns are critical when integrating into mixed-language codebases
🔗Related repos
nicklockwood/iCarousel— Predecessor carousel library for iOS; inspired many pagination patterns but FSPagerView modernizes the approach using UICollectionView instead of custom scroll logicAlamofire/Alamofire— Not directly related but commonly paired with FSPagerView in real apps for async image loading in banner cellsonevcat/Kingfisher— Image caching library frequently used in FSPagerView examples to load remote banner images efficientlyesnoeohc/CHIPageControl— Alternative page control library; often compared with FSPagerView's built-in customizable page control for design flexibilitylkzhao/Hero— Shared element transition library often paired with FSPagerView for animated page-to-detail-screen transitions in product showcases
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add unit tests for FSPagerView core functionality
The repo has UI test files (FSPagerViewExampleUITests.swift, FSPagerViewExample_ObjcUITests.swift) but lacks unit tests for the core FSPagerView library itself. Testing scroll behavior, data source methods, transformer calculations, and page control synchronization would improve reliability and prevent regressions.
- [ ] Create FSPagerView/FSPagerViewTests/ directory with XCTestCase subclasses
- [ ] Add tests for FSPagerView scroll delegate methods (e.g., scrollViewDidScroll, scrollViewWillEndDragging)
- [ ] Add tests for FSPagerViewDataSource methods (cellForItemAt, numberOfItems)
- [ ] Add tests for FSPagerViewTransformer calculations and visual transformations
- [ ] Add tests for FSPageControl synchronization with FSPagerView page changes
- [ ] Integrate test target into FSPagerView.xcodeproj and set up scheme
Add GitHub Actions CI workflow for Swift Package Manager validation
The repo supports SPM (Package.swift exists) but has no CI pipeline to validate Swift builds across iOS versions. This prevents catching breaking changes early and ensures SPM users have confidence in the package.
- [ ] Create .github/workflows/spm-build.yml GitHub Action workflow
- [ ] Configure matrix to test against multiple Swift versions (5.0+) and iOS deployment targets
- [ ] Add build step: swift build for the FSPagerView SPM package
- [ ] Add test step: swift test if unit tests are added (see PR #1)
- [ ] Document in README.md that CI passing ensures SPM compatibility
Create comprehensive API documentation for FSPagerViewTransformer subclasses
TransformerExampleViewController.swift exists in both examples but there's no dedicated documentation explaining how to create custom transformers or the built-in transformer options. Users need clear examples of transformer usage, timing, and customization.
- [ ] Create TRANSFORMERS.md documenting all built-in FSPagerViewTransformer subclasses
- [ ] Add code examples for each transformer type (ScaleTransformer, RotationTransformer, etc.)
- [ ] Document the FSPagerViewTransformer protocol and required methods (transform(attr:) signature)
- [ ] Add a 'Creating Custom Transformers' section with a step-by-step example
- [ ] Link TRANSFORMERS.md from main README.md and update the TransformerExampleViewController comments to reference it
🌿Good first issues
- Add unit tests for infinite scrolling math (modulo wrapping, edge cases at start/end)—test file would live in a new
FSPagerViewTests/directory with XCTest covering the core pagination logic used by both example projects - Document the transformer API with code snippets showing how to chain CATransform3D effects—add a new Transformers.md guide explaining the pattern used in
TransformerExampleViewController.swift - Add tvOS-specific example (gesture handling, focus engine integration)—create a new
TransformerExampleViewControllervariant in the Swift example that uses UIKit focus-based navigation instead of gesture recognizers
⭐Top contributors
Click to expand
Top contributors
- @WenchaoD — 89 commits
- @sereivoanyong — 2 commits
- @brennoumobi — 2 commits
- @esikmalazman — 1 commits
- @abhi21git — 1 commits
📝Recent commits
Click to expand
Recent commits
f90ab7d— Merge pull request #379 from esikmalazman/swift-5 (WenchaoD)38311f3— Fix add dependecies via SPM error by explicit state the swift lang version (esikmalazman)968f0aa— Merge pull request #340 from abhi21git/master (WenchaoD)a8c14cf— Update Package.swift (abhi21git)3acbd3e— Merge pull request #313 from sereivoanyong/master (WenchaoD)0560602— Increase swift-tools-version to 5.4 (sereivoanyong)1c2aaef— Merge pull request #298 from brennobemoura/master (WenchaoD)977ac1f— Removed swiftLanguageVersions (brennoumobi)a67e26d— Fix iOS minimum version (brennoumobi)fba5e9e— Merge pull request #293 from dirtmelon/patch-1 (WenchaoD)
🔒Security observations
FSPagerView is a UI library with relatively low security risk. The codebase shows no obvious injection vulnerabilities, hardcoded secrets, or dangerous API usage patterns based on the file structure analysis. Primary concerns are minor: incomplete version control exclusions (xcuserdata files) and inability to assess dependencies without examining Package.swift content. The project follows standard iOS library practices. Recommendations focus on hygiene rather than critical security issues.
- Low · User data stored in Xcode user data directory —
FSPagerViewExample-Objc/FSPagerViewExample-Objc.xcodeproj/xcuserdata/. The repository contains xcuserdata files (FSPagerViewExample-Objc/.xcodeproj/xcuserdata/) which may contain local user-specific build settings, breakpoints, and other metadata. While typically not sensitive, these should be excluded from version control. Fix: Add xcuserdata/ to .gitignore to prevent committing user-specific Xcode data - Low · Missing dependency vulnerability information —
Package.swift. The Package.swift file content was not provided in the analysis. Without examining the declared dependencies, potential transitive vulnerabilities cannot be assessed. Fix: Review Package.swift dependencies for known vulnerabilities using tools like Swift Package Manager audit or GitHub dependency scanning - Low · Incomplete .gitignore coverage —
.gitignore. While a .gitignore file exists, the specific rules are not visible. Xcode projects typically require additional exclusions for build artifacts and derived data. Fix: Ensure .gitignore includes: *.xcworkspace/xcuserdata/, DerivedData/, .build/, *.playground, and other Xcode build artifacts
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.