ios自定義類似網(wǎng)易新聞的滾動條

效果圖:

因為注釋很詳細(xì) 就不再單獨講,直接放上代碼。


NewsViewController.m中:
#import "NewsViewController.h"
#import "TopLineViewController.h"
#import "HotViewController.h"
#import "SocietyViewController.h"
#import "VedioViewController.h"
#import "ReaderViewController.h"
#import "ScienceViewController.h"

static  CGFloat const labelw = 100;
static  CGFloat  const radio = 1.3;
#define WIDTH [UIScreen mainScreen].bounds.size.width
#define HEIGHT [UIScreen mainScreen].bounds.size.height
@interface NewsViewController ()<UIScrollViewDelegate>
@property (weak, nonatomic) IBOutlet UIScrollView *titleScrollView;
@property (nonatomic,weak)UILabel *selectedLabel;
@property (weak, nonatomic) IBOutlet UIScrollView *contentScrollView;

@property (strong,nonatomic)NSMutableArray *titleLabels;
@end

@implementation NewsViewController
-(NSMutableArray *)titleLabels{
    if(!_titleLabels){
        _titleLabels = [NSMutableArray array];
    }
    return _titleLabels;
}
- (void)viewDidLoad {
    [super viewDidLoad];
    //添加所有子控制器
    [self setUpAllChildViewController];
    //添加所有子控制器對應(yīng)的標(biāo)題
    [self setUpTitleLabel];
    //iOS7會給導(dǎo)航試圖控制器下所有的UIScorllView頂部添加額外的滾動區(qū)域  不需要  所以設(shè)置成NO
    self.automaticallyAdjustsScrollViewInsets = NO;
    //初始化UIScrollView
    [self setUpScrollView];
}

-(void)setUpScrollView{
    NSUInteger count = self.childViewControllers.count;
    //設(shè)置標(biāo)題滾動條
    self.titleScrollView.contentSize = CGSizeMake(count*labelw, 0);
    self.titleScrollView.showsHorizontalScrollIndicator = NO;
    //設(shè)置內(nèi)容滾動條
    self.contentScrollView.contentSize = CGSizeMake(count*WIDTH, 0);
    //開啟分頁
    self.contentScrollView.pagingEnabled = YES;
    //去掉彈簧效果
    self.contentScrollView.bounces = NO;
    //隱藏水平滾動條
    self.contentScrollView.showsHorizontalScrollIndicator = NO;
    //設(shè)置代理
    self.contentScrollView.delegate = self;
    
}

-(void)setUpAllChildViewController{
    TopLineViewController *topLine = [[TopLineViewController alloc]init];
    topLine.title = @"頭條";
    [self addChildViewController:topLine];
    
    HotViewController *hot = [[HotViewController alloc]init];
    hot.title = @"熱點";
    [self addChildViewController:hot];
    
    SocietyViewController *society = [[SocietyViewController alloc]init];
    society.title = @"社會";
    [self addChildViewController:society];
    
    VedioViewController *vedio = [[VedioViewController alloc]init];
    vedio.title = @"視頻";
    [self addChildViewController:vedio];
    
    ReaderViewController*reader = [[ReaderViewController alloc]init];
    reader.title = @"閱讀";
    [self addChildViewController:reader];
    
    ScienceViewController *science = [[ScienceViewController alloc]init];
    science.title = @"科技";
    [self addChildViewController:science];
}

-(void)setUpTitleLabel{
    NSUInteger count = self.childViewControllers.count;
    CGFloat labelX = 0;
    CGFloat labelY = 0;
    CGFloat labelH = 44;
    for(int i = 0; i < count; i++){
        UIViewController *vc = self.childViewControllers[i];
        UILabel *label = [[UILabel alloc]init];
        //添加到titleLabels數(shù)組中
        [self.titleLabels addObject:label];
        labelX = i * labelw;
        //設(shè)置尺寸
        label.frame = CGRectMake(labelX, labelY, labelw, labelH);
        //設(shè)置label的文字
        label.text = vc.title;
        //設(shè)置用戶交互
        label.userInteractionEnabled = YES;
        //設(shè)置高亮文字顏色
        label.highlightedTextColor = [UIColor redColor];
        //設(shè)置label的tag
        label.tag = i;
        //設(shè)置label文字居中
        label.textAlignment = NSTextAlignmentCenter;
        //為label添加點擊手勢
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(titleClick:)];
                //默認(rèn)選中第0個label
        if(i==0){
            [self titleClick:tap];
        }
        [label addGestureRecognizer:tap];
        [self.titleScrollView addSubview:label];
        
    }
}
//使標(biāo)題滾動 點擊時居中
//設(shè)置標(biāo)題居中
-(void)setUpTitleCenter:(UILabel *)centerLabel{
    //計算偏移量
    CGFloat offsetX = centerLabel.center.x - WIDTH*0.5;
    if(offsetX < 0)offsetX = 0;//防止最左邊滾動出現(xiàn)空余
    //獲取最大的滾動范圍
    CGFloat maxOffsetX = self.titleScrollView.contentSize.width - WIDTH;
    if(offsetX > maxOffsetX) offsetX = maxOffsetX;//防止最右邊出現(xiàn)空余  到最右邊就不在滾動
    //滾動標(biāo)題滾動條
    [self.titleScrollView setContentOffset:CGPointMake(offsetX, 0) animated:YES];
}

#pragma mark --UIScrollViewDelegate
//監(jiān)聽scrollView的滾動
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
    CGFloat curPage = scrollView.contentOffset.x / scrollView.bounds.size.width;
    //左邊label的角標(biāo)
    NSInteger leftIndex = curPage;
    //右邊label的角標(biāo)
    NSInteger rightIndex = leftIndex + 1;
    //獲取左邊的label
    UILabel *leftLabel = self.titleLabels[leftIndex];
    //獲取最右邊
    UILabel *rightLabel;
    if(rightIndex < self.titleLabels.count-1){
        rightLabel = self.titleLabels[rightIndex];
    }
    //計算縮放比例
    CGFloat rightScale = curPage - leftIndex;
    CGFloat leftScale = 1 - rightScale;
    //縮放
    leftLabel.transform = CGAffineTransformMakeScale(leftScale*0.3+1, leftScale*0.3+1);
    rightLabel.transform = CGAffineTransformMakeScale(rightScale*0.3+1, rightScale*0.3+1);
    leftLabel.textColor = [UIColor colorWithRed:leftScale green:0 blue:0 alpha:1];
    rightLabel.textColor = [UIColor colorWithRed:rightScale green:0 blue:0 alpha:1];
}

//滾動完成的時候調(diào)用這個方法
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    //獲取滾動到哪一頁
    NSInteger index = scrollView.contentOffset.x/scrollView.bounds.size.width;
    //顯示對應(yīng)的視圖控制器
    [self showVc:index];
    //把對應(yīng)的label選中
    UILabel *selLabel = self.titleLabels[index];
    [self selectLabel:selLabel];
    //讓選中的標(biāo)題居中
    [self setUpTitleCenter:selLabel];
    
}

-(void)showVc:(NSInteger)index{
    CGFloat offsetX = index * WIDTH;
    //獲取對應(yīng)的子控制器
    UIViewController *vc = self.childViewControllers[index];
    //添加子控制器View
    //如果控制器已經(jīng)創(chuàng)建好了  就直接return不再創(chuàng)建了
    if(vc.isViewLoaded)return;
    vc.view.frame = CGRectMake(offsetX, 0, WIDTH, HEIGHT);
    [self.contentScrollView addSubview:vc.view];
}

-(void)titleClick:(UITapGestureRecognizer*)sender{
    
    UILabel *selLabel = (UILabel*)sender.view;
    [self selectLabel:selLabel];
    
    NSInteger index = selLabel.tag;
    //計算滾動的位置
    CGFloat offsetX = selLabel.tag * WIDTH;
    self.contentScrollView.contentOffset = CGPointMake(offsetX, 0);
    //給對應(yīng)的位置添加控制器
    [self showVc:index];
    //讓標(biāo)題居中
    [self setUpTitleCenter:selLabel];
    
}
//選中按鈕的設(shè)置
-(void)selectLabel:(UILabel *)label{
    
    //取消上一個選中
    _selectedLabel.highlighted = NO;
    //取消形變
    _selectedLabel.transform = CGAffineTransformIdentity;
    _selectedLabel.textColor = [UIColor blackColor];
    label.highlighted = YES;
    label.transform = CGAffineTransformMakeScale(radio, radio);
    _selectedLabel = label;
}

@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末研铆,一起剝皮案震驚了整個濱河市躏尉,隨后出現(xiàn)的幾起案子清钥,更是在濱河造成了極大的恐慌琼锋,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祟昭,死亡現(xiàn)場離奇詭異缕坎,居然都是意外死亡,警方通過查閱死者的電腦和手機从橘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門念赶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來础钠,“玉大人恰力,你說我怎么就攤上這事∑煊酰” “怎么了踩萎?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長很钓。 經(jīng)常有香客問我香府,道長,這世上最難降的妖魔是什么码倦? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任企孩,我火速辦了婚禮,結(jié)果婚禮上袁稽,老公的妹妹穿的比我還像新娘勿璃。我一直安慰自己,他們只是感情好推汽,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布补疑。 她就那樣靜靜地躺著,像睡著了一般歹撒。 火紅的嫁衣襯著肌膚如雪莲组。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天暖夭,我揣著相機與錄音锹杈,去河邊找鬼撵孤。 笑死,一個胖子當(dāng)著我的面吹牛竭望,可吹牛的內(nèi)容都是我干的早直。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼市框,長吁一口氣:“原來是場噩夢啊……” “哼霞扬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎苏研,沒想到半個月后跪另,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡井濒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肆汹。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖予权,靈堂內(nèi)的尸體忽然破棺而出昂勉,到底是詐尸還是另有隱情,我是刑警寧澤扫腺,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布岗照,位于F島的核電站,受9級特大地震影響笆环,放射性物質(zhì)發(fā)生泄漏攒至。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一躁劣、第九天 我趴在偏房一處隱蔽的房頂上張望迫吐。 院中可真熱鬧,春花似錦账忘、人聲如沸志膀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梧却。三九已至,卻和暖如春败去,著一層夾襖步出監(jiān)牢的瞬間放航,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工圆裕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留广鳍,地道東北人荆几。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像赊时,于是被迫代替她去往敵國和親吨铸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,099評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理祖秒,服務(wù)發(fā)現(xiàn)诞吱,斷路器,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 今晚/我怎能入睡/既然想起了母親/一切的往事便都醒了/我的記憶怎能安然入睡/
    翀的小天地閱讀 253評論 0 3
  • 2011-04-16 21:49分類:新格律詩 一縷幽深泛出時間的光 我的天宇已經(jīng)沒有憂傷 寒熱模糊了冬春的邊界 ...
    玄水青云閱讀 179評論 0 0
  • 前言:一直想寫volley竭缝,因為一開始做項目就開始接觸使用volley房维,好吧,廢話不多說抬纸,本篇包括基礎(chǔ)使用咙俩,以及源...
    小夢想家北冥有魚閱讀 1,715評論 0 0