Swift 讓我來告訴你封裝下拉刷新多么簡單
下拉刷新可以說是每個項目的必須品,最近在做一個 Swift
的項目,本著以鍛煉自己的目的,封裝了一個下拉刷新庫 LCRefresh
,在這里分享給大家。
1、如何使用 LCRefresh
使用 LCRefresh
非常方便,只需添加一行代碼。
添加下拉刷新 和 上拉加載
table.addRefreshHeaderWithBlock {
print("Header 刷新")
//TODO
}
table.addRefreshFooterWithBlock {
print("Footer 刷新")
//TODO
}
完成刷新
weak var weakSelf = self
if weakSelf!.table.isHeaderRefreshing() {
weakSelf!.table.endHeaderRefreshing()
}
if weakSelf!.table.isFooterRefreshing() {
weakSelf!.table.endFooterRefreshing()
}
數據加載完畢
weakSelf!.table.setDataLoadover()
weakSelf!.table.resetDataLoad()
刷新的效果圖
HeaderRefresh.png
FooterRefresh.png
2、如何去封裝自己的刷新控件
這里分享一下封裝刷新控件的心路歷程
① 創建刷新視圖,并創建View的各種狀態
LCRefreshHeader
extension LCRefreshHeader{
/** 各種狀態切換 */
private func setNomalStatus() {
if activity.isAnimating() {
activity.stopAnimating()
}
activity.hidden = true
contenLab.text = "下拉可以刷新"
image.hidden = false
UIView.animateWithDuration(0.2) {
self.image.transform = CGAffineTransformIdentity
}
}
private func setWaitRefreshStatus() {
if activity.isAnimating() {
activity.stopAnimating()
}
activity.hidden = true
contenLab.text = "松開立即刷新"
image.hidden = false
UIView.animateWithDuration(0.2) {
self.image.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI))
}
}
private func setRefreshingStatus() {
activity.hidden = false
activity.startAnimating()
contenLab.text = "正在刷新數據..."
image.hidden = true
}
}
②拓展 UIScrollView
把刷新View添加在 ScrollView
上
/** 添加下拉刷新 */
func addRefreshHeaderWithBlock(refreshBlock:()->Void){
/** 添加header */
weak var weakSelf = self
header = LCRefreshHeader.instanceFromNibBundle() as? LCRefreshHeader
guard header != nil else{
print("Header加載失敗")
return
}
header!.center = LCRefreshHeaderCenter
let headerView = UIView.init(frame: CGRectMake(LCRefreshHeaderX, LCRefreshHeaderY, LCRefreshScreenWidth, LCRefreshHeaderHeight))
headerView.backgroundColor = UIColor.clearColor()
headerView.addSubview(header!)
weakSelf!.addSubview(headerView)
/** 設置代理信息 */
weakSelf!.delegate = weakSelf
weakSelf!.panGestureRecognizer.addTarget(weakSelf!, action: #selector(UIScrollView.scrollViewDragging(_:)))
lcHeaderBlock = refreshBlock
}
添加視圖,設置 delegate 來監測
ScrollView
滑動,由于是在 extension 中,delegate 中的scrollViewDidEndDragging
方法無響應,最后采取了監測ScrollView
的pan
手勢識別,來處理拖拽響應。
如果你有好的建議,歡迎與我討論
③根據ScrollView
的 contentOffset
來區分是下拉刷新還是上拉加載,然后根據 contentOffset
的值來切換刷新View的狀態
/** 滑動相關 */
public func scrollViewDidScroll(scrollView: UIScrollView) {
let offSet = scrollView.contentOffset.y
let scrollHeight = scrollView.bounds.size.height
let inset = scrollView.contentInset
var currentOffset = offSet + scrollHeight - inset.bottom
let maximumOffset = scrollView.contentSize.height
/** 數據未充滿屏幕的情況 **/
if maximumOffset < scrollHeight {
currentOffset = offSet + maximumOffset - inset.bottom
}
if offSet < 0 {
/** 下拉刷新 */
scrollHeader(offSet)
refreshObj = LCRefreshObject.Header
}else if currentOffset - maximumOffset > 0 {
/** 上拉刷新 */
guard footer!.refreshStatus != LCRefreshFooterStatus.Loadover else {
return
}
scrollFooter(currentOffset - maximumOffset)
refreshObj = LCRefreshObject.Footer
}else{
/** 無刷新對象 */
refreshObj = LCRefreshObject.None
}
}
View狀態切換
private func scrollHeader(offSet: CGFloat) {//參數為負數
guard header != nil else{
print("Header加載失敗")
return
}
guard header!.refreshStatus != LCRefreshHeaderStatus.Refreshing else{
return
}
if offSet < -LCRefreshHeaderHeight {
header!.setStatus(LCRefreshHeaderStatus.WaitRefresh)
}else{
header!.setStatus(LCRefreshHeaderStatus.Normal)
}
}
④最后拖拽結束時再根據刷新對象切換View 到刷新狀態。
/** 拖拽相關 */
func scrollViewDragging(pan: UIPanGestureRecognizer){
if pan.state == .Ended{
if refreshObj == LCRefreshObject.Header {
draggHeader()
}else if refreshObj == LCRefreshObject.Footer{
draggFooter()
}
}
}
這之間涉及到
contentOffset
值的設置,在這里就不一一明說了,給出的源碼里都有。
現在只是開發出了這一種樣式,以后會更多的樣式以供大家使用,當然,你也可以根據給出的源碼自己來修改樣式。
來自:http://www.jianshu.com/p/725cd8028c8a
本文由用戶 linger 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!