FigRefresh
FigRefresh is a Swift refresh framework. It's api looks like MJRefresh. FigRefresh is simple and extensibility.
Usage
import FigRefresh
 scrollView.fig_header = RefreshIndicatorHeader(refreshingClosure: { [weak self] in
     DispatchQueue.global().async {
        sleep(3)
        DispatchQueue.main.async {
            self?.scrollView.fig_header?.endRefreshing()
        }
    }
 })
look up FigRefreshDemo project in sources.
Design
RefreshComponent have a titleLabel property,it use show different text on various states. I suggest you custom titleLabel in it's sub classes.
I support 3 types implements:
- 1、Text.
 - 2、Indicator + Text.
 - 3、Images + Text.
 
If these can't satisfy you,Just inherit RefreshHeader and RefreshFooter class.
public class MyCustomHeader:RefreshHeader{
    
    //Custom UI
    var myImage:UIImageView?
    var myDetailsLabel:UILabel?
    ...
	//Return height of UI. 50 is default value
    public override func refreshComponentHeight() -> CGFloat {
        return 50
    }
    
    //Just excute once. This method used to init UI. 
    public override func refreshComponentDidMoveToSuperview() {
        //must call
        super.refreshComponentDidMoveToSuperview()
        
        //Custom styles of myImage
        //Add myImage
        addSubview(myImage)
        //Layout myImage
        ...
        
        //Custom styles of myDetailsLabel
        //Add myDetailsLabel
        addSubview(myDetailsLabel)
        //Layout myDetailsLabel
        ...
        
        //If you meed custom titleLabel
        titleLabel?.textColor = UIColor.gray
        titleLabel?.textAlignment = .left
        titleLabel!.font = UIFont.systemFont(ofSize: 13)
        
        //Option1: Layout titleLabel use constraints
//        titleLabel?.snp.remakeConstraints({ (make) in
//            make.left.equalTo(animationIV.snp.right).offset(10)
//            make.centerY.equalToSuperview()
//            make.height.equalToSuperview()
//            make.right.equalToSuperview()
//        })
        //Option2: Layout titleLabel use frame
        titleLabel?.frame = CGRect(x: animationIV.frame.maxX + 10, y: 0, width: frame.width - (animationIV.frame.maxX + 10), height: height)
        
        ...
        
    }
    
    public override  func refreshComponentStateChange(state: RefreshState) {
        super.refreshComponentStateChange(state: state)
        switch state{
        case .refreshing:  //custom style on refreshing state
            ...
            break
        default:   //custom style on idle state
            ...
            break
        }
        
    }
    
}
States
FigRefresh have 6 states:
- idle: normal idel
 - pullingInRect: pulling and component not displays fully
 - pullingOutRect: pulling and component displays fully
 - releaseing: Releaseing, not refreshing, from pullingInRect state.
 - refreshing: Releaseing, and refreshing, from pullingOutRect state.
 - noMoreData: no more date(only footer)
 
RefreshHeader and RefreshFooter classes,support default text on states:
open class RefreshHeader:RefreshHeaderControl{
	...
	    
    open override func refreshComponentTitlesWithStates() -> [RefreshState : String] {
          return [.idle:"Pull down to refresh",
                 .pullingInRect:"Pull down to refresh",
                 .pullingOutRect:"Release to refresh",
                 .releaseing:"Pull down to refresh",
                 .refreshing:"Loading..."]
    }
    
}open class RefreshFooter:RefreshFooterControl{
	...
	    
    open override func refreshComponentTitlesWithStates() -> [RefreshState : String] {
        return [.idle: "Pull up to load more",
                .pullingInRect: "Pull up to load more",
                .pullingOutRect: "Release to load more",
                .releaseing:"Pull up to load more",
                .refreshing:"Loading...",
                .noMoreData:"No more data"]
    }
    
}
Best Practices
1 、Inherit RefreshHeader and RefreshFooter.
- 1、Add new proterties.
 - 1、Override refreshComponentTitlesWithStates method to custom text.
 - 2、Override refreshComponentDidMoveToSuperview method to custom UI.
 
2、Set Globle Header and Footer.
Set onec Header and Footer.
        
FigRefreshSetDefaultHeader(MyCustomRefreshHeader.self)
FigRefreshSetDefaultFooter(MyCustomRefreshFooter.self)
        call header use fig_header. call footer use fig_footer.
scrollView.fig_header {
    DispatchQueue.global().async {  [weak self] in
        sleep(3)
        DispatchQueue.main.async {
            self?.scrollView.fig_header?.endRefreshing()
        }
    }
}
scrollView.fig_footer { [weak self] in
    DispatchQueue.global().async {
        sleep(3)
        DispatchQueue.main.async {
            self?.scrollView.fig_footer?.endRefreshing()
        }
    }
}
3 、Dynimic modify Header and Footer.
tableView.fig_footer?.setTitle("xxxx", for: .noMoreData) // If needed.
tableView.fig_footer?.endRefreshingWithNoMoreData()
4、use custom header or footer diffent with globles.
 scrollView.fig_header = MyCustom2Header(refreshingClosure: { [weak self] in
     DispatchQueue.global().async {
        sleep(3)
        DispatchQueue.main.async {
            self?.scrollView.fig_header?.endRefreshing()
        }
    }
 })
Requirements
- iOS 8.0+
 - Xcode 10.2
 - Swift 5
 
Installation
Cocoapods
Add the following line to your Podfile:
pod "FigRefresh"Author
Kevin Zhou
- 邮件: [email protected]
 - Twitter: @wumingapie
 - Facebook: wumingapie
 - LinkedIn: Rafael
 
License
FigRefresh is available under the MIT license. See the LICENSE file for more info.

