Skip to content

Instantly share code, notes, and snippets.

@hanrw
Forked from prafullakumar/RefreshControl.swift
Created November 11, 2023 02:05
Show Gist options
  • Save hanrw/02b7f360ccd3243a3d6bbe42d1eff2b5 to your computer and use it in GitHub Desktop.
Save hanrw/02b7f360ccd3243a3d6bbe42d1eff2b5 to your computer and use it in GitHub Desktop.

Revisions

  1. @prafullakumar prafullakumar created this gist Mar 11, 2021.
    59 changes: 59 additions & 0 deletions RefreshControl.swift
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,59 @@
    import SwiftUI

    struct RefreshControl: View {
    var coordinateSpace: CoordinateSpace
    var onRefresh: ()->Void
    @State var refresh: Bool = false
    var body: some View {
    GeometryReader { geo in
    if (geo.frame(in: coordinateSpace).midY > 50) {
    Spacer()
    .onAppear {
    if refresh == false {
    onRefresh() ///call refresh once if pulled more than 50px
    }
    refresh = true
    }
    } else if (geo.frame(in: coordinateSpace).maxY < 1) {
    Spacer()
    .onAppear {
    refresh = false
    ///reset refresh if view shrink back
    }
    }
    ZStack(alignment: .center) {
    if refresh { ///show loading if refresh called
    ProgressView()
    } else { ///mimic static progress bar with filled bar to the drag percentage
    ForEach(0..<8) { tick in
    VStack {
    Rectangle()
    .fill(Color(UIColor.tertiaryLabel))
    .opacity((Int((geo.frame(in: coordinateSpace).midY)/7) < tick) ? 0 : 1)
    .frame(width: 3, height: 7)
    .cornerRadius(3)
    Spacer()
    }.rotationEffect(Angle.degrees(Double(tick)/(8) * 360))
    }.frame(width: 20, height: 20, alignment: .center)
    }
    }.frame(width: geo.size.width)
    }.padding(.top, -50)
    }
    }

    struct PullToRefreshDemo: View {
    var body: some View {
    ScrollView {
    RefreshControl(coordinateSpace: .named("RefreshControl")) {
    //refresh view here
    }
    Text("Some view...")
    }.coordinateSpace(name: "RefreshControl")
    }
    }

    struct PullToRefreshDemo_Previews: PreviewProvider {
    static var previews: some View {
    PullToRefreshDemo()
    }
    }