正逢國慶假期,抽時間學習Swift3.0,效果圖如下:
Xcode8.0刷新控件貌似是有問題的,調用beginRefresh 空白一片什么否不顯示,所以自定義了個新控件,同時也解決了拖拽不放手,下拉到一定程度會自動刷新的問題。
func loadData() { refreshControl.beginRefreshing() print("開始刷新v"); DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2) { print("結束刷新v") self.refreshControl.endRefreshing() } }
控件是繼承UIControl的,適用于tableView和collectionView,其核心是通過KVO監聽父視圖的 contentOffset屬性,實現不同的刷新狀態。核心方法有:
open func willMove(toSuperview newSuperview: UIView?)
willMove 方法在父視圖addSubView的時候會調用,當添加到父視圖的時候 newSuperview 是父視圖當父視圖移除的時候,此方法也會被調用,newSuperview是nil,通過此方法可以拿到父視圖的tableview并監聽contentOffset屬性scrollView?.addObserver(self, forKeyPath: "contentOffset", options: [], context: nil)
,所有的KVO監聽都會調用
func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?)
觀察者模式 在不需要的時候都需要釋放,通知如果不釋放,什么也不會發什么,但是會造成內存泄漏,會有多此注冊的可能,KVO如果不釋放就會崩潰func removeFromSuperview()
通過此方法移除監聽,在監聽方法中我們主要通過tableView的偏移值對刷新的狀態進行判斷,并通過改變contentInset屬性值來讓刷新視圖停留在正在刷新的視圖上。
在寫代碼的時候發現幾個小問題:
1.因為涉及布局問題,第一想到的就是SnapKit,并在github上看了一下是支持Swift3.0 的果斷Pod下來,是指定了版本的
Pod文件也是按照官方寫的
但是一Pod下來 打開,就讓我轉換swift版本,好奇怪,無論我轉不轉都是幾百個報錯????,搞不清楚狀況。。。(高能的大神指點迷津吧)
于是不得不用LayoutConstraint了。
2.在讓箭頭做旋轉動畫的時候,發現 transform默認是順時針旋轉的,要想實現原路旋轉回來,需要調整一個非常小的值(好投機啊)
3.第三個問題很無厘頭,搞不明白,在KVO監聽tableview發生的位移大于設定的值時候,調用beginRefresh的方法,改變tableview的contentInset.top 的值,并修改刷新狀態的枚舉值,在KVO的方法判斷狀態就不會再調用beginRefresh的方法了,可實際上一直在修改tableview的contentInset.top,就是不走` refrershView.refreshStatus = .WillRefresh'這句,最后沒辦法,把這就話放在contentInset.top 才得以解決問題。
有興趣 大家可以去看下,是什么問題
Demo地址:https://github.com/iosyaowei/refreshDemo