支付寶首頁模仿

前段時(shí)間接到個(gè)需求,簡(jiǎn)單而言就是模仿支付寶的首頁,唯一的不同就是支付寶首頁的主功能模塊在屏幕上方,而需求中的主功能模塊在屏幕下方。

頁面分析

支付寶首頁

第一輪分析

整個(gè)頁面由三個(gè)模塊組成:主功能模塊、應(yīng)用模塊和信息模塊。

  • 當(dāng)頁面由初始狀態(tài)向上滑動(dòng)時(shí),應(yīng)用模塊和信息模塊會(huì)同時(shí)向上滑動(dòng),而主功能模塊的高度會(huì)隨著滑動(dòng)的距離而變化,大功能按鈕逐漸消失,小功能按鈕逐漸顯示。


    向上滑動(dòng)
  • 當(dāng)小功能按鈕完全顯示以后,主功能模塊的高度就會(huì)固定,而信息模塊和應(yīng)用模塊還可以繼續(xù)向上滑動(dòng)。


    主功能模塊高度固定
  • 當(dāng)頁面由初始狀態(tài)下滑時(shí),主功能模塊和應(yīng)用模塊的位置都會(huì)固定不變,而信息模塊則會(huì)展示刷新效果,并在刷新結(jié)束后恢復(fù)初始狀態(tài)。
  • 不論是上滑還是下滑,信息模塊右側(cè)都會(huì)顯示滾動(dòng)條。


    向下滑動(dòng)刷新

根據(jù)上述效果進(jìn)行分析:

  1. 整個(gè)頁面由兩個(gè)UITableView控件組成:

    • 由于信息模塊有下拉刷新功能并且右側(cè)顯示有滾動(dòng)條,因此將信息模塊視為tableView1。
    • 由于信息模塊和應(yīng)用模塊可以一起滑動(dòng),而主功能模塊僅僅是改變高度,因此信息模塊和應(yīng)用模塊一起組成tableView2。
    • 由于主功能模塊只是高度發(fā)生變化而位置并不變化,因此可以將主功能模塊添加在主頁面上,并且用與主功能模塊一樣大小的空白view充當(dāng)tableView2的headerView。
  2. 初始狀態(tài)下,由tableView2響應(yīng)上滑事件,tableView1響應(yīng)下滑事件。

  3. 一旦由tableView2響應(yīng)了上滑事件,那么在恢復(fù)初始狀態(tài)之前,下滑事件也會(huì)由tableView2來響應(yīng)。

根據(jù)上述分析不難看出,整個(gè)頁面效果實(shí)現(xiàn)的關(guān)鍵在于控制響應(yīng)滑動(dòng)事件的主體。暫且不論代碼的復(fù)雜程度,其實(shí)現(xiàn)后的效果也不盡如人意。

第二輪分析

在第一輪分析的基礎(chǔ)上,參考了一些網(wǎng)上的資料,進(jìn)行了第二輪分析:

  1. 整個(gè)頁面僅由一個(gè)UITableView控件組成,其主體就是信息模塊。有一個(gè)小細(xì)節(jié):當(dāng)我們?cè)谥鞴δ苣K或應(yīng)用模塊上觸摸下滑時(shí),信息模塊同樣會(huì)進(jìn)行下拉刷新。
  2. 主功能模塊添加在主頁面上,其高度隨tableView滑動(dòng)距離的變化而變化。
  3. 依次在tableView.headerView上添加應(yīng)用模塊和刷新模塊。
  4. 主功能模塊和應(yīng)用模塊正好覆蓋了tableView.headerView。
    具體布局代碼如下:
_tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height - tabBarHeight) style:UITableViewStylePlain] ;
_tableView.delegate = self ;
_tableView.dataSource = self ;
_tableView.separatorStyle = UITableViewCellSeparatorStyleNone ;
[self.view addSubview:_tableView] ;

UIView *tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, movedHeight + fixedNormalHeight)] ;
tableHeaderView.backgroundColor = [UIColor clearColor] ;
_tableView.tableHeaderView = tableHeaderView ;
    
_tableView.scrollIndicatorInsets = UIEdgeInsetsMake(movedHeight + fixedNormalHeight, 0, 0, 0) ;
    
_refreshView = [[UIView alloc]initWithFrame:CGRectMake(0, movedHeight + fixedNormalHeight - 50, [UIScreen mainScreen].bounds.size.width , 50)] ;
[_tableView.tableHeaderView addSubview:_refreshView] ;
    
_movedView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, movedHeight + fixedNormalHeight)] ;
[_tableView addSubview:_movedView] ;
    
_fixedView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, fixedNormalHeight)] ;
[self.view addSubview:_fixedView] ;

代碼中,_movedView就是應(yīng)用模塊,_fixedView就是主功能模塊。

  1. 滑動(dòng)時(shí):
    • 初始狀態(tài)下,若tableView上滑,應(yīng)用模塊也會(huì)隨之上滑;若tableView下滑,應(yīng)用模塊則會(huì)固定不動(dòng),而原本添加在tableView.headerView上的刷新動(dòng)畫就會(huì)顯示出來。
    • 在恢復(fù)初始狀態(tài)之前,若tableView先上滑再下滑,應(yīng)用模塊也會(huì)隨之下滑。
      具體實(shí)現(xiàn)代碼為:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGFloat tableViewOffSetY = scrollView.contentOffset.y ;
    if(tableViewOffSetY >= 0) {
        _movedView.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, movedHeight + fixedNormalHeight) ;
        if(tableViewOffSetY <= (fixedNormalHeight-fixedSmallHeight)) {
            CGRect frame = _fixedView.frame ;
            CGFloat height = fixedNormalHeight - tableViewOffSetY ;
            frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, height) ;
            _fixedView.frame = frame ;   
        }
        else {
            _fixedView.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, fixedSmallHeight) ;
        }
    }
    else {
        _movedView.frame = CGRectMake(0, tableViewOffSetY, [UIScreen mainScreen].bounds.size.width, movedHeight + fixedNormalHeight) ;
        _fixedView.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, fixedNormalHeight) ;
        if(tableViewOffSetY<-refreshHeight-10 && [scrollView isDecelerating]) {
            [self requird] ;
            [self.tableView setContentOffset:CGPointMake(0, -refreshHeight) animated:YES] ;
        }
    }
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    if(!decelerate) {
        if(scrollView.contentOffset.y >= 0) {
            if(scrollView.contentOffset.y < fixedSmallHeight*0.5) {
                [scrollView setContentOffset:CGPointMake(0, 0) animated:YES] ;
            }
            else if(scrollView.contentOffset.y < fixedSmallHeight) {
                [scrollView setContentOffset:CGPointMake(0, fixedSmallHeight) animated:YES] ;
            }
        }
    }
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    if(scrollView.contentOffset.y >= 0) {
        if(scrollView.contentOffset.y < fixedSmallHeight*0.5) {
            [scrollView setContentOffset:CGPointMake(0, 0) animated:YES] ;
        }
        else if(scrollView.contentOffset.y < fixedSmallHeight) {
            [scrollView setContentOffset:CGPointMake(0, fixedSmallHeight) animated:YES] ;
        }
    }
}

代碼中,下拉超過一定距離就進(jìn)行更新請(qǐng)求,并在請(qǐng)求期間顯示請(qǐng)求模塊

根據(jù)第二輪分析,整個(gè)頁面的實(shí)現(xiàn)就會(huì)變得非常簡(jiǎn)單。

代碼實(shí)現(xiàn)

具體的實(shí)現(xiàn)代碼見:
https://github.com/bbbxxxbx/-

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,315評(píng)論 4 61
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,039評(píng)論 25 709
  • 雨是什么味道的 是橘子汽水般的甘甜 是青梅煮酒般的酸澀 還是 其他未曾謀面的 恰如 學(xué)生時(shí)代的我們 穿著傻氣的校服...
    顏麥冬閱讀 282評(píng)論 0 3
  • 一 前天晚上,和書生一起騎車出門轉(zhuǎn)悠,回來路上他想買點(diǎn)水果。于是去了附近一家新開的大水果店。 晚上九點(diǎn)鐘,街上人車...
    上官草字頭閱讀 954評(píng)論 0 1
  • 葉子是芳芳的閨蜜,徐強(qiáng)是芳芳的男友,有一次,徐強(qiáng)欠債被人追殺,可是芳芳把自己所有的積蓄都借給了葉子,因?yàn)槿~子的母親...
    落幕新城墻閱讀 299評(píng)論 0 0

友情鏈接更多精彩內(nèi)容