
try your best
ZHRefresh
Swift版的刷新控件, MJRefresh基于swift重寫.
MyZone
Contents
swift版的下拉刷新框架, 一行代碼搞定上拉加載, 下拉刷新.
-
開始使用
- 支持哪些控件刷新
- 如何安裝
- 類結構
-
常見API
- ZHRefreshComponent.swift
- ZHRefreshHeader.swift
- ZHRefreshFooter.swift
- ZHRefresh.swift
-
使用例子
- 參考
- 下拉刷新(默認)
- 下拉刷新(動畫圖片)
- 等......
支持哪些控件刷新
繼承自UIScollView的類都可以使用.如UIScrollView, UITableView, UICollectionView, WKWebView, UIWebView...
如何安裝
- 使用CocoaPods安裝
因為該框架是基于swift的, 所以請確保打開use_frameworks!的注釋, 允許使用動態(tài)庫.
pod 'ZHRefresh'
然后
pod install
在需要使用該框架的地方
import ZHRefresh
即可
類結構

類結構
常見API
ZHRefreshComponent.swift
/// 正在刷新的回調
public var refreshingBlock: ZHRefreshComponentRefreshingBlock?
/// 開始刷新后的回調(進入刷新狀態(tài)后的回調)
public var beginRefreshingCompletionBlock: ZHRefreshComponentbeiginRefreshingCompletionBlock?
/// 結束刷新的回調
public var endRefreshingCompletionBlock: ZHRefreshComponentEndRefreshingCompletionBlock?
/// 回調對象
public weak var refreshTarget: AnyObject?
/// 回調方法
public var refreshAction: Selector?
ZHRefreshHeader.swift
/// 類方法, 快速的創(chuàng)建下拉刷新控件
public static func headerWithRefresing(target: AnyObject, action: Selector) -> ZHRefreshHeader
/// 類方法, 快速的創(chuàng)建帶有正在刷新回調的下拉刷新控件
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
/// 類方法, 創(chuàng)建footer
static public func footerWithRefreshing(block: @escaping ZHRefreshComponentRefreshingBlock) -> ZHRefreshFooter
/// 提示沒有更多數(shù)據(jù)
public func endRefreshingWithNoMoreData()
/// 重置沒有更多數(shù)據(jù)
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提供模型數(shù)據(jù)
具體結構如下圖:

image
以下截屏皆取自iPhoneX
下拉刷新(默認)
code:
// MARK: - 下拉刷新 默認樣式
@objc func action01() {
/// 設置回調, 一旦進入刷新狀態(tài) 就會調用block
self.tableView.header = ZHRefreshNormalHeader.headerWithRefreshing { [weak self] in
guard let `self` = self else { return }
self.loadNewData()
}
/// 進入刷新狀態(tài)
self.tableView.header?.beginRefreshing()
}
screenShots:

image
下拉刷新(動畫圖片)
code:
// MARK: - 下拉刷新 動態(tài)圖片
@objc func action02() {
/// 一旦進入刷新狀態(tài) 就會調用target的action, 也就是調用self的loadNewData
self.tableView.header = ZHRefreshChiBaoZiHeader.headerWithRefresing(target: self, action: #selector(loadNewData))
self.tableView.header?.beginRefreshing()
}
screenShots:

image