Swift笔记37:ESPullToRefresh

基本使用

// 添加下拉刷新
setupPullToRefresh()
// 添加上拉加载更多
setupLoadMoreData()

查看demo

// MARK: - 设置下拉刷新,和下拉加载更多的方法
extension ESPullToRefreshViewController {
    func setupPullToRefresh() {
        mTableView.es.addPullToRefresh {
            [unowned self] in
            mLog("开始下拉刷新")
            loadNewData()
//            mTableView.es.stopPullToRefresh()
            /// 在这里做刷新相关事件
            /// ...
//            /// 如果你的刷新事件成功,设置completion自动重置footer的状态
//            mTableView.es.stopPullToRefresh(completion: true)
//            /// 设置ignoreFooter来处理不需要显示footer的情况
//            mTableView.es.stopPullToRefresh(completion: true, ignoreFooter: false)
        }
    }

    func setupLoadMoreData() {
        mLog("上拉加载更多")
        mTableView.es.addInfiniteScrolling {
            [unowned self] in
            /// 在这里做加载更多相关事件
            loadNewData()
            /// ...
            /// 如果你的加载更多事件成功,调用es_stopLoadingMore()重置footer状态
            /// 通过es_noticeNoMoreData()设置footer暂无数据状态
//            mTableView.es.noticeNoMoreData()
        }
    }
}
func loadNewData() {
    let url = GlobalConfig.BOOKLIST_URL
    let parameters = ["key": "value"]
    DispatchQueue.global().async {
        Alamofire.request(url, method: .get, parameters: parameters, encoding: URLEncoding.default, headers: nil).responseJSON(completionHandler: { [weak self] response in
            guard let json = response.result.value, let weakSelf = self else { return }
            let dicJson = JSON(json)
            let temp: [JSON] = dicJson["list"].arrayValue
            // 模拟每次加载3个数据
            weakSelf.mDataArray.append(temp[0])
            weakSelf.mDataArray.append(temp[1])
            weakSelf.mDataArray.append(temp[2])
            weakSelf.mTableView.reloadData()
            weakSelf.mTableView.es.stopPullToRefresh()
            weakSelf.mTableView.es.stopLoadingMore()
        })
    }
}
自定义文字样式
// 添加下拉刷新
setupPullToRefresh(animator: header)
// 添加上拉加载更多
setupLoadMoreData(animator: footer)
// MARK: - 设置下拉刷新,和下拉加载更多的方法

extension ESPullToRefreshViewController {
    func setupPullToRefresh(animator: (ESRefreshProtocol & ESRefreshAnimatorProtocol)? = nil) {
        if animator == nil {
            mTableView.es.addPullToRefresh {
                [unowned self] in
                mLog("开始下拉刷新")
                loadNewData()
                //            mTableView.es.stopPullToRefresh()
                /// 在这里做刷新相关事件
                /// ...
                //            /// 如果你的刷新事件成功,设置completion自动重置footer的状态
                //            mTableView.es.stopPullToRefresh(completion: true)
                //            /// 设置ignoreFooter来处理不需要显示footer的情况
                //            mTableView.es.stopPullToRefresh(completion: true, ignoreFooter: false)
            }
        } else {
            mTableView.es.addPullToRefresh(animator: animator!) {
                [unowned self] in
                mLog("开始下拉刷新")
                loadNewData()
            }
        }
    }

    func setupLoadMoreData(animator: (ESRefreshProtocol & ESRefreshAnimatorProtocol)? = nil) {
        mLog("上拉加载更多")
        if animator == nil {
            mTableView.es.addInfiniteScrolling {
                [unowned self] in
                /// 在这里做加载更多相关事件
                loadNewData()
                /// ...
                /// 如果你的加载更多事件成功,调用es_stopLoadingMore()重置footer状态
                /// 通过es_noticeNoMoreData()设置footer暂无数据状态
                //            mTableView.es.noticeNoMoreData()
            }
        } else {
            mTableView.es.addInfiniteScrolling(animator: animator!) {
                [unowned self] in
                loadNewData()
            }
        }
    }

    // 自定义下拉上拉 文字提示
    var header: ESRefreshHeaderAnimator {
        let h = ESRefreshHeaderAnimator(frame: CGRect.zero)
        h.pullToRefreshDescription = "下拉刷新"
        h.releaseToRefreshDescription = "松开获取最新数据"
        h.loadingDescription = "下拉刷新..."
        return h
    }

    var footer: ESRefreshFooterAnimator {
        let f = ESRefreshFooterAnimator(frame: CGRect.zero)
        f.loadingMoreDescription = "上拉加载更多"
        f.noMoreDataDescription = "数据已加载完"
        f.loadingDescription = "加载更多..."
        return f
    }
}
自定义动画

自定义动画视图,遵守ESRefreshProtocol, ESRefreshAnimatorProtocol协议。
// 添加animator
setupPullToRefresh(animator: animationHeader)

class HeaderAnimatorView: UIView, ESRefreshProtocol, ESRefreshAnimatorProtocol {
    public var insets: UIEdgeInsets = .zero
    public var view: UIView { return self }
    public var duration: TimeInterval = 0.3
    public var trigger: CGFloat = 56.0
    public var executeIncremental: CGFloat = 56.0
    public var state: ESRefreshViewState = .pullToRefresh
            
    private let imageView: UIImageView = {
        let imageView = UIImageView()
        imageView.image = UIImage(named: "self_refresh_1")
        return imageView // self_refresh_1
    }()
        
    override init(frame: CGRect) {
        super.init(frame: frame)
        addSubview(imageView)
    }
        
    @available(*, unavailable)
    public required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
        
    public func refreshAnimationBegin(view: ESRefreshComponent) {
        imageView.center = center
        UIView.animate(withDuration: 0.2, delay: 0, options: .curveLinear, animations: {
            self.imageView.frame = CGRect(x: (self.bounds.size.width - 39.0) / 2.0,
                                          y: self.bounds.size.height - 50.0,
                                          width: 39.0,
                                          height: 50.0)

        }, completion: { _ in
            var images = [UIImage]()
            for idx in 1 ... 8 {
                if let aImage = UIImage(named: "self_refresh_\(idx)") {
                    images.append(aImage)
                }
            }
            self.imageView.animationDuration = 0.5
            self.imageView.animationRepeatCount = 0
            self.imageView.animationImages = images
            self.imageView.startAnimating()
        })
    }
        
    public func refreshAnimationEnd(view: ESRefreshComponent) {
        imageView.stopAnimating()
        imageView.image = UIImage(named: "icon_pull_animation_1")
            
        UIView.animate(withDuration: 0.2, delay: 0, options: .curveLinear, animations: {
            self.refresh(view: view, progressDidChange: 0.0)
        }, completion: { _ in
        })
    }
        
    public func refresh(view: ESRefreshComponent, progressDidChange progress: CGFloat) {
        let p = max(0.0, min(1.0, progress))
        imageView.frame = CGRect(x: (bounds.size.width - 39.0) / 2.0,
                                 y: bounds.size.height - 50.0 * p,
                                 width: 39.0,
                                 height: 50.0 * p)
    }
        
    public func refresh(view: ESRefreshComponent, stateDidChange state: ESRefreshViewState) {
        guard self.state != state else {
            return
        }
        self.state = state
            
        switch state {
        case .pullToRefresh:
            var images = [UIImage]()
            for idx in 1 ... 5 {
                if let aImage = UIImage(named: "self_refresh_\(5 - idx + 1)") {
                    images.append(aImage)
                }
            }
            imageView.animationDuration = 0.2
            imageView.animationRepeatCount = 1
            imageView.animationImages = images
            imageView.image = UIImage(named: "self_refresh_1")
            imageView.startAnimating()
        case .releaseToRefresh:
            var images = [UIImage]()
            for idx in 1 ... 5 {
                if let aImage = UIImage(named: "self_refresh_\(idx)") {
                    images.append(aImage)
                }
            }
            imageView.animationDuration = 0.2
            imageView.animationRepeatCount = 1
            imageView.animationImages = images
            imageView.image = UIImage(named: "self_refresh_5")
            imageView.startAnimating()
        default:
            break
        }
    }
}

ESPullToRefresh 文档:https://github.com/eggswift/pull-to-refresh/blob/master/README_CN.md
转发 ESPullToRefresh目录分析:https://www.jianshu.com/p/62d12b7f5058

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容