创建类似于网易新闻的头部

  • 网易新闻的头部点击切换不同界面主要运用到了iOS中父子控制器知识点。


//  ViewController.m
//  01-MG新闻
//
//  Created by ming on 15/12/13.
//  Copyright © 2015年 ming. All rights reserved.

#import "ViewController.h"
#import "HotViewController.h"
#import "ReaderVeiwController.h"
#import "ScienceVeiwController.h"
#import "SocietyVeiwController.h"
#import "TopVeiwController.h"
#import "VideoVeiwController.h"

#define screenW [UIScreen mainScreen].bounds.size.width
#define screenH [UIScreen mainScreen].bounds.size.height

@interface ViewController ()<UIScrollViewDelegate>
/** titleScrollView */
@property (nonatomic,weak) UIScrollView *titleScrollView;
/** contentScrollView */
@property (nonatomic,weak) UIScrollView *contentScrollView;
/** 按钮数组 */
@property (nonatomic,strong) NSMutableArray *titleButtons;
/** 选中按钮 */
@property (nonatomic,weak) UIButton *seltitleButton;
@end

#pragma mark ========= 常量 ============
CGFloat const LYMNavHeight = 64;
CGFloat const titleScrollViewH = 44;
static CGFloat const maxTitleScale = 1.35;

@implementation ViewController
#pragma mark ========= 懒加载 ============
- (NSMutableArray *)titleButtons{
    if (!_titleButtons) {
        _titleButtons = [NSMutableArray array];
    }
    return _titleButtons;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    self.title = @"MG新闻";
    // 不需要额外的滚动区域
    self.automaticallyAdjustsScrollViewInsets = NO;
    
    // 1.初始化标题TitleScrollView
    [self setUPTittelscrollView];
    
    // 2.初始化标题ContentlscrollView
    [self setUPContentlscrollView];
    
    // 3.初始化所有的子控制器
    [self setUPAllChildViewController];

    // 4.添加所有标题按钮
    [self setupAllTitleButton];
    
   
}

#pragma mark ========= 初始化标题TitleScrollView ============
// 1.初始化标题TitleScrollView
- (void)setUPTittelscrollView{
    UIScrollView *titleScrollView = [[UIScrollView alloc] init];
    CGRect frame = titleScrollView.frame;
    frame.origin.y = LYMNavHeight;
    frame.size.width = screenW;
    frame.size.height = titleScrollViewH;
    titleScrollView.frame = frame;
    titleScrollView.showsHorizontalScrollIndicator = NO;
    
    [self.view addSubview:titleScrollView];
    self.titleScrollView = titleScrollView;

    titleScrollView.backgroundColor = [UIColor grayColor];
}

// 添加所有标题按钮
- (void)setupAllTitleButton{
    CGFloat buttonW = 100;
    CGFloat buttonH = titleScrollViewH;
    CGFloat buttonX = 0;
    CGFloat buttonY = 0;

    NSInteger count = self.childViewControllers.count;
    for (int i = 0; i<count; i++) {
        UIButton *titleBtn = [[UIButton alloc] init];
        // 绑定tag
        titleBtn.tag = i;
        // 设置尺寸
        buttonX = i * buttonW;
        titleBtn.frame = CGRectMake( buttonX, buttonY, buttonW, buttonH);
        // 设置文字
        [titleBtn setTitle:self.childViewControllers[i].title forState:UIControlStateNormal];

        [titleBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        // 监听
        [titleBtn addTarget:self action:@selector(titleBtnClick:) forControlEvents:UIControlEventTouchDown];
        [self.titleScrollView addSubview:titleBtn];
        [self.titleButtons addObject:titleBtn];
        // 默认第一个为选中按钮
        if (i == 0) {
            [self btnClick:titleBtn];
        }
    }
    // 设置titleScrollView的滚动范围
    self.titleScrollView.contentSize = CGSizeMake(count * buttonW, 0);
    self.contentScrollView.contentSize = CGSizeMake(count * screenW, 0);

}

// 监听按钮点击 切换文字颜色
- (void)titleBtnClick:(UIButton *)btn{
    [self btnClick:btn];
    // 点击按钮,加载对应的View
    NSInteger j = btn.tag;
    // 计算每一个View的位置
    [self setUPOneChildViewController:j];
}


- (void)btnClick:(UIButton *)btn{
    // 三部曲
    [self.seltitleButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    // 之前选中的恢复原样
    self.seltitleButton.transform = CGAffineTransformIdentity;
    
    [btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    // 当前选中的放大
    btn.transform = CGAffineTransformMakeScale(maxTitleScale, maxTitleScale);
    [self setselButtonOnCenter:btn];
    self.seltitleButton = btn;
}

#pragma mark ========= 初始化标题子控制器 ============
- (void)setUPOneChildViewController:(NSInteger)j{
    // 获取对应控制器
    UIViewController *vc = self.childViewControllers[j];
    CGFloat x = j * screenW;
    CGFloat y = 0;
    CGFloat width = screenW;
    CGFloat height = self.contentScrollView.frame.size.height;

    vc.view.frame = CGRectMake(x, y, width, height);
    [self.contentScrollView addSubview:vc.view];
    
    // 点击按钮就跳转到当前的控制器
    self.contentScrollView.contentOffset = CGPointMake(j * screenW, 0);
}

#pragma mark ========= 初始化标题ContentlscrollView ============
// 2.初始化标题ContentlscrollView
- (void)setUPContentlscrollView{
    UIScrollView *contentScrollView = [[UIScrollView alloc] init];
    CGRect frame = contentScrollView.frame;
    frame.origin.y = CGRectGetMaxY(self.titleScrollView.frame);
    frame.size.width = screenW;
    frame.size.height = screenH - frame.origin.y;
    contentScrollView.frame = frame;
    // 开启分页功能
    contentScrollView.pagingEnabled = YES;
    // 隐藏水平条
    contentScrollView.showsHorizontalScrollIndicator = NO;
    
    [self.view addSubview:contentScrollView];
    self.contentScrollView = contentScrollView;

    // 设置代理
    contentScrollView.delegate = self;
//    contentScrollView.backgroundColor = [UIColor yellowColor];
 
}

#pragma mark ========= UIScrollViewDelegate ============
/**
 *   监听滑动,切换界面。还有切换按钮
 */
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    // 1.取得角标
    int index = (int)scrollView.contentOffset.x/screenW;
    // 2.切换View
    [self setUPOneChildViewController:index];
    // 3.切换到选中的按钮
    [self btnClick:self.titleButtons[index]];
}

/**
 *  监听滑动,来个渐变过程
 */
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
  
    CGFloat offsetX = scrollView.contentOffset.x;
    // 1.取得角标
    int indexL = (int)offsetX/screenW;
    int indexR = indexL + 1;
    
    // 2.取得左边的按钮
    UIButton *leftButton = self.titleButtons[indexL];
    
    UIButton *rightButton = nil;
    if (indexR < self.titleButtons.count) {
        // 取得左边的按钮
        rightButton = self.titleButtons[indexR];
    }
    
    // 2.让按钮缩放,计算缩放比例
    CGFloat scaleR = (offsetX/screenW - indexL);
    CGFloat scaleL = 1 - scaleR;
    CGFloat transformScale = maxTitleScale - 1;
    
    // 2.1 让左边按钮缩放
    leftButton.transform = CGAffineTransformMakeScale(transformScale * scaleL + 1, transformScale * scaleL + 1);
    
    // 2.2 让右边按钮缩放
    rightButton.transform = CGAffineTransformMakeScale(transformScale * scaleR + 1, transformScale * scaleR + 1);
    
    // 3.让按钮颜色渐变
    //     RGB
    // 黑色:0 0 0
    // 白色:1 1 1
    // 红色:1 0 0
    // 黑色 -> 红色 R:0 -> 1
    // 红色 -> 黑色 R:1 -> 0
    UIColor *leftColor = [UIColor colorWithRed:scaleL green:0 blue:0 alpha:1];
    UIColor *rightColor = [UIColor colorWithRed:0 green:scaleR blue:0 alpha:1];
    // 3.1 让左边按钮的颜色
    [leftButton setTitleColor:leftColor forState:UIControlStateNormal];
    // 3.2 让左边按钮的颜色
    [rightButton setTitleColor:rightColor forState:UIControlStateNormal];
}

#pragma mark ========= 让选中按钮居中显示的方法 ============
- (void)setselButtonOnCenter:(UIButton *)btn{
    CGFloat offsetX = btn.center.x - 0.5 * screenW;
    if (offsetX < 0) {
        offsetX = 0;
    }
    CGFloat maxOffsetX = self.titleScrollView.contentSize.width - screenW;
    if (offsetX > maxOffsetX) {
        offsetX = maxOffsetX;
    }
   
    [self.titleScrollView setContentOffset:CGPointMake(offsetX, 0) animated:YES];
}

#pragma mark ========= 初始化所有的子控制器 ============
// 3.初始化所有的子控制器
- (void)setUPAllChildViewController{
    // 头条
    TopVeiwController *toptVC = [[TopVeiwController alloc] init];
    toptVC.title = @"头条";
    [self addChildViewController:toptVC];
    
    // 热点
    HotViewController *hotVC = [[HotViewController alloc] init];
    hotVC.title = @"热点";
    [self addChildViewController:hotVC];
    
    // 视频
    VideoVeiwController *videoVC = [[VideoVeiwController alloc] init];
    videoVC.title = @"视频";
    [self addChildViewController:videoVC];
    
    // 社会
    SocietyVeiwController *scoietyVC = [[SocietyVeiwController alloc] init];
    scoietyVC.title = @"社会";
    [self addChildViewController:scoietyVC];
    
    // 订阅
    ReaderVeiwController *readerVC = [[ReaderVeiwController alloc] init];
    readerVC.title = @"订阅";
    [self addChildViewController:readerVC];
    
    // 科技
    ScienceVeiwController *scienceVC = [[ScienceVeiwController alloc] init];
    scienceVC.title = @"科技";
    [self addChildViewController:scienceVC];
    
}

@end```

- ###效果:由于制作GIF比较麻烦,于是网上找了一个类似的效果图在(注:本文代码默认选中的titleButton会居中显示),如下:
![类似效果.gif](http://upload-images.jianshu.io/upload_images/1429890-fe2ac1ac0c73154f.gif?imageMogr2/auto-orient/strip)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容