SSCustomPullToRefresh is an open-source library that uses UIKit to add an animation to the pull to refresh view in a UITableView and UICollectionView.

Animation Type

Spinner Animation Pulse Animation Wave Animation Wave Animation
spinnerAnimation pulseAnimation waveAnimation waveSingleColor


  • iOS 10.0+
  • Xcode 11+



  • You can use CocoaPods to install SSCustomPullToRefresh by adding it to your Podfile:

     pod 'SSCustomPullToRefresh'
  • import SSCustomPullToRefresh


  • Download and drop SSCustomPullToRefresh folder in your project.
  • Congratulations!

Swift Package Manager

  • When using Xcode 11 or later, you can install SSCustomPullToRefresh by going to your Project settings > Swift Packages and add the repository by providing the GitHub URL. Alternatively, you can go to File > Swift Packages > Add Package Dependencies...
dependencies: [
    .package(url: "", from: "1.0.1")


  • Carthage is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks. You can install Carthage with Homebrew using the following command:
$ brew update
$ brew install carthage

To integrate SSCustomPullToRefresh into your Xcode project using Carthage, add the following line to your Cartfile:

github "mobile-simformsolutions/SSCustomPullToRefresh"

Run carthage to build and drag the SSCustomPullToRefresh(Sources/SSCustomPullToRefresh) into your Xcode project.

How It Works

  • You can use it for any component having a base class as ScrollView like TableView or CollectionView.

1. Spinner Animation

  • SpinnerAnimationView takes image and backgroundColor as an input parameter. You can provide it as per your choice.

    spinnerAnnimation = SpinnerAnimationView(image: UIImage(named: "spinner"), backgroundColor: .purple)           
    spinnerAnnimation.delegate = self   
    spinnerAnnimation.parentView = self.tableView    

2. Wave Animation

  • SineWaveAnimationView takes Color as an input parameter.

    sineAnnimation = SineWaveAnimationView(color: .purple)           
    sineAnnimation.delegate = self 
    sineAnnimation.parentView = self.tableView
  • Along with this, you can also provide two different colors and a waveHeight value. You can give a waveHeight value between 5.0 to 50.0.

    sineAnnimation = SineWaveAnimationView(frontColor: .orange, backColor: .purple, waveHeight: 10.0)           

3. Pulse Animation

  • PulseAnimationView takes Color as an input parameter. You can provide center circle color, pulse color and background color of your refresh view.

    pulseAnnimation = PulseAnimationView(circleColor: .purple, pulseColor: .purple, 
                                                               pulseViewBackgroundColor: .brown)
    pulseAnnimation.delegate = self   
    pulseAnnimation.parentView = self.tableView


  • The RefreshDelegate methods can be used to notify start and end refresh.

    extension ViewController: RefreshDelegate {           
      func startRefresh() { }   
      func endRefresh() { }