多頁(yè)面切換頂部tabbar

經(jīng)常會(huì)有一些可以水平切換的多頁(yè)面視圖涌矢,如圖掖举,這里先不討論大于3個(gè)頁(yè)面的情況,專(zhuān)心解決2-3頁(yè)面切換娜庇,頂部tabbar的問(wèn)題拇泛。

Simulator Screen Shot 2016年12月22日 下午5.28.10.png

避免重復(fù)的工作

頂部tabbar功能和顯示基本都一樣,按鈕思灌、指示器、狀態(tài)恭取、位置變化泰偿,封裝一下,按需求配置一下標(biāo)題蜈垮、文字顏色耗跛、字體大小等等就可以。

滑動(dòng)問(wèn)題

在使用一些App的時(shí)候攒发,往往是頁(yè)面完全切換完成了调塌,tabbar的指示器才切換過(guò)去,讓人感覺(jué)像有延遲一樣惠猿。解決方案就是監(jiān)聽(tīng)scrollView的滑動(dòng)事件羔砾,來(lái)控制指示器的滑動(dòng)。既然偶妖,指示器是放在頂部tabbar里面姜凄,那就讓頂部tabbar來(lái)處理這個(gè)問(wèn)題。

使用的話(huà)寫(xiě)了一個(gè)小的demo

#import "XFTopbarDemoViewController.h"

#import <YYKit/YYKit.h>
#import "XFTopTabBar.h"

@interface XFTopbarDemoViewController () <XFTopTabBarDelegate>

@property (strong, nonatomic) XFTopTabBar *topbar;

@property (strong, nonatomic) UIScrollView *scrollView;

@property (strong, nonatomic) UIViewController *vc0;
@property (strong, nonatomic) UIViewController *vc1;
@property (strong, nonatomic) UIViewController *vc2;

@end

@implementation XFTopbarDemoViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.edgesForExtendedLayout = UIRectEdgeNone;
    
    [self.scrollView addSubview:self.vc0.view];
    [self.scrollView addSubview:self.vc1.view];
    [self.scrollView addSubview:self.vc2.view];
    
    [self.view addSubview:self.scrollView];
    
        //scrollView的page必須和topbar的titles.count相同
    self.topbar.scrollView = self.scrollView;
    [self.view addSubview:self.topbar];
    
    //必須配置完成才設(shè)置delegate
    self.topbar.delegate = self;
}

- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];
    
    self.topbar.frame = CGRectMake(0, 0, self.view.width, 45);
    self.scrollView.frame = CGRectMake(0, self.topbar.bottom, self.view.width, self.view.height-self.topbar.height);
    
    self.scrollView.contentSize = CGSizeMake(self.view.width*3,self.scrollView.height);
}

#pragma mark - 

- (NSArray *)titlesForTopTabbar:(XFTopTabBar *)topTabBar {
    return @[@"頭條", @"美食", @"玩樂(lè)"];
}

#pragma mark - setter & getter

- (UIViewController *)vc0 {
    if (_vc0 == nil) {
        _vc0 = [[UIViewController alloc] init];
        
        _vc0.view.frame = CGRectMake(0, 0, YYScreenSize().width, YYScreenSize().height-64-45);
        
        _vc0.view.backgroundColor = [UIColor lightTextColor];
    }
    return _vc0;
}

- (UIViewController *)vc1 {
    if (_vc1 == nil) {
        _vc1 = [[UIViewController alloc] init];
        
        _vc1.view.frame = CGRectMake(YYScreenSize().width, 0, YYScreenSize().width, YYScreenSize().height-64-45);
        
        _vc1.view.backgroundColor = [UIColor yellowColor];
    }
    return _vc1;
}

- (UIViewController *)vc2 {
    if (_vc2 == nil) {
        _vc2 = [[UIViewController alloc] init];
        
        _vc2.view.frame = CGRectMake(YYScreenSize().width*2, 0, YYScreenSize().width, YYScreenSize().height-64-45);
        _vc2.view.backgroundColor = [UIColor greenColor];
    }
    return _vc2;
}

- (XFTopTabBar *)topbar {
    if (_topbar == nil) {
        _topbar = [[XFTopTabBar alloc] initWithFrame:CGRectMake(0, 0, YYScreenSize().width, 45)];
        
        _topbar.backgroundColor    = [UIColor whiteColor];
        _topbar.normalStateColor   = [UIColor grayColor];
        _topbar.selectedStateFont  = [UIFont systemFontOfSize:17];
        _topbar.selectedStateColor = [UIColor greenColor];
    }
    return _topbar;
}

- (UIScrollView *)scrollView {
    if (_scrollView == nil) {
        _scrollView = [UIScrollView new];
        
        _scrollView.pagingEnabled = YES;
        _scrollView.backgroundColor = [UIColor orangeColor];
    }
    return _scrollView;
}

@end

效果是滑動(dòng)scrollView的時(shí)候趾访,上面的指示器跟著滑态秧,scrollView觸發(fā)了翻頁(yè),上面的按鈕的選中狀態(tài)也會(huì)改變扼鞋。點(diǎn)擊tabbar上面的按鈕申鱼,scrollView和指示器都會(huì)跟著滑。

項(xiàng)目地址:https://github.com/xxdzyyh/XFFoundation

存在問(wèn)題和未來(lái)擴(kuò)展

  1. scrollView的page數(shù)必須和tabbar的titles數(shù)相同云头。這個(gè)問(wèn)題在XFHSwipeViewController中已經(jīng)解決了
  2. 指示器和按鈕還不支持自定義
  3. tabbar顯示不下需要滑動(dòng)的問(wèn)題
  4. XFFoundation在不同的項(xiàng)目中改來(lái)改去捐友,可能會(huì)有一些兼容問(wèn)題
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市盘寡,隨后出現(xiàn)的幾起案子楚殿,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脆粥,死亡現(xiàn)場(chǎng)離奇詭異砌溺,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)变隔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)规伐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人匣缘,你說(shuō)我怎么就攤上這事猖闪。” “怎么了肌厨?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵培慌,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我柑爸,道長(zhǎng)吵护,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任表鳍,我火速辦了婚禮馅而,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘譬圣。我一直安慰自己瓮恭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布厘熟。 她就那樣靜靜地躺著屯蹦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盯漂。 梳的紋絲不亂的頭發(fā)上颇玷,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音就缆,去河邊找鬼帖渠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛竭宰,可吹牛的內(nèi)容都是我干的空郊。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼切揭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼狞甚!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起廓旬,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤哼审,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體涩盾,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡十气,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了春霍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砸西。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖址儒,靈堂內(nèi)的尸體忽然破棺而出芹枷,到底是詐尸還是另有隱情,我是刑警寧澤莲趣,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布鸳慈,位于F島的核電站,受9級(jí)特大地震影響喧伞,放射性物質(zhì)發(fā)生泄漏蝶涩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一絮识、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嗽上,春花似錦次舌、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至浅萧,卻和暖如春逐沙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背洼畅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工吩案, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人帝簇。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓徘郭,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親丧肴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子残揉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件芋浮、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,059評(píng)論 4 62
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,756評(píng)論 25 707
  • 真正的好伴侶抱环,一定是精神上可以共鳴,心靈上互通,情感上相互依賴(lài)的那種镇草。 前兩天看了專(zhuān)欄作家李月亮的一篇文章眶痰,大概是...
    雲(yún)裳閱讀 433評(píng)論 2 2
  • 20170601 星期四 晴 《正面管教》就是讓孩子發(fā)揮內(nèi)因作用的教育方法。 《十幾歲正面管教》與《教室里的正面管...
    晴媽愛(ài)上閱讀閱讀 199評(píng)論 0 0