知乎分欄滑動(dòng)效果實(shí)現(xiàn)--附Demo

我們經(jīng)常會(huì)用到各種分欄,比如:

app store分欄
知乎分欄

第一張圖是app store排行榜的分欄偷线,它最普通的分欄亥曹,使用系統(tǒng)的UISegmentControl即可實(shí)現(xiàn)(是不是發(fā)現(xiàn)這個(gè)導(dǎo)航條很高媳瞪,或者說UISegmentControl與導(dǎo)航條看起來是一個(gè)整體驶悟,我之前研究了一下,實(shí)現(xiàn)方法在這里:App Store 排行榜導(dǎo)航條實(shí)現(xiàn))材失。

第二張圖是知乎"通知"模塊導(dǎo)航實(shí)現(xiàn)痕鳍,用過知乎的小伙伴,如果細(xì)心的話會(huì)發(fā)現(xiàn)當(dāng)左右滾動(dòng)通知模塊時(shí)龙巨,頂部的分段控件會(huì)發(fā)生如下變化:

  • 分段控件的標(biāo)題顏色變化笼呆,選中則為黑色,未選中則為灰色
  • 標(biāo)題底部有一根藍(lán)色的條旨别,選中那個(gè)標(biāo)題诗赌,藍(lán)色的條就會(huì)在哪個(gè)標(biāo)題下面
  • 藍(lán)色的條在輕輕滑動(dòng)頁面時(shí),藍(lán)色的條也會(huì)跟隨滑動(dòng)秸弛,且?guī)в羞^度效果
  • 藍(lán)色的條在跟隨滑動(dòng)時(shí)铭若,長度也會(huì)隨著文本的變化而變化洪碳,且?guī)в羞^度效果

我們平時(shí)的實(shí)現(xiàn),或者一些開源庫的實(shí)現(xiàn)一般只是做到了前面兩點(diǎn)叼屠,雖然功能都實(shí)現(xiàn)了瞳腌,但是用起來卻沒有絲滑般的感受啊??。所以強(qiáng)迫癥的我就研究了一下如何實(shí)現(xiàn)后兩點(diǎn)中提到的效果镜雨。

這里為了方便嫂侍,我使用了一個(gè)分段控件的開源庫:RKSwipeBetweenViewControllers。它很好的實(shí)現(xiàn)了前面兩點(diǎn)功能荚坞,而且想要實(shí)現(xiàn)后兩點(diǎn)的話直接修改它的代碼也是非常方便的挑宠。

我們先看一下第三點(diǎn)的效果如何實(shí)現(xiàn),我們需要在頁面滾動(dòng)時(shí)颓影,藍(lán)色的條跟隨滾動(dòng)各淀,所以需要不停的變化藍(lán)色條的坐標(biāo),因此關(guān)鍵代碼在UIScollView的代理scrollViewDidScroll:中诡挂。
實(shí)現(xiàn)代碼如下:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGFloat percentX = (scrollView.contentOffset.x - CGRectGetWidth(scrollView.frame)) / CGRectGetWidth(scrollView.frame);//往左滑動(dòng)大于0碎浇,往右小于0(由于默認(rèn)偏移320)
    NSLog(@"percentX:%f",percentX);
    
    NSInteger currentPageIndex = self.currentPageIndex;
    
    UIButton *curBtn = [[navigationView subviews] objectAtIndex:currentPageIndex];
    CGFloat centerxOfSelectionBar = curBtn.center.x + percentX*_titleWidth;
    selectionBar.center = CGPointMake(centerxOfSelectionBar, selectionBar.center.y);
}

首先說明一下,這里scrollview的contentOffset.x默認(rèn)偏移了320(即屏幕寬咆畏,我用的iPhone SE南捂,屏寬320)吴裤。切每切換一個(gè)頁面旧找,偏移都會(huì)被修改為320。
這里percentX是一個(gè)偏移度麦牺,絕對(duì)值小于或等于1钮蛛。往左滑動(dòng)大于0,往右小于0剖膳。
這里我是通過藍(lán)色條的中心點(diǎn)來確定藍(lán)色條的位置的魏颓,centerxOfSelectionBar是計(jì)算的藍(lán)色條的中心。而_titleWidth是頂部標(biāo)題按鈕的寬度(這里標(biāo)題是用的按鈕吱晒,等寬)甸饱。

CGFloat centerxOfSelectionBar = curBtn.center.x + percentX*_titleWidth;

這行應(yīng)該比較好理解,看下面這張圖(不要夸我仑濒,我知道我畫的好O(∩_∩)O謝謝)

0.jpeg

往左滑動(dòng)時(shí)叹话,藍(lán)色條的中心由1滑動(dòng)到2,1到2的間距正好是_titleWidth墩瞳,所以1到2任意一點(diǎn)的x坐標(biāo)就是1的x坐標(biāo)加上偏移的量驼壶,即上面代碼所示。

這樣就實(shí)現(xiàn)了第三點(diǎn)的效果喉酌。

至于第四點(diǎn)中提到的效果热凹,很明顯也是在同一個(gè)代理中實(shí)現(xiàn)泵喘,實(shí)現(xiàn)如下:

    NSInteger currentPageIndex = self.currentPageIndex;

    UIButton *curBtn = [[navigationView subviews] objectAtIndex:currentPageIndex];

    NSInteger targetPage = percentX > 0 ? currentPageIndex+1:currentPageIndex-1;
    if (targetPage >= 0 && targetPage < _buttonText.count)
    {
        UIButton *targetBtn = [[navigationView subviews] objectAtIndex:targetPage];
        
        CGSize sizeOrigin = MB_TEXTSIZE(curBtn.currentTitle, [UIFont systemFontOfSize:FONT_SIZE_16]);
        CGFloat lengthOrigin = sizeOrigin.width;
        
        CGSize sizeTarget = MB_TEXTSIZE(targetBtn.currentTitle, [UIFont systemFontOfSize:FONT_SIZE_16]);
        CGFloat lengthTarget = sizeTarget.width;
        
        CGFloat selctionBarLength = lengthTarget + (lengthOrigin - lengthTarget)*(1-ABS(percentX));
        selectionBar.frame = CGRectMake(selectionBar.frame.origin.x, selectionBar.frame.origin.y, selctionBarLength, selectionBar.frame.size.height);
    }

MB_TEXTSIZE是MBProgress中定義的計(jì)算文字尺寸的宏定義,我直接拷過來用的般妙。
上面的代碼我想大部分應(yīng)該都容易看明白纪铺,就只有下面這行有點(diǎn)麻煩:

CGFloat selctionBarLength = lengthTarget + (lengthOrigin - lengthTarget)*(1-ABS(percentX));

我來說明一下:


FullSizeRender.jpg

如上圖所示,假設(shè)a位置的標(biāo)題長度為a股冗,b位置長度為b霹陡,由a滑動(dòng)到b,L是目標(biāo)長度,即最后停留位置藍(lán)色條的長度:

  • 如果a>b,L1 = b + (a - b)*(1-ABS(percentX))
  • 如果b>a,L2 = b - (b - a)*(1-ABS(percentX))
    對(duì)比一下會(huì)發(fā)現(xiàn)止状,L1 與 L2 是相等的烹棉,所以公式可以簡化為
L = b - (b - a)*(1-ABS(percentX))

demo地址在這:SegmentControlDemo,隨意下載怯疤。

如果本文對(duì)你有用浆洗,給個(gè)??吧,謝謝~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末集峦,一起剝皮案震驚了整個(gè)濱河市伏社,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌塔淤,老刑警劉巖摘昌,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異高蜂,居然都是意外死亡聪黎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門备恤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稿饰,“玉大人,你說我怎么就攤上這事露泊『砹” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵惭笑,是天一觀的道長侣姆。 經(jīng)常有香客問我,道長沉噩,這世上最難降的妖魔是什么捺宗? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮屁擅,結(jié)果婚禮上偿凭,老公的妹妹穿的比我還像新娘。我一直安慰自己派歌,他們只是感情好弯囊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布痰哨。 她就那樣靜靜地躺著,像睡著了一般匾嘱。 火紅的嫁衣襯著肌膚如雪斤斧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天霎烙,我揣著相機(jī)與錄音撬讽,去河邊找鬼。 笑死悬垃,一個(gè)胖子當(dāng)著我的面吹牛游昼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播尝蠕,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼烘豌,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了看彼?” 一聲冷哼從身側(cè)響起廊佩,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎靖榕,沒想到半個(gè)月后标锄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茁计,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年料皇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片簸淀。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瓶蝴,死狀恐怖毒返,靈堂內(nèi)的尸體忽然破棺而出租幕,到底是詐尸還是另有隱情,我是刑警寧澤拧簸,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布劲绪,位于F島的核電站,受9級(jí)特大地震影響盆赤,放射性物質(zhì)發(fā)生泄漏贾富。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一牺六、第九天 我趴在偏房一處隱蔽的房頂上張望颤枪。 院中可真熱鬧,春花似錦淑际、人聲如沸畏纲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盗胀。三九已至艘蹋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間票灰,已是汗流浹背女阀。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屑迂,地道東北人浸策。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像惹盼,于是被迫代替她去往敵國和親的榛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

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

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案逻锐? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,754評(píng)論 1 92
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程夫晌,因...
    小菜c閱讀 6,419評(píng)論 0 17
  • 公元2010年9月8日,我和堂弟乘車來到南昌昧诱,即將在這座不尷不尬的城市開始我們新的學(xué)習(xí)生涯晓淀。正值酷暑,南昌熱得過分...
    二文閱讀 354評(píng)論 0 1
  • 限定性與非限定性從句 限定性從句限制了主語的特征盏档,以下面句子為例: The suspect in the line...
    Nuk閱讀 398評(píng)論 0 0
  • 從小我們就可以相互感知凶掰,最近已經(jīng)連續(xù)幾天都做同樣的夢(mèng)了,是你回來了對(duì)么蜈亩?
    小水1021閱讀 127評(píng)論 3 0