3.IOS(swift)-scrollView ·相關代理

UIScrollView(包括它的子類 UITableView 和 UICollectionView)是 iOS 開發(fā)中最常用也是最有意思的 UI 組件瓣窄,大部分 App 的核心界面都是基于三者之一或三者的組合實現揖铜。

UIScrollViewDelegate

UIScrollViewDelegate 是 UIScrollView 的 delegate protocol票顾,UIScrollView 有意思的功能都是通過它的 delegate 方法實現的蛋铆。了解這些方法被觸發(fā)的條件及調用的順序對于使用 UIScrollView 是很有必要的,本文主要講拖動相關的效果骨田,所以 zoom 相關的方法跳過不提埠通,拖動相關的 delegate 方法按調用順序分別是:

optional func scrollViewDidScroll(scrollView: UIScrollView)    

這個方法在任何方式觸發(fā) contentOffset 變化的時候都會被調用(包括用戶拖動,減速過程晦攒,直接通過代碼設置等)闽撤,可以用于監(jiān)控 contentOffset 的變化,并根據當前的 contentOffset 對其他 view 做出隨動調整脯颜。

 optional func scrollViewWillBeginDragging(scrollView: UIScrollView)

用戶開始拖動 scroll view 的時候被調用哟旗。

optional func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>)

該方法從 iOS 5 引入,在 didEndDragging 前被調用栋操,當 willEndDragging 方法中 velocity 為 CGPointZero(結束拖動時兩個方向都沒有速度)時闸餐,didEndDragging 中的 decelerate 為 NO,即沒有減速過程讼庇,willBeginDecelerating 和 didEndDecelerating 也就不會被調用绎巨。反之,當 velocity 不為 CGPointZero 時蠕啄,scroll view 會以 velocity 為初速度场勤,減速直到 targetContentOffset戈锻。值得注意的是,這里的 targetContentOffset 是個指針和媳,沒錯格遭,你可以改變減速運動的目的地,這在一些效果的實現時十分有用留瞳,實例章節(jié)中會具體提到它的用法拒迅,并和其他實現方式作比較。

optional func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool)

在用戶結束拖動后被調用她倘,decelerate 為 YES 時璧微,結束拖動后會有減速過程。注硬梁,在 didEndDragging 之后前硫,如果有減速過程,scroll view 的 dragging 并不會立即置為 NO荧止,而是要等到減速結束之后屹电,所以這個 dragging 屬性的實際語義更接近 scrolling。

optional func scrollViewWillBeginDecelerating(scrollView: UIScrollView)

減速動畫開始前被調用跃巡。

optional func scrollViewDidEndDecelerating(scrollView: UIScrollView) 

減速動畫結束時被調用危号,這里有一種特殊情況:當一次減速動畫尚未結束的時候再次 drag scroll view,didEndDecelerating 不會被調用素邪,并且這時 scroll view 的 dragging 和 decelerating 屬性都是 YES外莲。新的 dragging 如果有加速度,那么 willBeginDecelerating 會再一次被調用兔朦,然后才是 didEndDecelerating苍狰;如果沒有加速度,雖然 willBeginDecelerating 不會被調用烘绽,但前一次留下的 didEndDecelerating 會被調用,所以連續(xù)快速滾動一個 scroll view 時俐填,delegate 方法被調用的順序(不含 didScroll)可能是這樣的:

Paste_Image.png

雖然很少有因為這個導致的 bug安接,但是你需要知道這種很常見的用戶操作會導致的中間狀態(tài)。例如你嘗試在 UITableViewDataSource 的 tableView:cellForRowAtIndexPath: 方法中基于 tableView 的 dragging 和 decelerating 屬性判斷是在用戶拖拽還是減速過程中的話可能會誤判

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末英融,一起剝皮案震驚了整個濱河市盏檐,隨后出現的幾起案子,更是在濱河造成了極大的恐慌驶悟,老刑警劉巖胡野,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異痕鳍,居然都是意外死亡硫豆,警方通過查閱死者的電腦和手機龙巨,發(fā)現死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來熊响,“玉大人旨别,你說我怎么就攤上這事『骨眩” “怎么了秸弛?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長洪碳。 經常有香客問我递览,道長,這世上最難降的妖魔是什么瞳腌? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任绞铃,我火速辦了婚禮,結果婚禮上纯趋,老公的妹妹穿的比我還像新娘憎兽。我一直安慰自己,他們只是感情好吵冒,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布纯命。 她就那樣靜靜地躺著,像睡著了一般痹栖。 火紅的嫁衣襯著肌膚如雪亿汞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天揪阿,我揣著相機與錄音疗我,去河邊找鬼。 笑死南捂,一個胖子當著我的面吹牛吴裤,可吹牛的內容都是我干的。 我是一名探鬼主播溺健,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼麦牺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鞭缭?” 一聲冷哼從身側響起剖膳,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎岭辣,沒想到半個月后吱晒,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡沦童,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年仑濒,在試婚紗的時候發(fā)現自己被綠了叹话。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡躏精,死狀恐怖渣刷,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情矗烛,我是刑警寧澤辅柴,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站瞭吃,受9級特大地震影響碌嘀,放射性物質發(fā)生泄漏。R本人自食惡果不足惜歪架,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一股冗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧和蚪,春花似錦止状、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至催束,卻和暖如春集峦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抠刺。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工塔淤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人速妖。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓高蜂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親罕容。 傳聞我的和親對象是個殘疾皇子妨马,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容