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:
#selector(handleRefreshControl),
for: .valueChanged)
}
@objc func handleRefreshControl() {
// Update your content…
// Dismiss the refresh control.
DispatchQueue.main.async {
self.$myScrollingView.endRefreshing()
}
}
You can also use RefreshControl
directly.
let refreshControl = RefreshControl(view: CustomView())
func configureRefreshControl () {
myScrollingView.addRefreshControl(refreshControl)
refreshControl.addTarget(self, action:
#selector(handleRefreshControl),
for: .valueChanged))
}
You can also start refreshing programmatically:
refreshControl.beginRefreshing()
RefreshControl
height depends on the height of the custom view.
To create a custom view, the following conditions must be met.
- Be a subclass of
UIView
- Conforms to
RefreshControlView
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.