Contents

c-villain/Refreshable

Pull to refresh, refreshable based on SwiftUI

Requirements

Basically there is no any restriction to add this package to your project with minimum developments below iOS 14.

But you can use Refreshable with views starting with iOS 14.

Use @available(iOS 14.0, ) or if #available(iOS 14, ) for this one.

Installation

Swift Package Manager

To integrate Refreshable into your project using SwiftPM add the following to your Package.swift:

dependencies: [
    .package(url: "https://github.com/c-villain/Refreshable", from: "0.1.0"),
],

or via XcodeGen insert into your project.yml:

name: YourProjectName
options:
  deploymentTarget:
    iOS: 12.0
packages:
  Refreshable:
    url: https://github.com/c-villain/Refreshable
    from: 0.1.0
targets:
  YourTarget:
    type: application
    ...
    dependencies:
       - package: Refreshable

Quick start

Basically there are two ways to mark your view as Refreshable.

<details> <summary>The easiest one is to add modifier refreshable to your view.</summary>

import Refreshable

struct YourView: View {
    
    var body: some View {
        ScrollView {
            LazyVStack {
                ...
            }
            .refreshable {
                // do your work on refresh here
            }
        }
    }
}

</details>

<details> <summary>Second one is to add manually RefreshControl to your view implementation. Don't forget to name your view’s coordinate space!</summary>

import Refreshable

struct YourView: View {
    
    var body: some View {
        ScrollView {
            RefreshControl(coordinateSpace: .named("List")) { // <= HERE
                // do your work on refresh here
            }
            
            LazyVStack {
                ...
            }
        }
        .coordinateSpace(name: "List") // <= DON'T FORGET
    }
}

</details>

<details> <summary>To control responsiveness for refreshable during scrolling use ScrollDistance. Or use defaults 😊.</summary>

import Refreshable

struct Constants {
    public static let isPad: Bool = UIDevice.current.userInterfaceIdiom == .pad
}

struct YourView: View {
    
    var body: some View {
        ScrollView {
            RefreshControl(Constants.isPad ? .long : .short, // <= HERE
                           coordinateSpace: .named("List")) { 
                // do your work on refresh here
            }
            
            LazyVStack {
                ...
            }
        }
        .coordinateSpace(name: "List")
    }
}

</details>

Communication

  • If you found a bug, open an issue or submit a fix via a pull request.
  • If you have a feature request, open an issue or submit a implementation via a pull request or hit me up on lexkraev@gmail.com or telegram.
  • If you want to contribute, submit a pull request onto the master branch.

License

Refreshable package is released under an MIT license.

Package Metadata

Repository: c-villain/Refreshable

Homepage: https://t.me/swiftui_dev

Stars: 12

Forks: 0

Open issues: 0

Default branch: main

Primary language: swift

License: MIT

Topics: refreshable, swiftui, swiftui-animations, swiftui-example

README: README.md