UIScrollView嵌套滾動完美解決方案:仿淘寶号杏、轉(zhuǎn)轉(zhuǎn)首頁

前言

隨著APP承載的業(yè)務(wù)越來越多,一個(gè)頁面顯示的信息也越來越多盾致,需要為不同的業(yè)務(wù)導(dǎo)流。主流的平臺APP庭惜,諸如:淘寶罩驻、京東惠遏、轉(zhuǎn)轉(zhuǎn)、盒馬百揭、還有各類社交APP的個(gè)人主頁熏版,都需要在頁面頂部展示核心業(yè)務(wù)數(shù)據(jù),在底部分標(biāo)簽顯示各個(gè)子業(yè)務(wù)列表數(shù)據(jù)柿顶。隨著大屏手機(jī)的普及渺贤,如果只能通過點(diǎn)擊頂部標(biāo)簽切換列表,對于使用場景最高的單手操作就很麻煩了志鞍。所以,為了用戶更好的交互固棚,需要支持子列表左右滾動切換的功能统翩。這樣就出現(xiàn)了UIScrollView嵌套滾動的場景了此洲。既需要主列表上下滾動,也需要子列表左右滾動呜师。

現(xiàn)有的解決方案

為了解決嵌套滾動的問題,現(xiàn)在網(wǎng)上已經(jīng)有許多解決方案了汁汗。包括筆者我衷畦,也開源了一個(gè)JXPagingView庫祈争,目前已經(jīng)有1100 stars,得到許多朋友的認(rèn)可角寸。
主要支持以下特性:

  • 列表懶加載
  • 主列表、子列表下拉刷新
  • 懸浮位置調(diào)整
  • OC與Swift雙版本
  • 封裝度高袭厂,使用方便

感興趣的可以了解一下JXPagingView的原理

基于現(xiàn)有的原理球匕,有一個(gè)小問題:當(dāng)用戶在頂部header用力往上滑動的時(shí)候,當(dāng)分類控制器滾動到頂部的時(shí)候亮曹,會突然停住,列表不會接著慣性繼續(xù)滾動照卦。大家可以打開【京東】APP,目前(版本號:8.3.4)首頁的效果就是如此役耕,大家可以體驗(yàn)一下,就明白我說的是什么意思了瞬痘。

如何才能像淘寶首頁那樣,可以讓子列表接著滾動呢框全?直到看到了轉(zhuǎn)轉(zhuǎn)首頁察绷,通過上手體驗(yàn)之后拆撼,發(fā)現(xiàn)了一個(gè)全新的方案容劳。PS:不知道轉(zhuǎn)轉(zhuǎn)APP做了什么操作闸度,簡單的逆向不起作用,視圖層級都看不到筋岛。所以,這個(gè)方案都是靠自己猜測加實(shí)踐折騰出來的睁宰。

JXPagerSmoothView方案

JXPagerSmoothView Github地址,點(diǎn)擊立馬體驗(yàn)

效果預(yù)覽

image

可以清楚的看到頂部pagerHeader用力往上滾動之后柒傻,下方列表會繼續(xù)滾動的,而且滾動的速度红符、阻尼都是系統(tǒng)自帶的。因?yàn)樯舷聺L動的時(shí)候预侯,就只是在操作一個(gè)列表,自然不會有手勢沖突之類的問題萎馅,看了下面的原理解析就明白了双戳。自定義的pagerHeader只是用一個(gè)簡單的TableView作為示例糜芳,你可以用任何復(fù)雜的視圖、UICollectionView等代替峭竣。

此方案原理非常簡單,沒有復(fù)雜的手勢處理皆撩,只需要處理好各種邊界情況即可。

情況一

默認(rèn)情況pagerHeaderContainerView被addSubview到當(dāng)前的列表UIScrollView上面毅访,pagerHeaderContainerView就是頂部pagerheader(核心業(yè)務(wù)視圖區(qū)域)和pinHeader(懸浮分類控制器區(qū)域)的容器視圖。這樣子喻粹,列表上下滑動就只是在操作單個(gè)列表ScrollView,不會有滾動突然被中斷的情況守呜。視圖層級如下:

image

情況二

當(dāng)列表在左右切換的時(shí)候山憨、列表向上滾動到pinHeder懸浮的時(shí)候,pagerHeaderContainerView被addSubview到JXPagerSmoothView上面郁竟,也就是脫離了列表scrollView,達(dá)到固定在頂部的效果棚亩。視圖層級如下:

image

總結(jié):就是在不斷切換pagerHeaderContainerView的父視圖,達(dá)到淘寶讥蟆、轉(zhuǎn)轉(zhuǎn)首頁的效果。是不是原理很簡單瘸彤?當(dāng)然使用的代碼也很簡單!

使用示例

1笛钝、初始化JXPagerSmoothView

    self.pager = [[JXPagerSmoothView alloc] initWithDataSource:self];
    [self.view addSubview:self.pager];

2、初始化pagerHeaderpinHeader

    self.categoryView = [[JXCategoryTitleView alloc] init];
    self.categoryView.titles = @[@"能力", @"愛好", @"隊(duì)友"];
    self.categoryView.contentScrollViewClickTransitionAnimationEnabled = NO;

    self.pagerHeader = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"lufei.jpg"]];

3玻靡、實(shí)現(xiàn)JXPagerSmoothViewDataSource代理方法

- (CGFloat)heightForPagerHeaderInPagerView:(JXPagerSmoothView *)pagerView {
    return 300;
}

- (UIView *)viewForPagerHeaderInPagerView:(JXPagerSmoothView *)pagerView {
    return self.pagerHeader;
}

- (CGFloat)heightForPinHeaderInPagerView:(JXPagerSmoothView *)pagerView {
    return 50;
}

- (UIView *)viewForPinHeaderInPagerView:(JXPagerSmoothView *)pagerView {
    return self.categoryView;
}

- (NSInteger)numberOfListsInPagerView:(JXPagerSmoothView *)pagerView {
    return self.categoryView.titles.count;
}

- (id<JXPagerSmoothViewListViewDelegate>)pagerView:(JXPagerSmoothView *)pagerView initListAtIndex:(NSInteger)index {
    SmoothListViewController *listVC = [[SmoothListViewController alloc] init];
    return listVC;
}

4、列表實(shí)現(xiàn)JXPagerSmoothViewListViewDelegate代理方法

SmoothListViewController類實(shí)現(xiàn)JXPagerSmoothViewListViewDelegate代理方法

- (UIScrollView *)listScrollView {
    return self.tableView;
}

- (UIView *)listView {
    return self.view;
}

使用注意事項(xiàng)

通過示例代碼可以看到整個(gè)邏輯簡單潭陪、清晰,和使用UITableView一樣,只需要實(shí)現(xiàn)對應(yīng)的代理方法即可老厌,根本不需要操心頁面的交互邏輯瘟则。真正的做到了高內(nèi)聚低耦合醋拧、職責(zé)分離等原則。

但是有幾個(gè)點(diǎn)需要注意:

  • 不要自己設(shè)置列表滾動視圖的contentInset屬性淀弹,內(nèi)部通過設(shè)置contentInset來添加pagerHeaderContainerView;
  • 當(dāng)頂部pagerHeader是一個(gè)UIScrollView及其子類時(shí),需要讓contentSize.height=pagerHeader的高度薇溃,即不能讓其能夠滾動,詳情可以參考OC示例demo的SmoothCustomPagerHeaderViewController類沐序;
  • 請仔細(xì)辨別JXPagerViewJXPagerSmoothView的區(qū)別堕绩,并選擇適合自己需求的類;
  • JXPagerSmoothView在1.2.1及以上版本才有奴紧,請使用最新版本;
  • Swift版本是JXPagingSmoothView;

JXPagerSmoothView Github地址

JXPagerSmoothView Github地址晶丘,點(diǎn)擊立馬體驗(yàn)

總結(jié)

JXPagerSmoothView的實(shí)現(xiàn)文件只有300行代碼左右,需要深入研究的朋友浅浮,相信花點(diǎn)功夫就能看懂。這樣子以后業(yè)務(wù)上面有任何特殊要求時(shí)脑题,都可以自己實(shí)現(xiàn)。只要掌握了原理叔遂,就不怕需求的變化。

有任何建議或疑問已艰,可以留言痊末、提Issues哩掺,我都會第一時(shí)間回復(fù)你!

感謝你的閱讀嚼吞,喜歡就點(diǎn)個(gè)贊吧??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市舱禽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌誊稚,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件里伯,死亡現(xiàn)場離奇詭異,居然都是意外死亡疾瓮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門狼电,熙熙樓的掌柜王于貴愁眉苦臉地迎上來补憾,“玉大人,你說我怎么就攤上這事盈匾。” “怎么了毕骡?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長未巫。 經(jīng)常有香客問我,道長叙凡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任握爷,我火速辦了婚禮,結(jié)果婚禮上新啼,老公的妹妹穿的比我還像新娘。我一直安慰自己燥撞,他們只是感情好座柱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布色洞。 她就那樣靜靜地躺著,像睡著了一般冠胯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涵叮,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天伞插,我揣著相機(jī)與錄音,去河邊找鬼媚污。 笑死舀瓢,一個(gè)胖子當(dāng)著我的面吹牛耗美,可吹牛的內(nèi)容都是我干的航缀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼芥玉,長吁一口氣:“原來是場噩夢啊……” “哼备图!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起揽涮,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蒋困,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雪标,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年汰聋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烹困。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖髓梅,靈堂內(nèi)的尸體忽然破棺而出拟蜻,到底是詐尸還是另有隱情枯饿,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布奢方,位于F島的核電站,受9級特大地震影響蟋字,放射性物質(zhì)發(fā)生泄漏稿蹲。R本人自食惡果不足惜鹊奖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧设哗,春花似錦、人聲如沸网梢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至活烙,卻和暖如春徐裸,著一層夾襖步出監(jiān)牢的瞬間啸盏,已是汗流浹背重贺。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工气笙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人怯晕。 一個(gè)月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像舟茶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子吧凉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

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

  • 簡書編輯器目測不支持html的一些語法,導(dǎo)致部分圖片顯示有問題阀捅,對于圖片又最大只支持5M,建議前往原文地址或者是掘...
    Jiar_閱讀 3,908評論 2 2
  • 你是誰 你在尋找誰 你在扮演誰 你在逃避誰 你獨(dú)自一人躲進(jìn)了寒夜 所有的火焰被撕成白雪 你無力地掬著雪花 想點(diǎn)燃它...
    季夢VC_ETG閱讀 274評論 0 4
  • 社交是一個(gè)廣義的概念饲鄙,就互聯(lián)網(wǎng)產(chǎn)品開發(fā)而言,社交app的開發(fā)思路已經(jīng)明顯從社交通訊功能忍级,轉(zhuǎn)向社交表達(dá)功能帆谍。一方面颤练,...
    冬瓜西瓜閱讀 291評論 0 0
  • 每個(gè)人的人生,都是一場獨(dú)特的旅行宇挫,前方未知,也許藏著精彩無限器瘪,這一生翠储,你遇見誰錯(cuò)過誰橡疼,都不重要,重要的是欣除,你是否能...
    安心悅舍閱讀 331評論 3 2
  • HTML5定義了一些新的標(biāo)記規(guī)則住拭,也定義了一些新的JavaScript API历帚,能夠讓開發(fā)人員創(chuàng)建出更好的用戶界面...
    jluemmmm閱讀 198評論 0 0