CocoaPods trunk is moving to be read-only. Read more on the blog, there are 17 months to go.

ZHRefresh 0.1.9

ZHRefresh 0.1.9

Maintained by charles.



ZHRefresh 0.1.9

ZHRefresh

Swift版的刷新控件, MJRefresh的翻版

Contents

swift版的下拉刷新框架, 一行代码搞定上拉加载, 下拉刷新


支持哪些控件刷新

继承自UIScollView的类都可以使用.如 UIScrollView, UITableView, UICollectionView, WKWebView, UIWebView...

如何安装

  • 使用CocoaPods安装

因为该框架是基于swift的, 所以请确保打开use_frameworks!的注释, 允许使用动态库.

pod 'ZHRefresh'

然后

pod install

在需要使用该框架的地方

import ZHRefresh

即可


类结构

类结构

ZHRefreshComponent.swift

    /// 正在刷新的回调
    public var refreshingBlock: ZHRefreshComponentRefreshingBlock?
    /// 开始刷新后的回调(进入刷新状态后的回调)
    public var beginRefreshingCompletionBlock: ZHRefreshComponentbeiginRefreshingCompletionBlock?
    /// 结束刷新的回调
    public var endRefreshingCompletionBlock: ZHRefreshComponentEndRefreshingCompletionBlock?
    /// 回调对象
    public weak var refreshTarget: AnyObject?
    /// 回调方法
    public var refreshAction: Selector?
    

ZHRefreshHeader.swift

    /// 类方法, 快速的创建下拉刷新控件
    public static func headerWithRefresing(target: AnyObject, action: Selector) -> ZHRefreshHeader
    /// 类方法, 快速的创建带有正在刷新回调的下拉刷新控件
    public static func headerWithRefreshing(block: @escaping ZHRefreshComponentRefreshingBlock) -> ZHRefreshHeader
    /// 忽略多少scrollView的contentInset的top
    public var ignoredScrollViewContentInsetTop: CGFloat = 0.0
    /// 上一次下拉刷新成功的时间
    public var lastUpdatedTime: Date?

ZHRefreshFooter.swift

	  /// 带有回调target和action的footer
    static public func footerWithRefreshing(target: AnyObject, action: Selector) -> ZHRefreshFooter
	  /// 类方法, 创建footer
     static public func footerWithRefreshing(block: @escaping ZHRefreshComponentRefreshingBlock) -> ZHRefreshFooter
    /// 提示没有更多数据
    public func endRefreshingWithNoMoreData()
    /// 重置没有更多数据
    public func resetNoMoreData()

ZHRefresh.swift

   /// header and footer
	public extension UIScrollView {
    /// header
     @objc dynamic var header: ZHRefreshHeader? {
        get {
            return objc_getAssociatedObject(self, &ZHRefreshKeys.header) as? ZHRefreshHeader
        }
        set {
            if let newHeader = newValue {
                if let oldHeader = header {
                    /// 如果有旧值, 删除它
                    oldHeader.removeFromSuperview()
                }
                /// 添加新的
                self.insertSubview(newHeader, at: 0)
                /// 存储新值
                objc_setAssociatedObject(self, &ZHRefreshKeys.header, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_ASSIGN)
            }
        }
    }

    /// footer
     @objc dynamic var footer: ZHRefreshFooter? {
        get {
            return objc_getAssociatedObject(self, &ZHRefreshKeys.footer) as? ZHRefreshFooter
        }
        set {
            if let newFooter = newValue {
                if let oldFooter = footer {
                    /// 如果有旧值, 删除它
                    oldFooter.removeFromSuperview()
                }
                /// 添加新值
                self.insertSubview(newFooter, at: 0)
                /// 存储新值
                objc_setAssociatedObject(self, &ZHRefreshKeys.footer, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_ASSIGN)
            }
        }
    }
}

参考

请下载源程序, 并打开附带的demo程序 Example->ZHRefresh.xcworkspace

  • MainViewController.swift 主入口
  • CollectionViewController.swift 提供collectionView相关的实例程序
  • TableViewController.swift提供tableView相关的实例程序
  • WebViewController.swift提供webView相关的实例程序
  • Example.swift提供模型数据

具体结构如下图:

以下截屏皆取自iPhoneX

下拉刷新(默认)

code:

  // MARK: - 下拉刷新 默认样式

    @objc func action01() {
        /// 设置回调, 一旦进入刷新状态 就会调用block
        self.tableView.header = ZHRefreshNormalHeader.headerWithRefreshing { [weak self] in
            guard let `self` = self else { return }
            self.loadNewData()
        }
        /// 进入刷新状态
        self.tableView.header?.beginRefreshing()
    }

screenShots:

下拉刷新(动画图片)

code:

  // MARK: - 下拉刷新 动态图片

    @objc func action02() {
        /// 一旦进入刷新状态 就会调用target的action, 也就是调用self的loadNewData
        self.tableView.header = ZHRefreshChiBaoZiHeader.headerWithRefresing(target: self, action: #selector(loadNewData))
        self.tableView.header?.beginRefreshing()
    }

screenShots: