相信很多人都沒有注意到iOS有這樣一個(gè)隱藏的功能:當(dāng)前頁面有滾動(dòng)視圖(UIScrollView或者UIScrollView的子類纺裁,下面我都稱作滾動(dòng)視圖)勺疼,觸摸狀態(tài)欄斋射,視圖會(huì)自動(dòng)滾動(dòng)的最頂端辙培,相當(dāng)于一些網(wǎng)頁的回到頂端的功能朝抖。下面給個(gè)圖來展示下:
圖1:觸摸狀態(tài)欄回到頂部
一. 遇到的問題
如果頁面有多個(gè)滾動(dòng)視圖,如頂部一個(gè)廣告輪播控件(假如是基于UIScrollView
的輪播控件)梳玫,下面是一個(gè)TableView爹梁,你會(huì)發(fā)現(xiàn)觸摸狀態(tài)欄沒有反應(yīng)了,回到頂部功能失效提澎。
二. 解決問題
細(xì)細(xì)研究了一番返現(xiàn)卫键,UIScrollView
有個(gè)scrollsToTop屬性,這個(gè)屬性就是控制滾動(dòng)到頂部手勢(shì)的開關(guān)虱朵。它的默認(rèn)值是YES
莉炉,所以不用我們?cè)O(shè)置,默認(rèn)是支持滾動(dòng)到頂部的碴犬。具體詳細(xì)描述如下:
The scroll-to-top gesture is a tap on the status bar. When a user makes this gesture, the system asks the scroll view closest to the status bar to scroll to the top. If that scroll view hasscrollsToTop
set toNO
, its delegate returnsNO
from scrollViewShouldScrollToTop:, or the content is already at the top, nothing happens.
簡(jiǎn)單點(diǎn)的說就是有兩種方式來設(shè)定scroll to top
絮宁,一個(gè)是設(shè)置scrollsToTop
屬性,另一個(gè)是實(shí)現(xiàn)UIScrollView
的代理方法scrollViewShouldScrollToTop:服协。如果滾動(dòng)視圖scrollsToTop
屬性設(shè)為NO
绍昂,它的代理方法scrollViewShouldScrollToTop:返回NO
,或者內(nèi)容已經(jīng)在頂部了偿荷,這樣觸摸狀態(tài)欄窘游,是沒有任何反應(yīng)的。
好了跳纳,繼續(xù)回到上面遇到的問題忍饰,既然默認(rèn)是YES,為什么回到頂部的功能失效了呢寺庄,其實(shí)仔細(xì)想一想就知道了艾蓝,因?yàn)橛袃蓚€(gè) scrollView,他們默認(rèn)都有scroll to top
功能斗塘,所以觸摸狀態(tài)欄時(shí)赢织,系統(tǒng)無法判斷是使哪個(gè)ScrollView回到頂部。
解決方案很簡(jiǎn)單馍盟,就是設(shè)置其中一個(gè)ScrollView的scrollsToTop
值為NO
(例如我將廣告輪播控件的scrollsToTop
設(shè)為NO
)于置,這樣系統(tǒng)就知道要使哪個(gè)ScrollView
回到頂部了。如果當(dāng)前頁面有多個(gè)滾動(dòng)視圖的話贞岭,要確保只有一個(gè)滾動(dòng)視圖scrollsToTop
的值為YES
八毯。
另外,在tableview的其他地方曹步,可以用改變位置的方式使它滾動(dòng)到頂部
1.[mainFolioTB setContentOffset:CGPointMake(0,0) animated:NO];
2. NSIndexPath *indexPath = [NSIndexPath indexPathForRow:lineNumber inSection:0];
[tableView_ selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionMiddle];