Last active
January 28, 2020 08:56
-
-
Save Mukeshawal/c2a42baf1810641f0381819e67c0f9a4 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// 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