iOS仿网易新闻滚动导航条效果

本文实例为大家分享了iOS滚动导航条效果展示的具体代码,供大家参考,具体内容如下

实现效果

效果:选择不同的栏目,下面出现不同的视图,栏目条可以滚动;下面的视图也可以滚动,滚动时上面对应的栏目要选中颜色为红色;

滚动的导航条包括两部分:标题滚动视图(UIScrollView),内容滚动视图(UIScrollView)

实现代码

1.首先实现Main.storyboard

2.创建多个子控制器:头条、科技、汽车、体育、视频、图片、热点

// 头条ViewController, 其它控制器和这个控制器都一样,只是背景颜色不同而已
#import <UIKit/UIKit.h>
@interface TopLineViewController : UIViewController

@end
//----------------------------------------------------------------
#import "TopLineViewController.h"
@interface TopLineViewController ()

@end

@implementation TopLineViewController
- (void)viewDidLoad {
  [super viewDidLoad];

  self.view.backgroundColor = [UIColor blackColor];
}
@end

实现Main.storyboard对应的视图控制器ViewController

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController

@end
//----------------------------------------------------------------
#import "ViewController.h"
#import "TopLineViewController.h"
#import "TechnologyViewController.h"
#import "CarViewController.h"
#import "SportsViewController.h"
#import "VideoViewController.h"
#import "ImageViewController.h"
#import "HotViewController.h"

#define ScreenWidth [UIScreen mainScreen].bounds.size.width
#define ScreenHeight [UIScreen mainScreen].bounds.size.height

@interface ViewController () <UIScrollViewDelegate>

@property (weak, nonatomic) IBOutlet UIScrollView *titleScrollView;

@property (weak, nonatomic) IBOutlet UIScrollView *contentScrollView;

@property (strong, nonatomic) NSMutableArray *buttons;
@property (strong, nonatomic) UIButton *selectedButton;

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  self.navigationItem.title = @"网易新闻";
  // 1. 初始化标题滚动视图上的按钮
  [self initButtonsForButtonScrollView];

}

- (void) initButtonsForButtonScrollView {
  // 初始化子控制器
  [self initChildViewControllers];
  CGFloat buttonWidth = 100;
  CGFloat buttonHeight = 40;
  NSInteger childViewControllerCount = self.childViewControllers.count;
  for (NSInteger i = 0; i < childViewControllerCount; i++) {
    UIViewController *childViewController = self.childViewControllers[i];
    UIButton *titleButton = [UIButton buttonWithType:UIButtonTypeCustom];
    titleButton.tag = i;
    CGFloat x = i * buttonWidth;
    titleButton.frame = CGRectMake(x, 0, buttonWidth, buttonHeight);
    [titleButton setTitle:childViewController.title forState:UIControlStateNormal];
    [titleButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [titleButton addTarget:self action:@selector(titleButtonOnClick:) forControlEvents:UIControlEventTouchUpInside];
    [self.titleScrollView addSubview:titleButton];

    [self.buttons addObject:titleButton];
  }

  self.titleScrollView.contentSize = CGSizeMake(buttonWidth * childViewControllerCount, 0);
  self.titleScrollView.showsHorizontalScrollIndicator = NO;
  self.titleScrollView.bounces = NO;

  self.contentScrollView.contentSize = CGSizeMake(ScreenWidth * childViewControllerCount, 0);
  self.contentScrollView.showsHorizontalScrollIndicator = NO;
  self.contentScrollView.pagingEnabled = YES;
  self.contentScrollView.delegate = self;

  // 禁止额外滚动区域
  self.automaticallyAdjustsScrollViewInsets = NO;

  // 初始化时默认选中第一个
  [self titleButtonOnClick:self.buttons[0]];
}

- (void)titleButtonOnClick:(UIButton *)button {
  // 1. 选中按钮
  [self selectingButton:button];

  // 2. 显示子视图
  [self addViewToContentScrollView:button];
}

- (void)selectingButton:(UIButton *)button {
  [_selectedButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
  _selectedButton.transform = CGAffineTransformMakeScale(1.0, 1.0);
  [button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
  button.transform = CGAffineTransformMakeScale(1.3, 1.3); // 选中字体变大,按钮变大,字体也跟着变大
  _selectedButton = button;

  // 选中按钮时要让选中的按钮居中
  CGFloat offsetX = button.frame.origin.x - ScreenWidth * 0.5;
  CGFloat maxOffsetX = self.titleScrollView.contentSize.width - ScreenWidth;

  if (offsetX < 0) {
    offsetX = 0;
  } else if (offsetX > maxOffsetX) {
    offsetX = maxOffsetX;
  }

  [self.titleScrollView setContentOffset:CGPointMake(offsetX, 0) animated:YES];
}

- (void)addViewToContentScrollView:(UIButton *)button {
  NSInteger i = button.tag;
  UIViewController *childViewController = self.childViewControllers[i];
  CGFloat x = i * ScreenWidth;

  // 防止添加多次
  if (childViewController.view.subviews != nil) {
    childViewController.view.frame = CGRectMake(x, 0, ScreenWidth, ScreenHeight);
    [self.contentScrollView addSubview:childViewController.view];
  }
  self.contentScrollView.contentOffset = CGPointMake(x, 0);
}

#pragma mark - UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

}

// 滚动结束时,将对应的视图控制器的视图添加到内容滚动视图中
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
  NSInteger i = self.contentScrollView.contentOffset.x / ScreenWidth;
  [self addViewToContentScrollView:_buttons[i]];

  // 内容滚动视图结束后选中对应的标题按钮
  [self selectingButton:_buttons[i]];
}

- (void)initChildViewControllers {
  // 0.头条
  TopLineViewController * topViewController = [[TopLineViewController alloc] init];
  topViewController.title = @"头条";
  [self addChildViewController:topViewController];

  // 1.科技
  TechnologyViewController * technologyViewController = [[TechnologyViewController alloc] init];
  technologyViewController.title = @"科技";
  [self addChildViewController:technologyViewController];

  // 2.汽车
  CarViewController * carViewController = [[CarViewController alloc] init];
  carViewController.title = @"汽车";
  [self addChildViewController:carViewController];

  // 3.体育
  SportsViewController * sportsViewController = [[SportsViewController alloc] init];
  sportsViewController.title = @"体育";
  [self addChildViewController:sportsViewController];

  // 4.视频
  VideoViewController * videoViewController = [[VideoViewController alloc] init];
  videoViewController.title = @"视频";
  [self addChildViewController:videoViewController];

  // 5.图片
  ImageViewController * imageViewController = [[ImageViewController alloc] init];
  imageViewController.title = @"图片";
  [self addChildViewController:imageViewController];

  // 6.热点
  HotViewController * hotViewController = [[HotViewController alloc] init];
  hotViewController.title = @"热点";
  [self addChildViewController:hotViewController];
}

- (NSMutableArray *)buttons {
  if (_buttons == nil) {
    _buttons = [NSMutableArray array];
  }

  return _buttons;
}
@end

以上代码即可实现网易新闻 滚动的导航条, 因该功能可能在其它地方使用,所以最好可以将该功能抽出来,便于其它控制器集成,暂时还没做。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • iOS仿网易简单头部滚动效果

    本文实例为大家分享了iOS仿网易滚动效果片展示的具体代码,供大家参考,具体内容如下 仿网易的主要思想为: 1. 设置好按钮与线的宽度, 2. 将所需要的标题传入并生成按钮 3. 在点击的时候,通过计算偏移量,将自身进行偏移 4. 偏移量的设置需要注意不能小于0并且不成大于contengsize-frame的宽度 具体代码如下,可直接使用,需要注意的是需要先设置宽度,再传标题数组才可自动调整,否则会固定为默认的60 另外,BtnArr与linelabel设置为readonly比较合理,不过这里还需

  • iOS实现文字水平无间断滚动效果

    IOS跑马灯效果,实现文字水平无间断滚动,示例代码如下: ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewController{ NSTimer *timer; UIScrollView *scrollViewText; } @property (nonatomic ,strong) NSArray *arrData; @end ViewController.m // // ViewContr

  • iOS实现滚动字幕的动画特效

    效果图 开始上代码 滚动字幕的原理是用timer定时器间隔一定的时间来驱动scrollView上的内容偏移,来实现滚动的效果,原理比较简单,关键是有些细节需要处理好,实现流畅效果的同时要考虑到性能优化 这里是.h文件的接口方法及属性,可适应大部分自定义场景 /*初始化*/ -(instancetype)initWithFrame:(CGRect)frame textArray:(NSArray *)textArray colorArray:(NSArray *)textColorArray; /

  • iOS中无限循环滚动简单处理实现原理分析

    说下原理: 1./*初始化/ + (instancetype)loopScrollViewWithFrame:(CGRect)frame; 将背景collectinview视图初始化设置 代理和数据源 . 布局 2.在激活initwithFrame后触发 layoutSubviews //默认滚动到要显示的第一张图片 if (self.imageCollectionView.contentOffset.x == 0) { NSIndexPath *indexPath = [NSIndexPath

  • 使用Swift实现iOScollectionView广告无限滚动效果(DEMO)

    今天公司里的实习生跑过来问我一般App上广告的无限滚动是怎么实现的,刚好很久没写博客了,就决定写下了,尽量帮助那些处于刚学iOS的程序猿. 做一个小demo,大概实现效果如下图所示: 基本实现思路: 1. 在你需要放置无限滚动展示数据的地方把他的数据,在原本的基础上把你要展示的数据扩大三倍.(当然扩大两倍也是可以的,三倍的话,比较好演示) // MARK: - 设置数据源 func collectionView(_ collectionView: UICollectionView, number

  • iOS使用UICollectionView实现横向滚动照片效果

    本文实例为大家分享了iOS使用UICollectionView实现横向滚动展示照片的具体代码,供大家参考,具体内容如下 这是Demo链接 效果图 思路 1. 界面搭建 界面的搭建十分简单,采用UICollectionView和自定义cell进行搭建即可. // ViewController.m // 下面使用到的宏和全局变量 #define ScreenW [UIScreen mainScreen].bounds.size.width #define ScreenH [UIScreen main

  • IOS上iframe的滚动条失效的解决办法

    问题描述: iframe设置了高度(例如500px).倘若iframe的内容足够长超出了iframe设定的高度时,在ipad等设备上.iframe内部html的滚动条不出现.并且活生生的从500px处截断,(类似overflow:hidden的效果)下面的内容不再显示. 问题重现: 结构: index.html : <style> #iframe{height:500px;} </style> <div id="content"> <ifram

  • IOS中无限滚动Scrollview效果

    本文实例讲了IOS无限滚动效果,分享给大家供大家参考,具体内容如下 滑动到当前位置时候才去请求,本地有内容则直接显示(以来SDWebImage,UIView+Ext) HZScrollView.h #import <UIKit/UIKit.h> typedef void(^HZReturnBlock)(NSInteger index,CGFloat offset); typedef NS_ENUM(NSUInteger, HZScrollViewPageControllPosition) {

  • iOS利用UIScrollView实现无限滚动效果

    前言 众所周知UIScrollView 的无限滚动主要应用在图片轮播器.欢迎界面等场景.它的原理是在要显示的图片前后各加一张图片即在第一张图片之前放最后一张图片,在最后一张图片之后放第一张图片,然后在滚动到边缘的时候,巧妙的过渡一下就可以"瞒天过海","以假乱真"的造成无限滚动的假象.网络上有很多只用三张或两张图片实现的方法,效率比这个方法高,但实现起来稍微麻烦一点,有兴趣的可以去深入研究. 实现步骤 1.根据需求准备几张图片,在网上找了5张图片,分别命名为 img

  • iOS实现无限循环滚动的TableView实战教程

    前言 本文主要给大家介绍了如何实现一个可以无限循环的TableView的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍吧. 先来看看效果: 思路 条条大路通罗马,个人分析下以下思路的可行性: 1.借鉴无限广告轮播的思路.可行性不高,主要是列表头部和尾部的衔接不够自然,而且快速滑动不够流畅. 2.使用TableView+3倍长度dataSource.可行性一般,在使用过程中滑动流畅,但是由于重复的数据源,可能导致在处理事件时需要特别对数据进行处理避免重复,另外此方法不能重用,总让有强迫

随机推荐