ZVRefreshing
ZVRefreshing是一个纯Swift、易用的刷新组件。
需求
- iOS 8.0+
Swift版本 | 存储库版本 |
---|---|
Swift 5.0 | > 2.2.0 |
Swift 4.2 | < 2.1.3 |
安装
CocoaPod
CocoaPods是一个用于Swift和Objective-C Cocoa项目的依赖管理器。
您可以使用以下命令安装CocoaPods:
$ sudo gem install cocoapods
要使用CocoaPods将ZVRefreshing
集成到您的项目中,请将其指定到您的Podfile
中。
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
target 'TargetName' do
use_frameworks!
pod 'ZVRefreshing' ~> '2.0.0'
end
然后,使用CocoaPods安装您的依赖项。
$ pod install
Carthage
Carthage旨在成为向您的应用程序添加框架的最简单方式。
您可以使用以下命令使用Homebrew安装Carthage
$ brew update
$ brew install carthage
要使用Carthage将ZVRefreshing
集成到项目中,请将其指定到您的Cartfile
github "zevwings/ZVRefreshing" ~> 0.0.1
然后,使用carthage update
构建框架,并将ZVRefreshing.framework
拖入您的项目。
注意
框架位于Carthage/Build目录中,您应该将其拖入目标
-> 通用
-> 嵌入的二进制文件
手动
下载此项目,并将ZRefreshing.xcodeproj
拖入您的项目。
在您的目标的“通用”选项卡中,点击嵌入的二进制文件
下的“+”按钮。
选择ZRefreshing.framework
将其添加到您的平台。
示例
尝试
您可以在Appetize上查看在线示例。
通用用法
当您需要添加一个刷新控件时,可以使用import ZVRefreshing
初始化
有三种方法可以初始化该控件。
- 目标-动作
let header = ZVRefreshNormalHeader(target: NSObject, action: Selector)
self.tableView.header = header
- 块
let header = ZVRefreshNormalHeader(refreshHandler: { [weak self] in
// your codes
})
self.tableView.header = header
- 无参数
let header = RefreshHeader()
self.tableView.header = header
如果您使用无参数方式初始化控件,您可以使用以下代码添加刷新处理程序块或目标-动作
- 添加一个刷新处理程序
// add refresh handler
header?.refreshHandler = {
// your codes
}
- 添加一个目标-动作
// add refresh target-action
header?.addTarget(Any?, action: Selector)
- 添加一个目标-动作-UIControlEvents.valueChanged
// The ZVRefreshComponent extend from UIControl, When isRefreshing properties changed will send a UIControlEvents.valueChanged event.
header?.addTarget(Any, action: Selector, for: .valueChanged)
函数
功能和头部和底部相同。
- beginRefreshing()
控件开始进入刷新状态。
self.tableView.header?.beginRefreshing()
- endRefreshing()
控件开始进入空闲状态。
self.tableView.header?.endRefreshing()
- setTitle(_:forState:) 用于自定义控件标题,此函数在
ZVRefreshStateHeader
中。
header.setTitle("pull to refresh...", forState: .idle)
header.setTitle("release to refresh...", forState: .pulling)
header.setTitle("loading...", forState: .refreshing)
或
footer.setTitle("pull to refresh...", forState: .idle)
footer.setTitle("release to refresh...", forState: .pulling)
footer.setTitle("loading...", forState: .refreshing)
footer.setTitle("no more data", forState: .noMoreData)
- setImages(_:forState:) 用于自定义控件图像,此函数在
ZVRefreshAnimationHeader
中,您可以使用以下代码,也可以扩展一个子类,例如 示例
self.setImages(idleImages, forState: .idle)
self.setImages(refreshingImages, forState: .pulling)
self.setImages(refreshingImages, forState: .refreshing)
属性
头部
- lastUpdatedTimeKey 用于存储使用此控件的最后时间,如果没有设置,则所有控件共享密钥
com.zevwings.refreshing.lastUpdateTime
header.lastUpdatedTimeKey = "custom last updated key"
- ignoredScrollViewContentInsetTop
当您的表格设置 contentInset
属性时,您应该设置它,例如
self.tableView.contentInset = UIEdgeInsets(top: 30, left: 0, bottom:0, right: 0)
header.ignoredScrollViewContentInsetTop = 30
- lastUpdatedTimeLabel
用于自定义 UILabel
属性的 lastUpdatedTimeLabel
,例如
// hide the lastUpdatedTimeLabel
header.lastUpdatedTimeLabel.isHidden = true
或
// set the font for lastUpdatedTimeLabel
header.lastUpdatedTimeLabel.font = .systemFont(ofSize: 16.0)
- lastUpdatedTimeLabelText
自定义显示上一次的时间格式。
header.lastUpdatedTimeLabelText = { date in
if let d = date {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
return "Last updated:\(formatter.string(from: d))"
}
return "There is no record"
}
页脚
- isAutomaticallyHidden 设置小部件自动隐藏,默认为
true
footer.isAutomaticallyHidden = false
- ignoredScrollViewContentInsetBottom 当你的表格设置
contentInset
属性时,你需要设置它,例如
self.tableView.contentInset = UIEdgeInsets(top:0, left: 0, bottom:30, right: 0)
footer.ignoredScrollViewContentInsetBottom = 30
- isAutomaticallyRefresh 设置小部件的自动刷新,默认为
true
,这个属性在ZVRefreshAutoFooter
footer.isAutomaticallyRefresh = false
通用
以下属性对头部和尾部都是相同的。
- labelInsetLeft 设置 activityIndicator 和 label 之间的空白宽度。
header.labelInsetLeft = 32.0
-
activityIndicator 自定义
activityIndicator
的属性,属性请参考 ZActivityIndicatorView -
tintColor 自定义所有子小部件的颜色。
header.tintColor = .black
- stateLabel 自定义
UILabel
的stateLabel
属性,例如
// hide the stateLabel
header.stateLabel.isHidden = true
或
// set the font for stateLabel
header.stateLabel.font = .systemFont(ofSize: 16.0)
- animationView
自定义 UIImageView
的 stateLabel
属性,例如
自定义用法
你可以扩展 ZVRefreshComponent
或它的子类来自定义自己的刷新小部件。例如 示例。
属性
- state
当刷新状态改变时,自定义你需要的。
open var state: ZVRefreshComponent.State
- pullingPercent
当小部件位置改变时,自定义你需要的。
open var pullingPercent: CGFloat
- tintColor
自定义你自己的小部件颜色。
open override var tintColor: UIColor!
函数
- prepare
定义你自己的控件,在 init(frame: CGRect)
时调用。
open func prepare() {}
- placeSubViews
设置你自己的控件大小和位置,在 layoutSubviews()
时调用。
open func placeSubViews() {}
- scrollViewContentOffsetDidChanged
观察 UIScrollView.contentOffset,在 UIScrollView.contentOffset
值改变时调用。
open func scrollViewContentOffsetDidChanged(_ change: [NSKeyValueChangeKey: Any]?) {}
- scrollViewContentSizeDidChanged
要观察UIScrollView.contentSize,请在UIScrollView.contentSize
值发生变化时调用。
open func scrollViewContentSizeDidChanged(_ change: [NSKeyValueChangeKey: Any]?) {}
- scrollViewPanStateDidChanged
要观察UIScrollView.panGestureRecognizer.state,请在UIScrollView.panGestureRecognizer.state
值发生变化时调用。
open func scrollViewPanStateDidChanged(_ change: [NSKeyValueChangeKey: Any]?) {}
Rx支持
如果您想使用RxSwift,请参考ZVRefreshing+Rx.swift。
然后,您可以使用以下代码启动刷新动作。
Observable.just(true)
.asDriver(onErrorJustReturn: false)
.drive(flatHeader!.rx.isRefreshing)
.disposed(by: disposeBag)
或者,您可以使用这段代码来观察刷新状态。
flatHeader?.rx.refresh
.subscribe(onNext: { isRefreshing in
print("onNext isRefreshing : \(isRefreshing)")
}, onError: { err in
print("err : \(err)")
}, onCompleted: {
print("completed")
}, onDisposed: {
print("disposed")
}).disposed(by: disposeBag)
更多用法
您可以参考示例了解更多使用方法。
问题或建议
您可以在GitHub向我提交问题或者发送邮件至[email protected]。如果您有好的想法,告诉我。谢谢。
许可证
ZVRefreshing
在MIT许可证的条款和条件下分发。