最近做了一個模仿微信聊天界面頭部下拉出現小程序的效果,同時也可以通過頭部的按鈕控制彈出框的伸縮,GitHub傳送門
先上效果:

下面講下我的思路:
1.通過runtime的關聯方法

對UIScrollview寫一個擴展類,增加一個UIView的屬性,frame設置在UIScrollview的頭部。
2.然后UITableView的tableHeaderView這個屬性來實現的,因為怎么想都覺得這只是一個頭部的視圖,往下拉時,通過對tableview的滑動時的delegate回調,通過設置tableview的
- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated;
這個方法直接偏移位置就行了,但是tableview的數據如果不是足夠多到能鋪滿一個屏幕的話,比如UITableViewCell只有2條的時候,設置[_tableView setContentOffset:CGPointMake(0, -100)]時,tableview的contentOffset還是在(0, 0)的位置。
折騰了許久后,想起MJRefresh的下拉刷新效果,然后參照MJRefreshHeaderView寫了一個繼承于MJRefreshBaseView的類LFTableHeaderView,通過對UIScrollview的KVO監(jiān)聽,設置當前彈出視圖的狀態(tài)state,以及臨界點的判斷,重寫該state屬性,實現對應的動畫(不了解的童鞋可以詳讀MJRefresh源碼),并在LFTableHeaderView中加入了一個自定義的view,這樣基本彈出效果的功能也就實現了,可以通過

來設置頭部的展示與隱藏。
3.然后就是上面點擊按鈕的收拉頭部的功能,以及滾動時按鈕箭頭的轉向,我是通過對UIScrollview的擴展類新增了一個NSNumber* isShowLFHeader的屬性來記錄當前的狀態(tài)(本來用BOOL的,但是objc_getAssociatedObject會報錯,需要以NSObject,就改用NSNumber),當展開時設置該值為@1,隱藏時為@0。
4.至于里面的CollectionView就是個小視圖的功能了,因為業(yè)務需要,添加了右上角的角標設置,使用時直接使用
_tableView.lf_header.badgeNumArr = @[@"20",@"1",@"101",@"2",@"0",@"0"];
即可。
第一次寫文章,語言的表述不好,講重點也沒抓好,希望以后能提高。感悟就是還需多閱讀大佬的源碼,站在巨人肩膀上真的能事半功倍!