iOS 列表視圖最簡潔的回滾到頂部的解決方案

iOS中的列表視圖自帶回滾到頂部的功能,就是設置scrollsToTop屬性為YES即可,但是當控制其中有多個視圖的時候,就不靈了,我也看過網上給過的解決方案,需要設置其他UIScrollView視圖的scrollsToTop屬性為NO才奏效。這樣個人感覺很麻煩,為什么不用黑魔法呢,哈哈,請看我的解決方案。

1. 首先我們得找到系統的statusBar,怎么找呢?

系統提供了我們設置StatusBar的各種屬性,例如常用的 ?[UIApplication sharedApplication].statusBarHidden所以我懷疑statusBar會是UIApplication的私有化的屬性,然后進去了UIApplication的API文檔,找到了@class UIStatusBar。所以我個人認為statusBar應該是[UIApplication sharedApplication] 這個單例類所持有的視圖(應該是繼承于UIView),所以statusBar應該是具有唯一性的。然后順藤摸瓜,我們通過Runtime來扒一扒。先找到對應的type,找到對應的那么,最后通過KVC,拿到statusBar對象。

2. 在什么地方調用 statusBarView 方法呢?個人認為得在UIViewController中調用,一般邏輯處理都在控制器中進行。

最后選擇在控制器的生命周期方法viewDidLoad 中調用,只能用方法交換來處理了,不然太low了,所以得用category了。

在load類方法中我們得做一個方法交換了。

load中的方法是我對NSObject的category中做的交換方法所用的。

這樣我就可以在交換后的方法 swizz_viewDidLoad 中獲取statusBar了,取出statusBar后,我又對UIStatusBar中的變量遍歷打印,沒有發現點擊手勢之類的屬性,好吧,只能我自己添加了。

3. ?很明顯思路已經清晰了,我們可以在手勢的點擊方法中做相關的處理,我目前是在UIViewController的categroy中添加Block屬性,category中動態添加屬性只能通過關聯引用了。

最后我們在控制器中的屬性Block回調中就可以通過設置UIScrollView的setContentOffset 為CGPointZero 來達到回滾到頂部的效果啦!!! 邏輯處理在UIViewController中,需要哪個UIScrollView回滾,直接調用setContentOffset 方法即可,不用管理其他視圖的,簡單粗暴哦。

Note: 以下是新添加的內容,有關手勢的移除問題:

在項目中運用后,發現當控制器移除后,再次點擊statusBar會出現這種內存錯誤 -[XXXController tapGestureAction]: message sent to deallocated instance 0x1509445e0,很明顯是控制器移除了,但是點擊手勢還是存在的,當向一個釋放掉的對象發送消息時,會出現這種Crash: EXC_BAD_ACCESS(code=1,address=0x0) 。

所以我們應該在控制器的生命周期結束之前,把手勢的響應方法移除掉才行。

必須混寫dealloc方法了,注意直接混寫dealloc是會報錯的,ARC forbids use of 'dealloc' in a @selector.

so, 換一種方式,在load方法中這樣寫:

[self swizzWithClass:[self class] originSel:NSSelectorFromString(@"dealloc") newSel:@selector(swizz_dealloc)];

然后在混寫后的方法中,對相應的點擊手勢做一個移除操作就OK了。

以上是全部內容,有異議或者有更好的建議的,歡迎大家指正,謝謝!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容