Skip to content

Instantly share code, notes, and snippets.

@Mukeshawal
Last active January 28, 2020 08:56
Show Gist options
  • Save Mukeshawal/c2a42baf1810641f0381819e67c0f9a4 to your computer and use it in GitHub Desktop.
Save Mukeshawal/c2a42baf1810641f0381819e67c0f9a4 to your computer and use it in GitHub Desktop.
//
// RefreshControl.swift
//
// Created by mukesh awal on 1/22/20.
// Copyright © 2020. All rights reserved.
//
/******************************************************************
-uses RxSwift and RxCocoa
-add instance of this class to background of your scroll view
****************************** points ***********************************
left top * * right top
| |
| |
| |
| |
left bottom * * right bottom
------------------ * -------------------
middle bottom
******************************************************************/
import UIKit
import RxCocoa
import RxSwift
/// add instance of this class to background of your scroll view.
///you can set size of refresh circle using "setRefreshCircleSize".
///you can set fillColor of refresh control using "setFillColor" ,
///set Max Height Of Refresh Control using "setMaxHeightOfRefreshControl",
///set color of refresh circle using "setRefreshCircleColor",
class RefreshControl: UIView {
//MARK: - properties
//enum for observers
enum Observer{
case contentOffset
case panGesture
}
//enum for radius of refresh circle
enum RefreshCircleSize : CGFloat{
case small = 12.0
case medium = 17.0
case large = 22.0
}
/// indicates refreshing status
private var refreshingStatus = false
let bag = DisposeBag()
//MARK: - layers
private let shapeLayer = CAShapeLayer()
private let circleLayer = CAShapeLayer()
//MARK: - points on path of border
var leftTop = CGPoint()
var rightTop = CGPoint()
var leftBottom = CGPoint()
var rightBottom = CGPoint()
var midBottom = CGPoint()
///content offset of scroll view that keeps updated according to scroll detected
private var scrollViewContentYOffset: CGFloat = 0
///dynamic xposition of panGesture over scroll view
private var xPositionOfPan : CGFloat = 0
/// y offset for middle bottom point
private var middleBottomPointYOffset : CGFloat = 0
///y offset for bottom edge points
private var edgeBottomPointYOffset : CGFloat = 0
/// center point for circle
private var centerForCircle : CGPoint = CGPoint(x: 0, y: 0)
///threshold drag value
private var thresholdDrag : CGFloat = 130
///maximum height of refresh control
private var maxHeightOfRefreshControl: CGFloat = 170
///size of refresh circle
private var refreshCircleSize : RefreshCircleSize = .medium
///called when user refresh is triggered
private var onRefreshing : () -> Void = {
debugPrint("refresh triggerd. Implement setOnRefreshing of RefreshControl to call your own function.")
}
///fill color of refresh control
var setFillColor : UIColor = UIColor.appYellow {
didSet{
shapeLayer.fillColor = setFillColor.cgColor
}
}
///color of refresh circle
var setRefreshCircleColor : UIColor = UIColor.white {
didSet{
circleLayer.strokeColor = setRefreshCircleColor.cgColor
}
}
//MARK: - set
///set maxHeight of refreshControl. minimum is 130
var setMaxHeightOfRefreshControl : CGFloat = 0 {
didSet{
maxHeightOfRefreshControl = max(setMaxHeightOfRefreshControl, 170)
}
}
//set size of refresh circle
var setRefreshCircleSize : RefreshCircleSize = RefreshCircleSize.medium {
didSet{
refreshCircleSize = setRefreshCircleSize
}
}
//set function to be called after refresh is triggerd
var setOnRefreshing : () -> Void = {} {
didSet{
onRefreshing = setOnRefreshing
}
}
///return super view as scroll view. may be table view or collection view too. if superView doesnot exist then return nil
var containerScrollView : UIScrollView? {
return superview as? UIScrollView
}
//MARK: - initializer
override init(frame : CGRect) {
super.init(frame: frame)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment