iOS 仿网易新闻结构
来源:互联网 发布:java实现svm分类 编辑:程序博客网 时间:2024/06/15 23:55
1.首页效果
2.滑动过程中颜色渐变,文字缩放
3.滑动结束边缘标题自动适当居中
实现代码:
//// ViewController.m// 网易新闻//// Created by llkj on 2017/11/20.// Copyright © 2017年 LayneCheung. All rights reserved.//#import "ViewController.h"#import "TopLineViewController.h"#import "HotViewController.h"#import "VideoViewController.h"#import "SocietyViewController.h"#import "TechViewController.h"#import "ReadViewController.h"#define ScreenW [UIScreen mainScreen].bounds.size.width#define ScreenH [UIScreen mainScreen].bounds.size.height@interface ViewController ()<UIScrollViewDelegate>/** 标题scrollView */@property (nonatomic, weak) UIScrollView *titleScrollView;/** 内容scrollView */@property (nonatomic, weak) UIScrollView *contentScrollView;/** 标题数组 */@property (nonatomic, strong) NSArray *titles;/** 上一次点击选中的按钮 */@property (nonatomic, weak) UIButton *previousClickButton;/** 保存所有标题按钮的数组 */@property (nonatomic, strong) NSMutableArray *titleButtons;@end@implementation ViewController#pragma mark - 懒加载- (NSMutableArray *)titleButtons { if (_titleButtons == nil) { _titleButtons = [NSMutableArray array]; } return _titleButtons;}- (NSArray *)titles { if (_titles == nil) { _titles = @[@"头条", @"热点", @"视频", @"社会", @"订阅", @"科技",]; } return _titles;}- (void)viewDidLoad { [super viewDidLoad]; self.navigationItem.title = @"网易新闻"; //1.添加标题滚动视图 [self setupTitleScrollView]; //2.添加内容滚动视图 [self setupContentScrollView]; //3.添加所有子控制器 [self setupAllChildVC]; //4.设置所有标题 [self setupAllTitle];}#pragma mark - <UIScrollViewDelegate>//滚动完成调用- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { //获取当前角标 NSInteger i = scrollView.contentOffset.x / scrollView.frame.size.width; //获取标题按钮 UIButton *titleButton = self.titleButtons[i]; //1.选中标题 [self selectedButton:titleButton]; //2.把对应子控制器的View添加上去 [self addOneViewController:i];}- (void)scrollViewDidScroll:(UIScrollView *)scrollView { //字体缩放 //1.获得左边按钮 NSInteger leftI = scrollView.contentOffset.x / ScreenW;; UIButton *leftButton = self.titleButtons[leftI]; //2.获得右边按钮 NSInteger rightI = leftI + 1; UIButton *rightButton; if (rightI < self.titleButtons.count) { rightButton = self.titleButtons[rightI]; } // 0 ~ 1 => 1 ~ 1.2 CGFloat scaleR = scrollView.contentOffset.x / ScreenW; scaleR -= leftI; CGFloat scaleL = 1 - scaleR; //3.缩放按钮 leftButton.transform = CGAffineTransformMakeScale(scaleL * 0.2 + 1, scaleL * 0.2 + 1); rightButton.transform = CGAffineTransformMakeScale(scaleR * 0.2 + 1, scaleR * 0.2 + 1); //4.颜色渐变 UIColor *rightColor = [UIColor colorWithRed:scaleR green:0 blue:0 alpha:1]; UIColor *leftColor = [UIColor colorWithRed:scaleL green:0 blue:0 alpha:1]; [rightButton setTitleColor:rightColor forState:UIControlStateNormal]; [leftButton setTitleColor:leftColor forState:UIControlStateNormal];}#pragma mark - 设置所有标题- (void)setupAllTitle { // 添加所有标题按钮 CGFloat btnX = 0; CGFloat btnW = 100; CGFloat btnH = self.titleScrollView.frame.size.height; for (NSInteger i = 0; i < self.titles.count; i++) { UIButton *titleButton = [UIButton buttonWithType:UIButtonTypeCustom]; titleButton.tag = i; btnX = i * btnW; titleButton.frame = CGRectMake(btnX, 0, btnW, btnH); [titleButton setTitle:self.titles[i] forState:UIControlStateNormal]; [titleButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; [titleButton addTarget:self action:@selector(titleButtonClick:) forControlEvents:UIControlEventTouchUpInside]; [self .titleScrollView addSubview:titleButton]; //把按钮保存在titleButtons数组中 [self.titleButtons addObject:titleButton]; if (i == 0) {//默认选中第0个标题 [self titleButtonClick:titleButton]; } } self.titleScrollView.contentSize = CGSizeMake(self.titles.count * btnW, 0); self.contentScrollView.contentSize = CGSizeMake(self.titles.count * ScreenW, 0);}#pragma mark - 选中按钮- (void)selectedButton:(UIButton *)button { self.previousClickButton.transform = CGAffineTransformIdentity; [self.previousClickButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; [button setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; //标题居中 [self setupTitleCenter:button]; //字体缩放 button.transform = CGAffineTransformMakeScale(1.2, 1.2); self.previousClickButton = button;}#pragma mark - 标题居中- (void)setupTitleCenter:(UIButton *)button { //修改titleScrollView的偏移量 CGFloat offSetX = button.center.x - ScreenW * 0.5; 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 - 加载对应子控制器View- (void)addOneViewController:(NSInteger)i { UIViewController *childVC = self.childViewControllers[i]; //如果View已经被加载直接返回// if (childVC.view.superview) return; if (childVC.viewIfLoaded) return; //ios 9.0之后可以使用 CGFloat childViewW = self.contentScrollView.bounds.size.width; CGFloat childViewH = self.contentScrollView.bounds.size.height;; CGFloat childViewX = i * childViewW; childVC.view.frame = CGRectMake(childViewX, 0, childViewW, childViewH); [self.contentScrollView addSubview:childVC.view];}#pragma mark - 标题点击- (void)titleButtonClick:(UIButton *)titleButton { // 1.标题颜色变红 [self selectedButton:titleButton]; // 2.加载对应子控制器View [self addOneViewController:titleButton.tag]; // 3.内容滚动视图滚动到对应的位置 self.contentScrollView.contentOffset = CGPointMake(titleButton.tag * self.contentScrollView.bounds.size.width, 0);}#pragma mark - 添加所有子控制器- (void)setupAllChildVC { //注意:控制器加载的顺序要和titles中的一一对应,顺序和数量自己也可以调整 // 头条 [self addChildViewController:[[TopLineViewController alloc] init]]; // 热点 [self addChildViewController:[[HotViewController alloc] init]]; // 视频 [self addChildViewController:[[VideoViewController alloc] init]]; // 社会 [self addChildViewController:[[SocietyViewController alloc] init]]; // 订阅 [self addChildViewController:[[ReadViewController alloc] init]]; // 科技 [self addChildViewController:[[TechViewController alloc] init]];}#pragma mark - 添加标题滚动视图- (void)setupTitleScrollView { //创建titleScrollView UIScrollView *titleScrollView = [[UIScrollView alloc] init]; CGFloat y = self.navigationController.navigationBarHidden ? 20 : 64; titleScrollView.frame = CGRectMake(0, y, ScreenW, 44); titleScrollView.showsHorizontalScrollIndicator = NO; [self.view addSubview:titleScrollView]; _titleScrollView = titleScrollView;}#pragma mark - 添加内容滚动视图- (void)setupContentScrollView { //创建contentScrollView UIScrollView *contentScrollView = [[UIScrollView alloc] init]; CGFloat y = CGRectGetMaxY(self.titleScrollView.frame); contentScrollView.frame = CGRectMake(0, y, ScreenW, ScreenH - y); contentScrollView.pagingEnabled = YES; contentScrollView.showsHorizontalScrollIndicator = NO; contentScrollView.bounces = NO; contentScrollView.delegate = self; [self.view addSubview:contentScrollView]; _contentScrollView = contentScrollView;}- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated.}@end
阅读全文
0 0
- iOS 仿网易新闻结构
- ios仿网易新闻客户端
- iOS 仿网易新闻框架
- iOS仿网易新闻、新浪新闻的新闻客户端
- 仿网易新闻客户端
- 仿网易新闻客户端
- 仿网易新闻框架
- 仿网易新闻客户端
- 仿网易新闻客户端
- iOS界面-仿网易新闻左侧抽屉式交互
- iOS界面-仿网易新闻左侧抽屉式交互
- IOS仿网易新闻客户端左右侧栏
- IOS仿网易新闻客户端左右侧栏
- IOS仿网易新闻客户端左右侧栏
- IOS仿网易新闻客户端左右侧栏
- IOS仿网易新闻客户端左右侧栏
- iOS界面-仿网易新闻左侧抽屉式交互
- iOS界面-仿网易新闻左侧抽屉式交互
- 单例模式简单实例
- 1.1.2 编程的开始
- XGTD v2.1 1CD(电磁仿真和分析软件)\
- jQuery 对checkbox的操作
- git 局域网搭建
- iOS 仿网易新闻结构
- flume的安装和简单使用
- 为什么requestWindowFeature一定要在setContentView之前调用?
- Jetty 填坑之路
- 一知半解学CubeMX——UART:空闲中断结合DMA实现不定长数据收发
- Mybatis中insert后返回主键
- MFC检测USB热插拔
- caffe 分类源码解读
- 安卓三方 极光推送