Swiftpack.co - Package - hirotakan/RefreshControlKit


Swift 5 License Carthage compatible Cocoapods SwiftPM Platforms

RefreshControlKit is a library for custom RefreshControl that can be used like UIRefreshControl.


  • Swift 5 or later
  • iOS 12 or later


RefreshControl can be used by using @RefreshControlling of the Property Wrappers.

import UIKit
import RefreshControlKit

class ViewController: UIViewController {

    @RefreshControlling(wrappedValue: nil, view: CustomView())
    @IBOutlet private var myScrollingView: UIScrollView!

    // or

    @RefreshControlling(view: CustomView())
    private var myScrollingView = UIScrollView()

Since the projected value is RefreshControl, you can use it like UIRefreshControl by doing the following.

func configureRefreshControl () {

    $myScrollingView.addTarget(self, action:
                        for: .valueChanged)
@objc func handleRefreshControl() {
    // Update your content…

    // Dismiss the refresh control.
    DispatchQueue.main.async {

You can also use RefreshControl directly.

let refreshControl = RefreshControl(view: CustomView())
func configureRefreshControl () {


    refreshControl.addTarget(self, action:
                      for: .valueChanged))

You can also start refreshing programmatically:


Creating custom RefreshControlView

RefreshControl height depends on the height of the custom view.

To create a custom view, the following conditions must be met.

class CustomView: UIView, RefreshControlView {

    func willRefresh() {
        // Something to do before refreshing.

    func didRefresh() {
        // Something to do after refreshing.

    func didScroll(_ progress: RefreshControl.Progress) {
        // Something to do while scrolling.
        // `Progress` expresses the progress to the height of the trigger as 0.0 to 1.0.

See the sample code for details.


public struct Configuration {
    public var layout: Layout
    public var trigger: Trigger

Layout and Trigger can be customized.


Layout can be selected as top or bottom.

public enum Layout {
    /// The top of the `RefreshControl` is anchored at the top of the `ScrollView` frame.
    case top
    /// The bottom of the `RefreshControl` is anchored above the content of the `ScrollView`.
    case bottom
@RefreshControlling(view: CustomView(), configuration: .init(layout: .bottom))
private var myScrollingView = UIScrollView()

| top | bottom | |:---:|:---:| | | |



@RefreshControlling(view: CustomView(), configuration: .init(trigger: .init(height: 50)))
private var myScrollingView = UIScrollView()

You can specify the height at which the refreshing starts. The default is the height of the custom view.


Event can be selected as dragging or released.

public enum Event {
    /// When it is pulled to the trigger height, `beginRefreshing` is called.
    case dragging
    /// If the height of the trigger is exceeded at the time of release, `beginRefreshing` is called.
    case released
@RefreshControlling(view: CustomView(), configuration: .init(trigger: .init(event: .released)))
private var myScrollingView = UIScrollView()

| dragging | released | |:---:|:---:| | | |



Add RefreshControlKit as a dependency:

import PackageDescription

let package = Package(
    name: "YourApp",
    dependencies: [
        .Package(url: "https://github.com/hirotakan/RefreshControlKit.git", majorVersion: 0),


Add the following to your Podfile:

pod 'RefreshControlKit'


Add the following to your Cartfile:

github "hirotakan/RefreshControlKit"


RefreshControlKit is released under the MIT license. See LICENSE for details.


Stars: 1


Used By

Total: 0