前言
在移動應(yīng)用實際開發(fā)過程中袭祟,往往會有多個scrollview嵌套的界面需求,這種需求已經(jīng)司空見慣捞附,解決方案也多種多樣巾乳,這里就介紹一下我認(rèn)為最優(yōu)的解決方案。
效果圖:
結(jié)構(gòu)解讀:
底層有一個UIScrollview子類故俐,這里叫它mainScrollview想鹰;
mainScrollview下方嵌套了兩個視圖(通常這兩個視圖也用UIScrollview子類來處理,這里叫它moduleScrollview)药版。
毫無疑問辑舷,我們通常的做法是在mainScrollview的下方先嵌套一個橫向滾動的UIScrollview子類,再在這個橫向滾動的視圖上嵌套n個子模塊(像gif中的“圖文詳情”和“客戶評分”兩個子模塊)槽片。
這點我不做過多解釋何缓,結(jié)構(gòu)的搭建爭議不大,重點在交互上还栓。
嘗試過的思路:
有一種思路總結(jié)起來是碌廓,通過開啟或者禁止mainScrollview和moduleScrollview的交互來達到何時響應(yīng)某個scrollview的目的。在手指拖動的臨界狀態(tài)剩盒,通過大量的判斷邏輯來主動控制某些scrollview的偏移量谷婆,進而達到“欺騙觀眾”的響應(yīng)拖動狀態(tài)。
缺點:邏輯復(fù)雜程度過大,容錯處理很多纪挎,致命的缺陷是臨界狀態(tài)無法實現(xiàn)scrollview的減速效果(慣性效果)期贫,當(dāng)然有的開發(fā)者會說利用核心動畫能實現(xiàn)這一效果,但是异袄,我認(rèn)為這就太費周折了通砍。
最佳方案:
首先我們來了解一個UIGestureRecognizerDelegate協(xié)議擬定的方法:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
這個方法的作用大致可以理解為是否允許手勢穿透。在iOS開發(fā)中烤蜕,相同的手勢封孙,響應(yīng)者往往是最上層的視圖,所以重寫這個方法返回為YES就可以讓下層的視圖響應(yīng)同樣的手勢讽营。
值得注意的是虎忌,UIScrollview實現(xiàn)了這個協(xié)議的方法,所以橱鹏,我們可以讓子模塊直接繼承UIScrollview(或其子類)呐籽,然后重寫該方法。
如此一來蚀瘸,我們需要做的,僅僅是判斷何時不讓某個scrollview改變偏移量即可庶橱。
優(yōu)點:實現(xiàn)簡單贮勃,絲滑無卡頓
核心思想:讓moduleScrollview 和mainScrollview 同時響應(yīng)上拉或者下拉手勢,只需判斷何時不允許某個scrollview改變contentOffset
DEMO
GitHub地址:https://github.com/indulgeIn/YBMultistageScrollView
注意:DEMO中嵌套進了UIWebview苏章,并簡單做了邏輯處理方案寂嘉,會有性能問題