美文网首页
Swift-2句代码添加MJRefresh上下拉刷新

Swift-2句代码添加MJRefresh上下拉刷新

作者: SK丿希望 | 来源:发表于2018-11-27 18:34 被阅读0次

2句代码添加上下拉刷新

scrollView.hw_hearderRefreshBlock = { // 下拉刷新
// 你的逻辑
}

scrollView.hw_footerRefreshBlock = { // 上拉刷新
// 你的逻辑
}

使用案例

     override func viewDidLoad() {
        super.viewDidLoad()
        let scrollView = UIScrollView.init(frame: self.view.bounds)
        scrollView.backgroundColor = UIColor.white
        scrollView.hw_hearderRefreshBlock = { // 下拉刷新
            DispatchQueue.main.asyncAfter(deadline: .now()+0.3, execute: {
                print("下拉刷新结束")
                scrollView.endRefreshing()
            })
        }
        scrollView.hw_footerRefreshBlock = { // 上拉刷新
            DispatchQueue.main.asyncAfter(deadline: .now()+0.3, execute: {
                print("上拉刷新结束")
                scrollView.endRefreshing()
            })
        }
        scrollView.beginRefreshing()
        view.addSubview(scrollView)
    }

image.png

实现原理:

主要是通过RuntimeUIScrollView添加2个闭包,在需要调用闭包是判断UIScrollView对应的mj_headermj_footer是否存在,不存在给其添加对应的属性,下面还是看代码吧

import UIKit
import MJRefresh

extension UIScrollView {
    
    private struct RuntimeKey {
        static let HearderRefreshBlockKey = UnsafeRawPointer.init(bitPattern: "HearderRefreshBlockKey".hashValue)
        static let FooterRefreshBlockKey = UnsafeRawPointer.init(bitPattern: "FooterRefreshBlockKey".hashValue)
    }
    /// 下拉刷新的回调
    var hw_hearderRefreshBlock: (()->())? {
        set {
            if mj_header == nil { addHearderRefresh() } // 如果不存在 就自动添加
            objc_setAssociatedObject(self, UIScrollView.RuntimeKey.HearderRefreshBlockKey!, newValue, .OBJC_ASSOCIATION_COPY_NONATOMIC)
        }
        get {
            return objc_getAssociatedObject(self, UIScrollView.RuntimeKey.HearderRefreshBlockKey!) as? (()->())
        }
    }
    /// 上拉刷新的回调
    var hw_footerRefreshBlock: (()->())? {
        set {
            if mj_footer == nil { addFooterRefresh() } // 如果不存在 就自动添加
            objc_setAssociatedObject(self, UIScrollView.RuntimeKey.FooterRefreshBlockKey!, newValue, .OBJC_ASSOCIATION_COPY_NONATOMIC)
        }
        get {
            return objc_getAssociatedObject(self, UIScrollView.RuntimeKey.FooterRefreshBlockKey!) as? (()->())
        }
    }
    
    /// 单独使用下拉刷新
    private func addHearderRefresh() {
        let header = MJRefreshNormalHeader { [weak self] in
            if self == nil {return}
            if self?.mj_footer?.isRefreshing == true { // 如果上拉正在执行 将其结束
                self?.mj_footer?.endRefreshing()
            }
            if self?.mj_header?.isRefreshing == true {
                if self?.hw_hearderRefreshBlock == nil {return}
                self?.hw_hearderRefreshBlock!()
            }
        }
        mj_header = header
    }
    /// 单独使用上拉刷新
    private func addFooterRefresh() {
        let footer = MJRefreshBackNormalFooter { [weak self] in
            if self == nil {return}
            if self?.mj_header?.isRefreshing == true { // 如果下拉正在执行 将其结束
                self?.mj_header?.endRefreshing()
            }
            if self?.mj_footer?.isRefreshing == true {
                if self?.hw_footerRefreshBlock == nil {return}
                self?.hw_footerRefreshBlock!()
            }
        }
        mj_footer = footer
    }
    /// 结束刷新
    open func endRefreshing() {
        if mj_footer?.isRefreshing == true {
            mj_footer?.endRefreshing()
        }
        if mj_header?.isRefreshing == true  {
            mj_header?.endRefreshing()
        }
        
    }
    /// 开始刷新
    open func beginRefreshing() {
        mj_header?.beginRefreshing()
    }
}

Doem

相关文章

网友评论

      本文标题:Swift-2句代码添加MJRefresh上下拉刷新

      本文链接:https://www.haomeiwen.com/subject/gldnqqtx.html