Swiftpack.co - Package - luispadron/UICircularProgressRing


A circular progress bar for iOS written in Swift



  • 2 views, progress or timer
  • Interface builder designable
  • Highly customizable and flexible
  • Easy to use
  • Fluid and interruptible animations
  • Written in Swift
  • RTL language support

Apps Using UICircularProgressRing


NOTE: Objective-C support: Support for Objective-C has been dropped in version 5.0.0, use version 4 or lower if you are using Objective-C.

CocoaPods (Recommended)

  1. Install CocoaPods

  2. Add this repo to your Podfile

    target 'Example' do
        # IMPORTANT: Make sure use_frameworks! is included at the top of the file
        pod 'UICircularProgressRing'
  3. Run pod install

  4. Open up the .xcworkspace that CocoaPods created

  5. Done!


Important: Interface builder support with Carthage is either broken or extremely limted

To use with Carthage

  1. Make sure Carthage is installed

    brew install carthage

  2. Add this repo to your Cartfile

    github "luispadron/UICircularProgressRing"

  3. Install dependencies carthage update --platform iOS


UICircularProgressRing Example

override func viewDidLoad() {
  // Create the view
  let progressRing = UICircularProgressRing()
  // Change any of the properties you'd like
  progressRing.maxValue = 50
  progressRing.style = .dashed(pattern: [7.0, 7.0])
  // etc ...

To set a value and animate the view

// Somewhere not in viewDidLoad (since the views have not set yet, thus cannot be animated)
// Remember to use unowned or weak self if referencing self to avoid retain cycle
progressRing.startProgress(to: 49, duration: 2.0) {
  print("Done animating!")
  // Do anything your heart desires...

// Pause at any time during a running animation

// Continue where you left off after a pause

UICircularTimerRing Example

override func viewDidLoad() {
	// create the view
	let timerRing = UICircularTimerRing()

Animate and set time

						// seconds
timerRing.startTimer(to: 60) { state in
    switch state {
    case .finished:
    case .continued(let time):
        print("continued: \(time)")
    case .paused(let time):
        print("paused: \(time)")

timerRing.pauseTimer() // pauses the timer

timerRing.continueTimer() // continues from where we paused

timerRing.resetTimer() // resets and cancels animations previously running


Please read this before creating an issue about how to use the library:



Do you use this library? Want to be featured? Go here.


Stars: 1146
Help us keep the lights on


Used By

Total: 0


v6.2.1 - Jul 15, 2019

Version 6.2.1

Fix border width calculation to allow proper fitting of view within given bounds. Thanks to @ zulkis for the PR.

v6.2.0 - May 27, 2019

Version 6.2.0

  • Adds ability to start the timer ring from a value other than 0.

v6.1.0 - Mar 27, 2019

Version 6.1.0

  • Migrate to Swift 5.0, thanks to darecki for the PR!

v6.0.2 - Mar 2, 2019

Version 6.0.2

  • Fix issue with formatter initializers being interal, they're now public as intended.

v6.0.1 - Feb 25, 2019

Version 6.0.1

  • Fix bug relating to label being removed during animation (#171)