分頁控制器耿眉,這個還不夠边翼?

之前一直想要找的分頁效果一直找不到,就自己寫了一個

大神求點評鸣剪,先上效果圖和層次圖

xxxx.gif
segment.png

其他不說了组底,直接上代碼吧
新建一個控制器,繼承UIViewController西傀,下面是.h文件,定義一些屬性只是為了封裝而已

#import <UIKit/UIKit.h>

@interface SegmentVC : UIViewController

/**導(dǎo)航欄標(biāo)題->不需要的在viewDidload里面修改一下就好*/
@property (nonatomic, strong) NSString *headTitle;

/**未選擇按鈕字體顏色 -> 默認[UIColor lightGrayColor]*/
@property (nonatomic, strong) UIColor *behindTitleColor;

/**當(dāng)前選中字體顏色 默認藍色*/
@property (nonatomic, strong) UIColor *selectTitleColor;

/**滑動線條的顏色 默認藍色*/
@property (nonatomic, strong) UIColor *pageLineColor;

@end

新建兩個空白控制器做測試用桶癣,下面是.m的頭文件和宏定義以及私有屬性

#import "SegmentVC.h"
#import "TestViewController1.h"
#import "TestViewController2.h"

#define PageCount 5
#define kButton_h 50
#define kTag 1000

#define KSCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height
#define KSCREEN_WIDTH [UIScreen mainScreen].bounds.size.width

@interface SegmentVC ()<UIScrollViewDelegate>

/**分頁里面的滾動視圖*/
@property (nonatomic, strong) UIScrollView *scrollView;
/**選中按鈕*/
@property (nonatomic, strong) UIButton *selectBtn;
/**選中按鈕顯示的視圖*/
@property (nonatomic, strong) UIView *selectView;
/**顏色字體添加的視圖*/
@property (nonatomic, strong) UIView *mainView;
/**當(dāng)前視圖頁數(shù)*/
@property (nonatomic, assign) NSInteger currentPages;

//存放控制器view
@property (nonatomic, strong) NSArray *viewAry;
//文字數(shù)組
@property (nonatomic, strong) NSArray *titleAry;

/**底部滾動視圖條*/
@property (nonatomic, strong) UIView *pageLine;

@end

懶加載和viewDidLoad

- (UIView *)pageLine {
    if (_pageLine == nil) {
        self.pageLine = [[UIView alloc]init];
        _pageLine.backgroundColor = self.pageLineColor ? self.pageLineColor : [UIColor blueColor];
    }
    return _pageLine;
}

- (UIScrollView *)scrollView {
    if (!_scrollView) {
        /**如果需要修改滾動視圖frame在這修改*/
        _scrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, kButton_h+64, KSCREEN_WIDTH, KSCREEN_HEIGHT-64-kButton_h)];
        _scrollView.pagingEnabled = YES;
        _scrollView.delegate = self;
        _scrollView.bounces = NO;
        _scrollView.showsVerticalScrollIndicator = NO;
        _scrollView.showsHorizontalScrollIndicator = NO;
        _scrollView.contentSize = CGSizeMake(KSCREEN_WIDTH * PageCount, KSCREEN_HEIGHT-64-kButton_h);
        
        _scrollView.backgroundColor = [UIColor orangeColor];
    }
    return _scrollView;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.title = self.headTitle;
    self.automaticallyAdjustsScrollViewInsets = NO;
    [self.view addSubview:self.scrollView];
    
    //假設(shè)控制器以及分頁文字
    self.viewAry = @[[TestViewController1 new],[TestViewController2 new],[TestViewController1 new],[TestViewController2 new],[TestViewController1 new]];
    self.titleAry = @[@"測試一",@"測試二",@"測試三",@"測試四",@"測試五"];
    
    //設(shè)置控制的每一個子控制器
    [self setupChildViewControll];
    //設(shè)置分頁按鈕
    [self setupPageButton];
}

設(shè)置控制的每一個子控制器

- (void)setupChildViewControll {
    for (int i = 0; i < self.viewAry.count; i ++) {
        UIViewController *viewC = self.viewAry[i];
        [self addChildViewController:viewC];
        [_scrollView addSubview:viewC.view];
        viewC.view.frame = CGRectMake(KSCREEN_WIDTH * i, 0, KSCREEN_WIDTH, KSCREEN_HEIGHT);
    }
}

設(shè)置分頁按鈕以及底部滾動條

- (void)setupPageButton {
    //最底層label
    for (int i = 0; i < self.titleAry.count; i ++) {
        CGFloat xMargin = KSCREEN_WIDTH / self.titleAry.count * i;
        [self.view addSubview:[self returnLabel:self.titleAry[i]
                                       andFrame:CGRectMake(xMargin, 64, KSCREEN_WIDTH/self.titleAry.count, kButton_h)
                                       andColor:self.behindTitleColor ? self.behindTitleColor : [UIColor lightGrayColor]]];
    }
    //設(shè)置上面覆蓋視圖拥褂,以及顯示字體文字顏色視圖
    _selectView = [[UIView alloc]initWithFrame:CGRectMake(0, 64, KSCREEN_WIDTH/self.titleAry.count, kButton_h)];
    _selectView.userInteractionEnabled = YES;
    _selectView.clipsToBounds = YES;//不顯示超出本身frame的視圖
    [self.view addSubview:_selectView];
    //添加覆蓋視圖里的label
    self.mainView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, KSCREEN_WIDTH, kButton_h)];
    self.mainView.userInteractionEnabled = YES;
    for (int i = 0; i < self.titleAry.count; i ++) {
        CGFloat xMargin = KSCREEN_WIDTH / self.titleAry.count * i;
        [self.mainView addSubview:[self returnLabel:self.titleAry[i]
                                         andFrame:CGRectMake(xMargin, 0, KSCREEN_WIDTH/self.titleAry.count, kButton_h)
                                         andColor:self.selectTitleColor ? self.selectTitleColor:[UIColor blueColor]]];
    }
    [_selectView addSubview:self.mainView];
    
    //添加最上面點擊按鈕
    for (int i = 0; i < self.titleAry.count; i ++) {
        CGFloat xMargin = KSCREEN_WIDTH / self.titleAry.count * i;
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.frame = CGRectMake(xMargin, 64, KSCREEN_WIDTH/self.titleAry.count, kButton_h);
        button.tag = i + kTag;
        [button addTarget:self action:@selector(pageClick:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:button];
        if (i == 0) {
            self.selectBtn = button;
        }
    }
    
    //添加下方跟著滾動的線
    CGFloat lineWidth = KSCREEN_WIDTH / self.titleAry.count / 2;
    self.pageLine.frame = CGRectMake(lineWidth / 2, 64 + kButton_h - 2, lineWidth, 2);
    [self.view addSubview:self.pageLine];
}

//準(zhǔn)備label
- (UILabel *)returnLabel:(NSString *)title andFrame:(CGRect)rect andColor:(UIColor *)color
{
    UILabel * label = [[UILabel alloc]initWithFrame:rect];
    label.font = [UIFont boldSystemFontOfSize:15];
    label.textColor = color;
    label.text = title;
    label.userInteractionEnabled = YES;
    label.textAlignment = NSTextAlignmentCenter;
    return label;
}

按鈕點擊事件

- (void)pageClick:(UIButton *)btn {
    self.currentPages = btn.tag - kTag;
    [self gotoCurrentPage];
}
- (void)gotoCurrentPage {
    CGRect frame;
    frame.origin.x = self.scrollView.frame.size.width * self.currentPages;
    frame.origin.y = 0;
    frame.size = _scrollView.frame.size;
    [_scrollView scrollRectToVisible:frame animated:YES];
    
}

代理

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    
    //修改兩個視圖的frame
    CGRect rect = self.selectView.frame;
    rect.origin.x = (scrollView.contentOffset.x / KSCREEN_WIDTH) * (KSCREEN_WIDTH / self.titleAry.count);
    self.selectView.frame = rect;
    
    CGRect mainRect = self.mainView.frame;
    mainRect.origin.x = - (scrollView.contentOffset.x / KSCREEN_WIDTH) * (KSCREEN_WIDTH / self.titleAry.count);
    self.mainView.frame = mainRect;

    //修改下面線條的frame
    CGRect lineRect = _pageLine.frame;
    lineRect.origin.x = (scrollView.contentOffset.x / KSCREEN_WIDTH) * (KSCREEN_WIDTH / self.titleAry.count) + (KSCREEN_WIDTH / self.titleAry.count / 4);;
    _pageLine.frame = lineRect;
    
    //修改當(dāng)前按鈕
    UIButton *button = [self.view viewWithTag:self.currentPages + kTag];
    if ([self.selectBtn isEqual:button]) {
        return;
    }
    self.selectBtn = button;
}

我簡單說一下這個頂部視圖的結(jié)構(gòu)吧,說的不好可以隨便批評牙寞,??饺鹃。 1.最底部是5個label莫秆,label的字體默認設(shè)為灰色 2.再添加一個view,view的高和寬跟label一樣悔详,設(shè)置view不顯示超出本身frame多視圖:clipsToBounds = YES 3.在view里面添加一個midView镊屎,midView的高和寬等于整個頂部視圖frame 4.在midView里添加5個hightLable,frame和text分別跟前面5個label一樣茄螃,默認顏色藍色(當(dāng)前所選分頁的字體顏色) 5.在最上面再添加3個按鈕

感覺說的一塌糊涂缝驳,小白見諒。如果需要代碼的話可以加群:515385179归苍,新建的群用狱,平時聊聊天,有時間逛都會收集一些代碼放群共享拼弃,歡迎大神指點~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末夏伊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吻氧,更是在濱河造成了極大的恐慌溺忧,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盯孙,死亡現(xiàn)場離奇詭異鲁森,居然都是意外死亡,警方通過查閱死者的電腦和手機镀梭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門刀森,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人报账,你說我怎么就攤上這事研底。” “怎么了透罢?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵榜晦,是天一觀的道長。 經(jīng)常有香客問我羽圃,道長乾胶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任朽寞,我火速辦了婚禮识窿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脑融。我一直安慰自己喻频,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布肘迎。 她就那樣靜靜地躺著甥温,像睡著了一般锻煌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上姻蚓,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天宋梧,我揣著相機與錄音,去河邊找鬼狰挡。 笑死捂龄,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的圆兵。 我是一名探鬼主播跺讯,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼殉农!你這毒婦竟也來了刀脏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤超凳,失蹤者是張志新(化名)和其女友劉穎愈污,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轮傍,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡暂雹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了创夜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杭跪。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖驰吓,靈堂內(nèi)的尸體忽然破棺而出涧尿,到底是詐尸還是另有隱情,我是刑警寧澤檬贰,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布姑廉,位于F島的核電站,受9級特大地震影響翁涤,放射性物質(zhì)發(fā)生泄漏桥言。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一葵礼、第九天 我趴在偏房一處隱蔽的房頂上張望号阿。 院中可真熱鬧,春花似錦鸳粉、人聲如沸扔涧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扰柠。三九已至,卻和暖如春疼约,著一層夾襖步出監(jiān)牢的瞬間卤档,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工程剥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留劝枣,地道東北人。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓织鲸,卻偏偏與公主長得像舔腾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子搂擦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,665評論 2 354

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫稳诚、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,096評論 4 62
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,085評論 25 707
  • 2014.10.02 廈門大學(xué)的同學(xué)來找我跟小冉玩瀑踢,我們出去吃飯看電影聊天扳还,在泉州這座寂寞的城市走走停停,心情也起...
    枚橙roro閱讀 263評論 0 1
  • 一直想記錄一些東西橱夭,為了某些無處安放的情緒氨距,希望簡書可以幫我達成愿望
    葉彌兒閱讀 144評論 0 0
  • 1、iconfont批量下載: var icons = document.querySelectorAll('.p...
    jeatime6閱讀 546評論 0 0