当前位置: 移动技术网 > IT编程>移动开发>IOS > iOS仿网易新闻滚动导航条效果

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

宽带三晋2,手机百分网,搜搜音乐网

本文实例为大家分享了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

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

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

  • ios uicollectionview实现横向滚动

    现在使用卡片效果的app很多,之前公司让实现一种卡片效果,就写了一篇关于实现卡片的文章。文章最后附有demo实现上我选择了使用uicollectionview ... [阅读全文]
  • iOS UICollectionView实现横向滑动

    本文实例为大家分享了ios uicollectionview实现横向滑动的具体代码,供大家参考,具体内容如下uicollectionview的横向滚动,目前我使... [阅读全文]
  • iOS13适配深色模式(Dark Mode)的实现

    iOS13适配深色模式(Dark Mode)的实现

    好像大概也许是一年前, mac os系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的终于, 随着iphone11等新手机的发售, ios 13系统... [阅读全文]
  • ios 使用xcode11 新建项目工程的步骤详解

    ios 使用xcode11 新建项目工程的步骤详解

    xcode11新建项目工程,新增了scenedelegate这个类,转而将原appdelegate负责的对ui生命周期的处理担子接了过来。故此可以理解为:ios... [阅读全文]
  • iOS实现转盘效果

    本文实例为大家分享了ios实现转盘效果的具体代码,供大家参考,具体内容如下demo下载地址: ios转盘效果功能:实现了常用的ios转盘效果,轮盘抽奖效果的实现... [阅读全文]
  • iOS开发实现转盘功能

    本文实例为大家分享了ios实现转盘功能的具体代码,供大家参考,具体内容如下今天给同学们讲解一下一个转盘选号的功能,直接上代码直接看viewcontroller#... [阅读全文]
  • iOS实现轮盘动态效果

    本文实例为大家分享了ios实现轮盘动态效果的具体代码,供大家参考,具体内容如下一个常用的绘图,主要用来打分之类的动画,效果如下。主要是ios的绘图和动画,本来想... [阅读全文]
  • iOS实现九宫格连线手势解锁

    本文实例为大家分享了ios实现九宫格连线手势解锁的具体代码,供大家参考,具体内容如下demo下载地址:效果图:核心代码://// clockview.m// 手... [阅读全文]
  • iOS实现卡片堆叠效果

    本文实例为大家分享了ios实现卡片堆叠效果的具体代码,供大家参考,具体内容如下如图,这就是最终效果。去年安卓5.0发布的时候,当我看到安卓全新的material... [阅读全文]
  • iOS利用余弦函数实现卡片浏览工具

    iOS利用余弦函数实现卡片浏览工具

    本文实例为大家分享了ios利用余弦函数实现卡片浏览工具的具体代码,供大家参考,具体内容如下一、实现效果通过拖拽屏幕实现卡片移动,左右两侧的卡片随着拖动变小,中间... [阅读全文]
验证码:
移动技术网