Swift筆記37:ESPullToRefresh

基本使用

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

查看demo

// MARK: - 設(shè)置下拉刷新,和下拉加載更多的方法
extension ESPullToRefreshViewController {
    func setupPullToRefresh() {
        mTableView.es.addPullToRefresh {
            [unowned self] in
            mLog("開(kāi)始下拉刷新")
            loadNewData()
//            mTableView.es.stopPullToRefresh()
            /// 在這里做刷新相關(guān)事件
            /// ...
//            /// 如果你的刷新事件成功,設(shè)置completion自動(dòng)重置footer的狀態(tài)
//            mTableView.es.stopPullToRefresh(completion: true)
//            /// 設(shè)置ignoreFooter來(lái)處理不需要顯示footer的情況
//            mTableView.es.stopPullToRefresh(completion: true, ignoreFooter: false)
        }
    }

    func setupLoadMoreData() {
        mLog("上拉加載更多")
        mTableView.es.addInfiniteScrolling {
            [unowned self] in
            /// 在這里做加載更多相關(guān)事件
            loadNewData()
            /// ...
            /// 如果你的加載更多事件成功,調(diào)用es_stopLoadingMore()重置footer狀態(tài)
            /// 通過(guò)es_noticeNoMoreData()設(shè)置footer暫無(wú)數(shù)據(jù)狀態(tài)
//            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個(gè)數(shù)據(jù)
            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: - 設(shè)置下拉刷新,和下拉加載更多的方法

extension ESPullToRefreshViewController {
    func setupPullToRefresh(animator: (ESRefreshProtocol & ESRefreshAnimatorProtocol)? = nil) {
        if animator == nil {
            mTableView.es.addPullToRefresh {
                [unowned self] in
                mLog("開(kāi)始下拉刷新")
                loadNewData()
                //            mTableView.es.stopPullToRefresh()
                /// 在這里做刷新相關(guān)事件
                /// ...
                //            /// 如果你的刷新事件成功,設(shè)置completion自動(dòng)重置footer的狀態(tài)
                //            mTableView.es.stopPullToRefresh(completion: true)
                //            /// 設(shè)置ignoreFooter來(lái)處理不需要顯示footer的情況
                //            mTableView.es.stopPullToRefresh(completion: true, ignoreFooter: false)
            }
        } else {
            mTableView.es.addPullToRefresh(animator: animator!) {
                [unowned self] in
                mLog("開(kāi)始下拉刷新")
                loadNewData()
            }
        }
    }

    func setupLoadMoreData(animator: (ESRefreshProtocol & ESRefreshAnimatorProtocol)? = nil) {
        mLog("上拉加載更多")
        if animator == nil {
            mTableView.es.addInfiniteScrolling {
                [unowned self] in
                /// 在這里做加載更多相關(guān)事件
                loadNewData()
                /// ...
                /// 如果你的加載更多事件成功,調(diào)用es_stopLoadingMore()重置footer狀態(tài)
                /// 通過(guò)es_noticeNoMoreData()設(shè)置footer暫無(wú)數(shù)據(jù)狀態(tài)
                //            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 = "松開(kāi)獲取最新數(shù)據(jù)"
        h.loadingDescription = "下拉刷新..."
        return h
    }

    var footer: ESRefreshFooterAnimator {
        let f = ESRefreshFooterAnimator(frame: CGRect.zero)
        f.loadingMoreDescription = "上拉加載更多"
        f.noMoreDataDescription = "數(shù)據(jù)已加載完"
        f.loadingDescription = "加載更多..."
        return f
    }
}
自定義動(dòng)畫(huà)

自定義動(dòng)畫(huà)視圖,遵守ESRefreshProtocol, ESRefreshAnimatorProtocol協(xié)議。
// 添加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
轉(zhuǎn)發(fā) ESPullToRefresh目錄分析:http://www.itdecent.cn/p/62d12b7f5058

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容