Library / SDK
ChenYilong/CYLTabBarController avatar
ChenYilong/CYLTabBarController

CYLTabBarController: a UITabBar subclass you can restyle from Swift or Objective-C

An iOS UI module library for adding animation to iOS tab bar items and icons using Lottie and Liquid Glass, with support for a larger center tab bar item with a plus icon, built-in red-dot badges and dynamic refresh. Tested on iOS 27, Dark Mode and iPhone 17.

7,038 stars1,456 forksSwiftMIT

At a glance

What is it?
A 7,000 star Chinese iOS library that replaces the system tab bar with a custom one carrying a larger center button, Lottie driven icons and badge dots, plus a Liquid Glass path that claims to avoid private APIs.
Who is it for?
CYLTabBarController is worth a look when your app needs a tab bar the system one cannot express, mainly a center button that sits above the bar or per-item Lottie animation, and it is honest about being one class you subclass and configure rather than a drop-in replacement for UITabBarController.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 12 days ago.
What is it written in?
Mainly Swift, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 11, 2026, and from our analysis. They are not legal advice.

Editorial analysis

One UITabBar subclass, configured rather than replaced

The core of the library is small in concept and large in surface area: you subclass `UITabBar` and `UITabBarController`, set a handful of properties, and the system bar gets a custom item layout, a raised center button, a badge dot, and per-item animation. The README's pitch is a single line of setup, and the repository description says the same thing, calling it an animated tab bar supported by Lottie with one line of code.

What the one line does not tell you is that the library is mostly a bag of switches. Tab titles, normal and selected images, shadow offsets, border width and color, badge positions, plus button width and offset, animation frame sources, and per-item index sets for which buttons show a badge, all of it is property driven. The example folder confirms the shape of the work: `MainTabBarController.h` and `.m` in the Objective-C example, `SceneDelegate.h` and `SceneDelegate.m` alongside it, and `CYLMainRootRootViewController` style containers in the Swift examples.

The Objective-C `Example/` directory is still first class, alongside `Example-Swift/`, `Example-Swift-02/`, `Example-Swift-03/` and `Example-Swift-04/`. The Objective-C headers use a `cyl_` prefix, and the newest release keeps adding Objective-C properties to match the Swift API, so both languages are supported at the same level rather than Swift being a port of an older Objective-C library.

Four distribution paths and one manifest that does not belong

The repository root carries every installation route an iOS project needs: `CYLTabBarController.podspec`, `Cartfile`, `Cartfile.resolved`, `Package.swift`, `Podfile` and an Xcode workspace. The README carries a CocoaPods version badge and a Swift compatibility badge, and states a platform floor of iOS 12.0 or later in the badge itself. Carthage support is visible only as the presence of the `Cartfile` files, since the truncated README page in the repository root does not spell out those steps.

The `package.json` at the root is the odd one out. It is not a Node package in any meaningful sense; it carries a commitizen hook config and placeholder metadata:

json
  "name": "CYLTabBarController",
  "version": "1.0.0",
  "config": {
    "commitizen": {
      "path": "cz-conventional-changelog"
    }
  }

Its declared license is ISC while the repository license is MIT, and its `test` script deliberately fails with `echo "Error: no test specified" && exit 1`. Treat that file as commit tooling rather than as a distribution channel. The real test target is the Xcode one, `CYLTabBarControllerTests/` next to `CYLTabBarController/` and `CYLTabBarController_iOS/`.

Lottie animation on items, plus buttons and badges at the same time

The animation story is the reason most people find this library. Each tab item can be given an animation frame directory instead of static images, and the library plays it. On top of that, the plus button and the red badge dot are separate animated elements, and the README for version 1.99.37 says they can be displayed simultaneously, including on the iOS 26 glass presentation.

The plus button itself has been the most worked on part. Release 1.99.37 added four glass presentation styles for it, with styles one and two described as matching two existing shipping apps and set as the default, and styles three and four adding a stacked icon over text layout with the option to hide the glass mask while selected or keep it centered. Version 1.99.39, mentioned in the README rather than in the release list, added the ability to add or remove the plus button while the app is running rather than only at setup time.

That last change matters more than it sounds. Dynamic tab configuration is what you need when the set of destinations is decided by a login state or a feature flag, and it means the tab bar can be reconfigured without rebuilding the view controller stack.

Liquid Glass without private APIs, and the claim to check yourself

The iOS 26 and iOS 27 work is the current direction of the project. The README states that the glass effect is not implemented with private APIs, that it passes static code scanning, and that it has been through Apple review. It also states that the glass tab bar inherits from `UITabBar`, so every system appearance setting keeps working, and that the plus button is layered on top of that rather than replacing the bar.

Three more promises in the same list are worth quoting as claims rather than as verified behaviour: the effect is described as native rather than imitated, upgrades for existing integrators are said to need fewer than ten changed lines and under an hour of work, and the implementation is said not to depend on the UI compatibility mode, which the README treats as the reason apps get rejected on iOS 27.

Two related topics appear in the repository metadata, `ios26-liquid-glass` and `lottie-ios`, which tells you the dependency direction: Lottie is the animation engine, and the glass rendering is built on top of UIKit rather than on a separate rendering layer. Nothing in the repository documents a minimum iOS 26 requirement for the glass path, so the version floor that matters for glass is something you would have to establish by reading `CYLTabBarController_iOS/` yourself.

Switching to the flat iOS 27 style through a plist key

Version 1.99.41, released on 2026-07-07, added an iOS 27 flat design style with what the release notes call a zero code path. If your app keeps the `UIDesignRequiresCompatibility` key set, the library detects it and switches to the flat style automatically. On versions before iOS 27 the key keeps its system meaning.

The flat style is also packaged as a separate component so that a project that only wants the glass effect takes a smaller dependency. The release notes describe the two styles as sharing one API, differing only in a style property, and being switchable at runtime. That runtime switch is positioned as an A/B test mechanism, shipping the flat style by default and moving cohorts to glass over time.

This is the clearest example of the project's maintenance style. The tags are not semantic; 1.99.37, 1.99.39, 1.99.41 and 1.99.55 all land in the 1.99 range, and the author says at least three more releases were planned before iOS 27 shipped. Pin an exact version and read the notes, because a minor bump inside 1.99.x has been a behaviour change more than once. The last push was on 2026-08-12, and the newest release is 1.99.55 from 2026-07-31, which added a `cyl_keepShowingPlusButtonLabel` property so the plus button's label can be restyled without overlapping its text.

Who uses it, and what the documentation does not settle

The README carries a table of shipping apps built with the library, with App Store links and icons. The names are Chinese apps, and that tells you something about where the demand is: Haidilao, the hot pot chain, C家, and Taobizhong, a shopping feature app from Alibaba's Taobao. The project is also maintained by a developer who writes in Chinese first, and the README carries a CN and EN marker convention throughout, so the English documentation is a translation layer on top of Chinese release notes rather than a parallel set.

What the README does not settle is the cost of the approach. Every animated item and every glass plus button runs through Lottie, and the README gives no figures for memory, frame rate or battery on a tab bar that persists for the whole app lifetime. It also does not document how the library behaves under VoiceOver, dynamic type or reduced motion, which for a persistent navigation element is where you would want answers before shipping.

There is also a naming slip worth knowing about if you grep the repository: the example folder is called `Example-loadTabBarIconsFroNework`, with the typo in the directory name itself. The library does support loading item icons from the network, which the README lists as a feature, and that example is where it is demonstrated. The bug tracker is the only feedback channel the author accepts, and the Telegram group at `t.me/CYLTabBarController` is for discussion, not issue reports.

Editorial conclusion

CYLTabBarController is worth a look when your app needs a tab bar the system one cannot express, mainly a center button that sits above the bar or per-item Lottie animation, and it is honest about being one class you subclass and configure rather than a drop-in replacement for UITabBarController. The Liquid Glass work is the most interesting part of the repository right now, and the claim that it uses no private APIs is the one to verify in your own build, since Apple review outcomes are not something a README can settle. Start with Example-Swift-03, which the release notes name as the demo for the newest plus button behaviour, and read CHANGELOG.md before upgrading, because the tag numbers move fast.

Frequently asked questions

How do I add a Lottie animation to tab bar items in CYLTabBarController?

Instead of static images for the normal and selected states of an item, you point the item at a Lottie animation directory and the library plays it. The plus button and the badge dot have their own animation properties, and the README states these can be shown at the same time as the glass effect.

Does CYLTabBarController use private APIs for its Liquid Glass effect?

The README states that no private APIs are used, that the code can pass a static scan, and that the implementation has been through Apple review. The glass tab bar subclasses UITabBar, which is why the author claims all system appearance settings keep working. Review outcomes are not something the repository can prove, so treat that as a claim to verify in your own build.

Which iOS versions does CYLTabBarController support?

The README badge states iOS 12.0 and later, and the glass plus button effects are documented for iOS 26 while version 1.99.41 added a flat style for iOS 27. The repository also lists dark mode support and iPhone 17 in its description, and does not state a separate minimum version for the glass path.

Official sources

  1. ChenYilong/CYLTabBarController on GitHub
  2. Issues
  3. License: MIT
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/chenyilong-cyltabbarcontroller.svg)](https://hysenlabs.com/projects/chenyilong-cyltabbarcontroller)