Swiftpack.co - Package - hoangtaiki/Refreshable


Version License Platform Language Build Status

Refreshable is a component that give pull to refresh and load more (infinite scrolling) feature for UIScrollView. By extension to UIScrollView, you can easily add features for any subclass of UIScrollView. Refreshable is developed to you can easily customize its UI style.


  • Xcode 9 or later
  • iOS 9.0 or later
  • ARC
  • Swift 4.0 or later


  • Support UIScrollView and its subclasses UICollectionView UITableView UITextView
  • Pull down to refresh and pull up to load more
  • Support customize your own style(s)

Getting Started


Install with CocoaPods by adding the following to your Podfile:

platform :ios, '9.0'
pod 'Refreshable'

Swift Package Manager

Install with Swift Package Manager by adding the following to your Package.swift:

dependencies: [
    .package(url: "https://github.com/hoangtaiki/Refreshable", from: "1.0.0"),


Or manually checkout the submodule with git submodule add git@github.com:hoangtaiki/Refreshable.git, drag Refreshable.xcodeproj to your project, and add Refreshable as a build dependency.


Add Pull to refresh

The easiest way to use the pull to refresh feature is use default style from us.

tableView.addPullToRefresh(action: { [weak self] in
    DispatchQueue.main.asyncAfter(deadline: .now() + 1) {

Add if you want to custom UI you just need conform the PullToRefreshDelegate protocol You can refer TextLoadingAnimator we implemented

Add Load more

tableView.addLoadMore(action: { [weak self] in
    DispatchQueue.main.asyncAfter(deadline: .now() + 1) {

We support disable load more when no more data


Use with RxSwift

I am a fan of reactive programming. I use RxSwift for my projects. If you want use Refreshable with RxSwift. Create new file with name Refreshable+Rx.swift then copy below code into that file.

import RxSwift
import RxCocoa
import Refreshable

extension Reactive where Base: UIScrollView {
    public var refreshing: Binder<Bool> {
        return Binder(base) { scrollView, isShow in
            if isShow {
            } else {
    public var loadingMore: Binder<Bool> {
        return Binder(base) { scrollView, isShow in
            if isShow {
            } else {



We’re glad you’re interested in Refreshable, and we’d love to see where you take it. If you have suggestions or bug reports, feel free to send pull request or create new issue.

Thanks, and please do take it for a joyride!


Stars: 17
Help us keep the lights on


Used By

Total: 0


1.2.0 - Nov 25, 2018

1.1.2 - Aug 28, 2018

1.1.1 - Aug 9, 2018

Fix bug layout for animator. The spinner can't be layout center of view.

1.1.0 - Jul 30, 2018

  • Support Swift Package Manager
  • Add travis

1.0.0 - Jul 30, 2018

  • Pull to refresh and load more feature
  • Support customize UI