NVActivityIndicatorView: 32 UIKit Loading Animations for iOS
A collection of awesome loading animations
At a glance
- What is it?
- NVActivityIndicatorView is a UIKit library of 32 ready-made loading animations, installable through CocoaPods, Carthage or Swift Package Manager. The README points SwiftUI users at a separate project, LoaderUI.
- Who is it for?
- Adopt NVActivityIndicatorView when your interface is UIKit, you want a specific animation such as pacman or audioEqualizer, and you would rather call startAnimating() than write Core Animation code by hand. Do not adopt it for a SwiftUI app: the README points to LoaderUI for that, and the library's own API is a UIView subclass with storyboard support.
- 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?
- Activity is slowing. The repository last received commits 6 months 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 September 29, 2026, and from our analysis. They are not legal advice.
Editorial analysis
What problem NVActivityIndicatorView solves, and for whom
Every iOS app eventually needs a spinner, and UIActivityIndicatorView ships with exactly one. NVActivityIndicatorView replaces that single system spinner with a catalogue of 32 named animations, listed in the README's table: ballPulse, ballGridPulse, ballClipRotate, squareSpin, ballClipRotatePulse, ballClipRotateMultiple, ballPulseRise, ballRotate, cubeTransition, ballZigZag, ballZigZagDeflect, ballTrianglePath, ballScale, lineScale, lineScaleParty, ballScaleMultiple, ballPulseSync, ballBeat, lineScalePulseOut, lineScalePulseOutRapid, ballScaleRipple, ballScaleRippleMultiple, ballSpinFadeLoader, lineSpinFadeLoader, triangleSkewSpin, pacman, ballGridBeat, semiCircleSpin, ballRotateChase, orbit, audioEqualizer and circleStrokeSpin.
The intended audience is UIKit developers who want a loading state that matches a brand or a screen rather than the stock grey circle. The README's own description is short: "a collection of awesome loading animations". The value is in the count and the naming. Picking an animation is a one-word change in code or a text field in Interface Builder, not a rewrite of a CAAnimation setup. The project acknowledges two ancestors in its Acknowledgment section, Loaders.css by Connor Atherton and DGActivityIndicatorView by Danil Gontovnik, so the visual vocabulary is not invented from nothing.
How the animation types are wired into a UIView
The library is not a view controller, a HUD or a window overlay. It is a UIView subclass. That single design decision explains most of its behaviour. Because it is a view, you place it wherever a view can go: inside a table cell, over a form, in a container you size yourself. Because it is a view, it has no opinion about when to appear or disappear; the README exposes startAnimating(), stopAnimating() and an isAnimating property and stops there.
Initialization happens one of two ways. The first is through a storyboard: change the class of any UIView to NVActivityIndicatorView, and the README notes that Module must be set to NVActivityIndicatorView. The second is the code initializer, where every parameter except frame is optional and the NVActivityIndicatorView.DEFAULT_* values fill in the rest. The animation type is a value you supply, and in the storyboard path you type one of the names from the table into the Type Name field, case-insensitively.
There is one constraint worth reading twice. All properties are public, so you can change them after initializing, but the README states that all changes must be made before calling startAnimating(). Treat the view as configured once and then run. If you want a different colour mid-flight, you are expected to stop, mutate, and start again.
Installing NVActivityIndicatorView with CocoaPods or Swift Package Manager
The README documents three package managers. CocoaPods is the shortest path. Add the pod to your Podfile:
pod 'NVActivityIndicatorView'Then run pod install from the directory holding the Podfile, reopen the generated workspace, and the module becomes importable. Carthage users add a line to the Cartfile instead:
github "ninjaprox/NVActivityIndicatorView"Swift Package Manager takes the repository URL directly. The README shows it added to the dependencies array of Package.swift:
dependencies: [
.package(url: "https://github.com/ninjaprox/NVActivityIndicatorView.git")
]Once the module is available, the first real use starts with the import the README gives, followed by the initializer and the start call it documents:
import NVActivityIndicatorView
NVActivityIndicatorView(frame: frame, type: type, color: color, padding: padding)
activityIndicatorView.startAnimating()The README does not print the expected on-screen result, but the animation names are self-describing: pacman draws a rotating wedge, audioEqualizer draws bouncing bars. Note that the storyboard path takes the plain string name in the Type Name field, case-insensitively, while the code path passes a type value to the initializer. The README does not document a rollback or uninstall procedure beyond removing the dependency line.
Where the library stops: no HUD, no SwiftUI, no scheduling
The most common wrong assumption about NVActivityIndicatorView is that it manages a loading state. It does not. There is no show/hide pair tied to a network call, no full-screen overlay, no message label, no minimum display duration. If you want a HUD, you build the container, add the indicator view to it, and control visibility yourself. The README's control surface is exactly three members: startAnimating(), stopAnimating() and isAnimating.
SwiftUI is the second boundary, and the project states it plainly. The README carries a notice at the top pointing readers to LoaderUI, described as "ready to use with Swift Package Mananger supported" for a SwiftUI implementation. That is a different repository, not a mode of this one. A SwiftUI developer who adds NVActivityIndicatorView and expects a View will end up wrapping a UIViewRepresentable by hand, which is work the README does not walk through.
Sizing is the third. Since the view is a plain UIView, the frame and padding are yours to choose, and the README does not publish recommended dimensions per animation. An animation that looks right at 30 points may look sparse at 120. There is also a migration note: version 5.0.0 came with breaking changes, and the README defers to that release note for details rather than restating them.
NVActivityIndicatorView against a HUD library such as ProgressHUD
The honest comparison is not with another animation catalogue but with the class of libraries that wrap the whole loading experience. ProgressHUD-style tools are the reference point here, and the difference is architectural. A HUD library owns the overlay, the lifecycle and often the text; you call one function and a spinner with a message appears over your content and disappears when told. NVActivityIndicatorView owns none of that. It gives you the drawing and the animation, and leaves the container, the timing and the dismissal to your code.
That trade is real in both directions. If you want a spinner inside a cell, inside a custom layout, or behind your own transition, a HUD library fights you and NVActivityIndicatorView does not. If you want a full-screen blocking overlay in two lines, NVActivityIndicatorView gives you a view and a blank page. The README's Acknowledgment section also places the project in a lineage of loader collections rather than of HUD frameworks, which matches how it is meant to be used.
There is one more boundary worth naming: Android. The animation names and the general idea circulate widely, but this repository is Swift and its installation instructions are all Cocoa-era package managers. Nothing in the README addresses a non-Apple target.
Release history, licence and what upgrading costs
The release list is short and unevenly spaced: 5.1.0 and 5.1.1 landed on 2020-10-08 and 2020-10-09, and 5.2.0 arrived on 2024-04-17. The last push to the repository was on 2026-03-18. That pattern suggests a library that is finished rather than one that is being reshaped: the animation set is stable, and the gaps between releases are measured in years. For a dependency whose job is drawing spinners, that is usually acceptable, but it means you should not expect new animation types or API changes to arrive on any schedule.
Upgrade cost is dominated by the 5.0.0 breaking changes. The README does not enumerate them; it links to the release note and tells you to refer to it. If you are on a pre-5.0 version, read that note before bumping, because the README will not tell you what moved. Between 5.1.x and 5.2.0 the README offers no migration section at all, which implies no comparable break, but that is inference from silence rather than a documented guarantee.
The licence is MIT, Copyright (c) 2016 Vinh Nguyen. In practice that permits commercial and closed-source use with the copyright notice retained, but the repository's LICENSE file is the authority and this is not legal advice. The presence of PrivacyInfo.xcprivacy at the top level is worth noting for App Store submissions, since privacy manifests became part of the review flow; the README does not explain what that file declares.
Editorial conclusion
Adopt NVActivityIndicatorView when your interface is UIKit, you want a specific animation such as pacman or audioEqualizer, and you would rather call startAnimating() than write Core Animation code by hand. Do not adopt it for a SwiftUI app: the README points to LoaderUI for that, and the library's own API is a UIView subclass with storyboard support. Before you commit, verify that the animation you picked renders at the sizes you need, since padding and size are set by you rather than by the library, and confirm whether the 5.0.0 breaking changes affect any older code you are carrying.
Frequently asked questions
How do I install NVActivityIndicatorView with CocoaPods?
Add pod 'NVActivityIndicatorView' to your Podfile, run pod install, and import the module. The README also documents Carthage and Swift Package Manager as alternatives.
Does NVActivityIndicatorView work with SwiftUI?
The README does not present a SwiftUI API. It points readers to a separate repository, LoaderUI, described as a SwiftUI implementation with Swift Package Manager support.
How many animation types does NVActivityIndicatorView provide?
The README's table lists 32, from ballPulse and ballGridPulse through pacman, orbit, audioEqualizer and circleStrokeSpin. In code you select one through the type parameter of the initializer.
Can I change the colour or padding after the animation starts?
The README states that all properties are public and can be changed after initializing, but that all changes must be made before calling startAnimating().
Official sources
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.
[](https://hysenlabs.com/projects/ninjaprox-nvactivityindicatorview)