iOS 實現(xiàn)多個tableView滑動懸停的一種方法(仿簡書個人主頁)

效果圖

** 測試環(huán)境 : **Xcode8.1 iOS10.1

現(xiàn)在看到好多應(yīng)用都有類似上面滑動懸停的效果,我之前也寫過類似的慎宾,現(xiàn)在新項目又有這種效果,之前寫得也有點亂,所以就趁這次重寫的機會把寫這種效果的思路再重新整理一遍惧所。當然我只是為實現(xiàn)這種效果提供一種比較笨的思路,如果大家有更好更簡單的思路可以留言绪杏。
實現(xiàn)思路挺簡單下愈,但是寫起來挺麻煩的,先看層級圖:


UI層級圖.png
  • 設(shè)置主內(nèi)容View(backView)
    • 首先在控制器view上面添加一個scrollowView蕾久,它是用來左右滑動以顯示不現(xiàn)的內(nèi)容tableView
    • 再在scrollowView上面添加多個(按自己需求)tableView势似,從左到右依次布局這些tableView,并設(shè)置每個tableView的tableHeadView(此處設(shè)置tableHeadView只是用來占位用僧著,沒有顯示的作用)(注意:所有tableView的headView的高度一定要相同)
// scrollView
    UIScrollView* scrollView = [[UIScrollView alloc] init];
    [self.view addSubview:scrollView];
    scrollView.backgroundColor = [UIColor whiteColor];
    self.scrollView = scrollView;
    scrollView.pagingEnabled = YES;
    scrollView.showsVerticalScrollIndicator = NO;
    scrollView.showsHorizontalScrollIndicator = NO;
    scrollView.delegate = self;
    scrollView.contentSize = CGSizeMake(kScreenWidth * 3, 0);
    [scrollView makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(self.view);
    }];
    
    UIView* headView = [[UIView alloc] init];
    headView.frame = CGRectMake(0, 0, 0, self.headViewHeight + TitleHeight);
    self.tableViewHeadView = headView;
    headView.backgroundColor = [UIColor greenColor]; 
    
    CFContentTableView* table1 = [[CFContentTableView alloc] init];
    table1.delegate = self;
    self.table1 = table1;
    table1.tableHeaderView = headView;
    [scrollView addSubview:table1];
    [table1 makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(scrollView);
        make.width.equalTo(kScreenWidth);
        make.top.equalTo(self.view);
        make.bottom.equalTo(self.view);
    }];
    
    
    CFContentTableView* table2 = [[CFContentTableView alloc] init];
    table2.delegate = self;
    self.table2 = table2;
    table2.tableHeaderView = headView;
    [scrollView addSubview:table2];
    [table2 makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(scrollView).offset(kScreenWidth);
        make.width.equalTo(table1);
        make.top.bottom.equalTo(table1);
    }];
    
    CFContentTableView* table3 = [[CFContentTableView alloc] init];
    table3.delegate = self;
    self.table3 = table3;
    table3.tableHeaderView = headView;
    [scrollView addSubview:table3];
    [table3 makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(scrollView).offset(kScreenWidth*2);
        make.width.equalTo(table1);
        make.top.bottom.equalTo(table1);
    }];
  • 設(shè)置頭部View(headView)
    • 創(chuàng)建需要懸停的headView(非tableHeadView)履因,headView包含懸停view,并把headView添加到控制器View上面盹愚,使其正好覆蓋在tableHeadView上栅迄。
    • 監(jiān)聽tableView的滑動位置(contentOffset),并根據(jù)滑動位置去設(shè)置headView的frame皆怕,還要設(shè)置其它tableView的contentOffset毅舆,判斷如果tableView滑動將要使懸停View超出目標懸停位置時則固定住懸停view西篓。
- (void)setupHeadView
{
    UIView* headBackView = [[UIView alloc] init];
    headBackView.backgroundColor = [UIColor blueColor];
    headBackView.frame = CGRectMake(0, 0, kScreenWidth, self.headViewHeight + TitleHeight);
    [self.view addSubview:headBackView];
    self.headBackView = headBackView;
    
    CFTitleBar* titleBarView = [[CFTitleBar alloc] init];
    [headBackView addSubview:titleBarView];
    self.titleBarView = titleBarView;
    titleBarView.backgroundColor = [UIColor whiteColor];
    [titleBarView makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.equalTo(headBackView);
        make.bottom.equalTo(headBackView.mas_bottom);
        make.height.equalTo(TitleHeight);
    }];
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (scrollView == self.scrollView || !scrollView.window)
    {
        return;
    }
    CGFloat offsetY = scrollView.contentOffset.y;
    CGFloat originY = 0;
    CGFloat otherOffsetY = 0;
    if (offsetY <= self.headViewHeight)
    {
        originY = -offsetY;
        if (offsetY < 0)
        {
            otherOffsetY = 0;
        }else{
            otherOffsetY = offsetY;
        }
    }else{
        originY = -self.headViewHeight;
        otherOffsetY = self.headViewHeight;
    }
    self.headBackView.frame = CGRectMake(0, originY, kScreenWidth, self.headViewHeight+TitleHeight);
    
    for ( int i = 0; i<self.titleBarView.titles.count; i++ )
    {
        if (i != self.titleBarView.selectedIndex)
        {
            UITableView* contentView = self.scrollView.subviews[i];
            CGPoint offset = CGPointMake(0, otherOffsetY);
            if ([contentView isKindOfClass:[UITableView class]])
            {
                if (contentView.contentOffset.y < self.headViewHeight || offset.y < self.headViewHeight)
                {
                    [contentView setContentOffset:offset animated:NO];
                }
            }
        }
    }
    
}

以上就是整體的思路,看起來也不難但是?寫起來有些麻煩憋活,如果再加上實際應(yīng)用中的各種邏輯就會更亂一些岂津,而且對于界面跳轉(zhuǎn)會有很多問題,我也在陸續(xù)填坑悦即,如果大家在開發(fā)這種效果時遇到了坑歡迎留言一起探討吮成。

更新(2016年10月11日)

昨天看了簡書的個人頁面,感覺做得更好一些盐欺,關(guān)鍵是它的headView部分也可以接收滑動赁豆,而我之前做的由于headView擋住了tableView導致無法接受滑動。經(jīng)過昨天半天的各種嘗試目前的實現(xiàn)基本和簡書效果一致冗美,headView也可以滑動了魔种。
具體實現(xiàn)自己看代碼吧,雖然實現(xiàn)起來挺簡單的粉洼,但是尋找這種解決方法還是費了不少時間节预。

最后奉上demo地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市属韧,隨后出現(xiàn)的幾起案子安拟,更是在濱河造成了極大的恐慌,老刑警劉巖宵喂,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糠赦,死亡現(xiàn)場離奇詭異,居然都是意外死亡锅棕,警方通過查閱死者的電腦和手機拙泽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裸燎,“玉大人顾瞻,你說我怎么就攤上這事〉侣蹋” “怎么了荷荤?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長移稳。 經(jīng)常有香客問我蕴纳,道長,這世上最難降的妖魔是什么个粱? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任袱蚓,我火速辦了婚禮,結(jié)果婚禮上几蜻,老公的妹妹穿的比我還像新娘喇潘。我一直安慰自己,他們只是感情好梭稚,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布颖低。 她就那樣靜靜地躺著,像睡著了一般弧烤。 火紅的嫁衣襯著肌膚如雪忱屑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天暇昂,我揣著相機與錄音莺戒,去河邊找鬼。 笑死急波,一個胖子當著我的面吹牛从铲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播澄暮,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼名段,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了泣懊?” 一聲冷哼從身側(cè)響起伸辟,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎馍刮,沒想到半個月后信夫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡卡啰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年静稻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碎乃。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡姊扔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出梅誓,到底是詐尸還是另有隱情恰梢,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布梗掰,位于F島的核電站嵌言,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏及穗。R本人自食惡果不足惜摧茴,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望埂陆。 院中可真熱鬧苛白,春花似錦娃豹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至躏率,卻和暖如春躯畴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背薇芝。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工蓬抄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人夯到。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓嚷缭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親黄娘。 傳聞我的和親對象是個殘疾皇子峭状,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

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

  • 最近發(fā)現(xiàn)有很多App的tableView或者scrollView在滑動過程中,當某視圖滑動到頂部時逼争,會懸停在頂部优床,...
    Zhui_Do閱讀 3,381評論 1 17
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件誓焦、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,124評論 4 61
  • PS:也是看別人寫的胆敞。自己剛好有這個需求,看了代碼杂伟,改吧改吧就用了移层。找不到那篇文章了。 效果:實現(xiàn)tablevie...
    請叫我魔法師閱讀 2,514評論 4 15
  • 婆婆是塊敲門石赫粥。 我迎來了人生中很重要的一次轉(zhuǎn)折观话。換了環(huán)境,換了相處對象越平,眼前的一切感到很新鮮频蛔。想想我一身的毛病,...
    王愚閱讀 210評論 0 0
  • 需求:在某頁面add的cookie在另一個頁面卻獲取不到秦叛』尴——難道cookie只對當前頁面有效?學習后發(fā)現(xiàn)挣跋,coo...
    拾壹北閱讀 8,742評論 1 8