iOS 的 UIScrollView 可以說(shuō)是十分強(qiáng)大,巧妙地運(yùn)用它可以得到一些意想不到的效果。本文將舉幾個(gè) ScrollView 不常見(jiàn)運(yùn)用的例子。
自帶信息應(yīng)用

這個(gè)界面既可以上下卷動(dòng),也可以左右滑動(dòng)拉出發(fā)送時(shí)間。
P.S. 氣死寶寶了,我做了一組精美的 gif,但是大小都超出簡(jiǎn)書限制.....無(wú)語(yǔ),大家就腦補(bǔ)一下效果吧。
這個(gè)效果大體看一下就非常像一個(gè)很大的 ScrollView,可以四個(gè)方向都能滑動(dòng)。但是 UITableView 只能上下滾動(dòng),硬要修改那就是大手術(shù),不推薦這樣做。因此我想到的方法是先創(chuàng)建一個(gè) ScrollView,將其 contentSize 設(shè)置為 TableView 的 contentSize,并將其寬度再設(shè)置大一個(gè)像素,這樣左右方向也可以滑動(dòng)了。然后監(jiān)聽 ScrollView 的滾動(dòng)事件,將其 contentOffset.y 綁定到 TableView 的 contentOffset.y 上, 那么 contentOffset.x 就可以來(lái)設(shè)置每個(gè) cell 的內(nèi)部效果了。
下面我們看看代碼:

前半部分很簡(jiǎn)單,就是一個(gè) TableView 的初始化,下面是我們的重點(diǎn),我創(chuàng)建了一個(gè) UIScrollView,讓其 frame 與 TableView 的一致,Inset 也需要一致,然后設(shè)置代理來(lái)監(jiān)聽滾動(dòng)事件。
那么最后一句是什么意思呢?
因?yàn)?ScrollView 會(huì)攔截其下面的 View 的觸摸事件,這樣我們的 Cell 就無(wú)法被選中了。因此我們必須讓 ScrollView 的 userInteractionEnabled 屬性為 false,這樣它就不響應(yīng)并攔截觸摸事件了,但是誰(shuí)來(lái)讓它滑動(dòng)呢?好在 iOS 把它內(nèi)部的一個(gè) UIPanGestureRecognizer 開放了出來(lái),我們就可以將其嫁接到 TableView 的身上,這樣 TableView 就既可以響應(yīng)點(diǎn)擊,也可以響應(yīng)滾動(dòng)了。
緊接著,我們需要知道 TableView 的內(nèi)容有多大,這個(gè)大小需要計(jì)算,那么什么時(shí)候這個(gè)大小會(huì)被計(jì)算完呢?就是在下面這個(gè)代理方法被調(diào)用時(shí):

我們更新 ScrollView 的
contentSize。
然后我們監(jiān)聽 ScrollView 的滾動(dòng)事件:

這就應(yīng)該很簡(jiǎn)單了,分別將 x、y 應(yīng)用到響應(yīng)的屬性即可,y 軸就給 TableView,讓其可以上下卷動(dòng),x 軸就給每個(gè) cell,讓其做自己的處理。
最終效果如下:(不動(dòng)右鍵新標(biāo)簽打開)

主頁(yè)面 Spotlight 效果
先看最終效果:(不動(dòng)右鍵新標(biāo)簽打開)

實(shí)現(xiàn)和上面差不多,開頭聲明部分一致,代理方法如下:

這里為了實(shí)現(xiàn)吸附效果,我用到了 scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) 這個(gè)方法,它的作用是通知代理用戶已經(jīng)松開手指,現(xiàn)在視圖將會(huì)以一個(gè)速度卷動(dòng)到一個(gè)目標(biāo)位置,并且這個(gè)目標(biāo)位置是可以用指針修改的。所以我只需判斷一下視圖將會(huì)滾動(dòng)到什么位置,如果超過(guò)一個(gè)臨界值,就讓它完全滾動(dòng)出來(lái),否則就滾動(dòng)回去。
本文通過(guò)這兩個(gè)小例子希望能起到拋磚引玉的作用,其實(shí)許多效果的實(shí)現(xiàn)都可以牽扯到 ScrollView 的運(yùn)用。最后還是推薦大家關(guān)注一下 WWDC,很多 Session 都很有啟發(fā)性。
參考 Session:
WWDC 2014 - Session 235: Advanced Scrollviews and Touch Handling Techniques
WWDC 2013 - Session 217: Exploring Scroll Views on iOS 7
WWDC 2012 - Session 223: Enhancing User Experience with Scroll Views
WWDC 2011 - Session 104: Advanced ScrollView Techniques