支付寶首頁刷新的實(shí)現(xiàn)方案

概述

支付寶首頁參雜了很多效果在里面,其中刷新的效果著實(shí)吸引了我。它采用了中段刷新嚼摩,上拉聯(lián)動的方案進(jìn)行頁面的展示。分析了一下,這樣做的目的是為了保證用戶在刷新的時候頂部不留刷新空白使得界面美觀柜候,在上拉加載更多的時候頭部隨著界面的上拉隱藏,保證用戶在瀏覽內(nèi)容的時候有更多的空間去展示內(nèi)容。

支付寶首頁刷新

分析

通過界面效果开泽,大致能夠感覺到界面是由tableView與一個headerView組成峦耘,這里存在爭議的地方是headerView是tableView的一部分還是一個獨(dú)立于tableView而存在的一個部分。

分析一下以上的兩種情況:

  • headerView是tableView的一部分

headerView是tableView的一部分,在下拉加載更多的時候,界面效果確實(shí)能夠滿足條件。但是下拉刷新的添加上存在點(diǎn)問題了,細(xì)心的你會發(fā)現(xiàn)支付寶中的刷新是在headerView下面,也就是說如果headerView是tableView的頭部的話,那么刷新不會出現(xiàn)在界面的中間位置,而會在tableView的頭部上方,也就是頂部∪袂兀可見這種方案是不可行的斤葱。

  • headerView是獨(dú)立出來的一部分芹血,與tableView在界面上隸屬于同級

簡單說,就是headerView與tableView均在一層View上弟劲,這里又有一點(diǎn)問題熊榛,就是tableView頂部直接放在headerView的下面是否可行呢?理論上tableView放在headerView的下面之后困曙,下拉刷新就變得正常了,頂部headerView的的動態(tài)移動可以通過tableView的滾動的offset進(jìn)行調(diào)整鱼填,貌似也沒什么問題,所以按照上面的方法實(shí)現(xiàn)阻桅,結(jié)果有點(diǎn)小瑕疵:tableView向上滾動的時候頂部的headerView能夠正常滾動蚓土,但是tableView由于向上滾動,會被自身的frame截掉部分內(nèi)容病袄,感覺怪怪的,這也是我之前發(fā)布的帶頭圖的下拉刷新的界面實(shí)現(xiàn)(tabelView的section刷新錯覺問題所在,效果如上劃聯(lián)動所示。

上劃聯(lián)動(tableView直接放在headerView下面)

支付寶首頁在上拉的時候,tableView的頂部內(nèi)容并沒有被截掉,顯然tableView的內(nèi)容展示部分要包括頭部的header位置胡桃,這樣才能保證上拉的時候內(nèi)容不會被截掉亡容,換句話說也就是tableView的位置應(yīng)該在headerView下面,而且頂部與headerView的頂部保持一致。

頁面層次

這里有個問題坤塞,如果將headerView放在tableView的上面冯勉,那么tabelView的上面內(nèi)容會被headerView遮住,這個很好解決摹芙,只需要設(shè)置tableView的contentInset的內(nèi)容偏移到headerView的高度即可珠闰,如上圖所示。至于上劃聯(lián)動直接使用方案一中的方法就能滿足需求瘫辩。

實(shí)現(xiàn)

經(jīng)過分析之后伏嗜,我們實(shí)際上主要解決兩個主要問題:

  • tableView的內(nèi)容偏移設(shè)置
  • 上拉的時候動態(tài)改變頭部headerView的位置,完成聯(lián)動效果

tableView的內(nèi)容偏移設(shè)置可以直接在tableView創(chuàng)建的時候進(jìn)行設(shè)置伐厌,如下:

- (UITableView *)tableView{

    if (!_tableView) {
        
        MJWeakSelf;
        
        _tableView = [UITableView new];
        
        _tableView.dataSource = self;
        _tableView.delegate = self;
        
        //設(shè)置內(nèi)容偏移
        _tableView.contentInset = UIEdgeInsetsMake(202, 0, 0, 0);
        //設(shè)置滾動條偏移
        _tableView.scrollIndicatorInsets = UIEdgeInsetsMake(202, 0, 0, 0);
        
        _tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
            
            weakSelf.rowNum = 10;
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                [_tableView.mj_header endRefreshing];
            });
            
            [weakSelf.tableView reloadData];
        
        }];
        
        
        _tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
           
            weakSelf.rowNum += 10;
            [weakSelf.tableView reloadData];
            
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                
                [weakSelf.tableView.mj_footer endRefreshing];
                
            });
            
            
        }];
      
    }
    
    
    return _tableView;
}

如何在上拉加載的時候動態(tài)更新headerView的位置已達(dá)到聯(lián)動效果呢承绸?可以借助scrollViewDidScroll進(jìn)行界面的更新,如下所示:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    
    //頁面沒有加載的時候不進(jìn)行調(diào)整
    if (!self.view.window) {
        
        return;
    }

    CGFloat offsetY = scrollView.contentOffset.y;
    
    //上拉加載更多(頭部還沒有隱藏)挣轨,動態(tài)移動header
    if (offsetY > -202 & offsetY < 0) {
        
        [self.topImg mas_updateConstraints:^(MASConstraintMaker *make) {
           
            make.top.mas_equalTo(-offsetY - 202);
        }];
        
    }else if(offsetY > 0){ //頭部隱藏军熏,固定頭部位置
    
        [self.topImg mas_updateConstraints:^(MASConstraintMaker *make) {
            
            make.top.mas_equalTo(-202);
        }];
        
    }else{ //下拉刷新
    
        [self.topImg mas_updateConstraints:^(MASConstraintMaker *make) {
            
            make.top.mas_equalTo(0);
        }];

    }
  
}

好了,設(shè)置完之后我們來看看實(shí)現(xiàn)的效果卷扮,如下:

局部刷新效果

總結(jié)

其實(shí)類似與這樣的效果的地方還有很多荡澎,例如上拉的過程中,菜單懸浮晤锹,下拉局部刷新摩幔,都可以使用這樣的方式去處理,只需要更改滾動時候的headerView的偏移既可鞭铆,是不是覺得很有用呢或衡?需要的同學(xué)可以下載Demo。

點(diǎn)我看Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末车遂,一起剝皮案震驚了整個濱河市封断,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舶担,老刑警劉巖坡疼,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異衣陶,居然都是意外死亡柄瑰,警方通過查閱死者的電腦和手機(jī)闸氮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狱意,“玉大人湖苞,你說我怎么就攤上這事∠甓冢” “怎么了财骨?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長藏姐。 經(jīng)常有香客問我隆箩,道長,這世上最難降的妖魔是什么羔杨? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任捌臊,我火速辦了婚禮,結(jié)果婚禮上兜材,老公的妹妹穿的比我還像新娘理澎。我一直安慰自己,他們只是感情好曙寡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布糠爬。 她就那樣靜靜地躺著,像睡著了一般举庶。 火紅的嫁衣襯著肌膚如雪执隧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天户侥,我揣著相機(jī)與錄音镀琉,去河邊找鬼。 笑死蕊唐,一個胖子當(dāng)著我的面吹牛屋摔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播刃泌,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼凡壤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了耙替?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤曹体,失蹤者是張志新(化名)和其女友劉穎俗扇,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體箕别,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铜幽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年滞谢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片除抛。...
    茶點(diǎn)故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡狮杨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出到忽,到底是詐尸還是另有隱情橄教,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布喘漏,位于F島的核電站护蝶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏翩迈。R本人自食惡果不足惜持灰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望负饲。 院中可真熱鬧堤魁,春花似錦、人聲如沸返十。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吧慢。三九已至涛漂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間检诗,已是汗流浹背匈仗。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逢慌,地道東北人悠轩。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像攻泼,于是被迫代替她去往敵國和親火架。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內(nèi)容