Swift 讓我來告訴你封裝下拉刷新多么簡單

linger 8年前發布 | 32K 次閱讀 Swift Apple Swift開發

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()

刷新的效果圖

Swift 讓我來告訴你封裝下拉刷新多么簡單

HeaderRefresh.png

Swift 讓我來告訴你封裝下拉刷新多么簡單

FooterRefresh.png

2、如何去封裝自己的刷新控件

這里分享一下封裝刷新控件的心路歷程

① 創建刷新視圖,并創建View的各種狀態

Swift 讓我來告訴你封裝下拉刷新多么簡單

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 方法無響應,最后采取了監測 ScrollViewpan 手勢識別,來處理拖拽響應。
如果你有好的建議,歡迎與我討論

③根據ScrollViewcontentOffset 來區分是下拉刷新還是上拉加載,然后根據 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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!