iOS实现自定义导航
2016-05-25 15:18
495 查看
#import "ViewController.h"
#import "SubViewController.h"
@interface
ViewController ()<UITableViewDataSource,UITableViewDelegate>
{
//存放视图控制器数据源
NSMutableArray *_vcArray;
//存放按钮的数组
NSMutableArray * _btnsArray;
UITableView *_tb;
//头部滚动视图
UIScrollView *_topScrollView;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super
viewDidLoad];
[self
setupTopScroll];
[self
setupVCArray];
[self
setupTableView];
}
#define SWIDTH [UIScreen mainScreen].bounds.size.width
#define SHEIGHT [UIScreen mainScreen].bounds.size.height
-(void)setupTopScroll{
//不让他自动调整scroll
_btnsArray = [NSMutableArray
array];
self.automaticallyAdjustsScrollViewInsets =
NO;
_topScrollView = [[UIScrollView
alloc]initWithFrame:CGRectMake(0, 64,
SWIDTH, 30)];
//[self.view addSubview:_topScrollView];
self.navigationItem.titleView =
_topScrollView;
NSArray *titles = @[@"科技",@"博客",@"动态",@"新闻",
@"王大",@"王二",@"王三",@"王四",
@"王五",@"王六",@"王七",@"王八"
];
for(int i = 0;i < 12;i++){
UIButton *button = [UIButton
buttonWithType:UIButtonTypeCustom];
button.frame =
CGRectMake(i*SWIDTH/4, 0,
SWIDTH/4, 30);
[button setTitle:titles[i]
forState:UIControlStateNormal];
if (i == 0) {
[button setTitleColor:[UIColor
colorWithRed:0.8
green:0 blue:0
alpha:1.0] forState:UIControlStateNormal];
}
else{
[button setTitleColor:[UIColor
colorWithRed:0.8
green:0.8 blue:0.8
alpha:1.0] forState:UIControlStateNormal];}
button.tag = 1000+i;
[button addTarget:self
action:@selector(changePage:)
forControlEvents:UIControlEventTouchUpInside];
button.titleLabel.font = [UIFont
systemFontOfSize:14];
[_topScrollView
addSubview:button];
[_btnsArray
addObject:button];
}
_topScrollView.contentSize =
CGSizeMake(SWIDTH*3, 0);
}
//初始化数据源
数据源存放视图控制器
-(void)setupVCArray{
_vcArray = [[NSMutableArray
alloc]init];;
for (NSInteger i = 0; i < 12; i++) {
//此时subVC的view还没有被创建出来,也即是subVC中的viewDidLoad方法不会被执行
如何使用到view viewDidLoad会被立刻执行
SubViewController *subVC = [[SubViewController
alloc]init];
subVC.index = i;
[_vcArray
addObject:subVC];
}
}
//初始化tableView
-(void)setupTableView{
_tb= [[UITableView
alloc]init];
//逆时针旋转90度
让tableView变成横向滚动
_tb.transform =
CGAffineTransformMakeRotation(-M_PI_2);
//旋转过后再去设置frame
_tb.frame =
CGRectMake(0, 94,
SWIDTH, SHEIGHT-94);
//关闭回弹
_tb.bounces =
NO;
_tb.pagingEnabled =
YES;
//去除分割线
_tb.separatorStyle =
UITableViewCellSeparatorStyleNone;
//设置行高
_tb.rowHeight =
SWIDTH;
//去除tableView的滚动条
_tb.showsVerticalScrollIndicator =
NO;
_tb.delegate =
self;
_tb.dataSource =
self;
[self.view
addSubview:_tb];
[_tb
registerClass:[UITableViewCell
class] forCellReuseIdentifier:@"Cell"];
}
#pragma mark - tableViewDelegate
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return
_vcArray.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath
*)indexPath{
UITableViewCell *cell = [tableView
dequeueReusableCellWithIdentifier:@"Cell"
forIndexPath:indexPath];
//去除cell的选中样式
cell.selectionStyle =
UITableViewCellSelectionStyleNone;
cell.transform =
CGAffineTransformMakeRotation(M_PI_2);
UILabel *label = [[UILabel
alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
label.text =
@"zhehisdadasd";
[cell.contentView
addSubview:label];
//布局cell
UIViewController *vc =
_vcArray[indexPath.row];
vc.view.frame = cell.contentView.bounds;
//先移除子视图,否则可能出现一个cell上出现了多个视图控制器的view
[cell.contentView.subviews
makeObjectsPerformSelector:@selector(removeFromSuperview)];
[cell.contentView
addSubview:vc.view];
return cell;
}
//滚动中实时被调用
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
//tableView 偏移量
横向过来了
CGFloat offSetY = scrollView.contentOffset.y;
//每一页偏移量 SWIDTH
//相对位移CGFloat width = (NSInteger )offSetX%(NSInteger)SWIDTH;
CGFloat ratio = (NSInteger )offSetY%(NSInteger)SWIDTH/SWIDTH;
NSLog(@"%f",ratio);
//当前的页数
NSInteger curIndex = (offSetY+SWIDTH/2)/SWIDTH;
NSLog(@"%ld",curIndex);
//下一页
//NSInteger nextIndex = ratio<0.5?curIndex+1:curIndex-1;
if (offSetY !=
SWIDTH*curIndex) {
NSInteger nextIndex= offSetY>curIndex*SWIDTH?curIndex+1:curIndex-1;
if(curIndex >= nextIndex){
curIndex = curIndex +nextIndex;
nextIndex = curIndex -nextIndex;
curIndex = curIndex -nextIndex;
}
UIButton *curBtn =
_btnsArray[curIndex];
UIButton *nextBtn =
_btnsArray[nextIndex];
[curBtn setTitleColor:[UIColor
colorWithRed:0.8
green:0.8*ratio blue:0.8*ratio
alpha:1.0] forState:UIControlStateNormal];
[nextBtn setTitleColor:[UIColor
colorWithRed:0.8
green:0.8*(1-ratio) blue:0.8*(1-ratio)
alpha:1.0] forState:UIControlStateNormal];
curBtn.transform =
CGAffineTransformMakeScale(1+0.2-ratio*0.2, 1+0.2-ratio *0.2);
nextBtn.transform =
CGAffineTransformMakeScale(1+ratio*0.2, 1+ratio*0.2);
}else{
//翻页结束时获取当前页所对应的按钮
UIButton *btn =
_btnsArray[curIndex];
//获取按钮中心点坐标
//CGRectGetMaxX(btn.frame)-SWIDTH/2顶部scroll要偏移的大小
//_topScrollView.contentSize.width - SWIDTH
顶部scrollview在x轴上偏移的最大值
if ((CGRectGetMidX(btn.frame)-SWIDTH/2)>(_topScrollView.contentSize.width
- SWIDTH) ) {
[_topScrollView
setContentOffset:CGPointMake(_topScrollView.contentSize.width
- SWIDTH, 0)
animated:YES];
}else
if(CGRectGetMidX(btn.frame)>SWIDTH/2){
[_topScrollView
setContentOffset:CGPointMake(CGRectGetMidX(btn.frame)
-SWIDTH/2, 0)
animated:YES];
}else{
[_topScrollView
setContentOffset:CGPointMake(0, 0)
animated:YES];
}
}
//获取产生动画的button
}
//停止减速
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
}
//停止拖拽
//decelerate为NO是scrollView为静止
不会触发scrollViewDidEndDecelerate
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
}
//-(void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{
// //即将拖拽结束
//}
#pragma mark - 点击事件
-(void)changePage:(UIButton*)button{
//获取当前页的索引
NSInteger index =
_tb.contentOffset.y/SWIDTH;
UIButton *curBtn =
_btnsArray[index];
[curBtn setTitleColor:[UIColor
colorWithRed:0.8
green:0.8 blue:0.8
alpha:1.0] forState:UIControlStateNormal];
[button setTitleColor:[UIColor
colorWithRed:0.8
green:0 blue:0
alpha:1.0] forState:UIControlStateNormal];
//让tableView滚动到这个页面
//btn在数组中的索引
[_tb
setContentOffset:CGPointMake(0,SWIDTH*(button.tag
- 1000)) animated:NO];
//_tb.contentOffset = CGPointMake(SWIDTH*(button.tag - 1000), 0);
}
- (void)didReceiveMemoryWarning {
[super
didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
#import "SubViewController.h"
@interface
ViewController ()<UITableViewDataSource,UITableViewDelegate>
{
//存放视图控制器数据源
NSMutableArray *_vcArray;
//存放按钮的数组
NSMutableArray * _btnsArray;
UITableView *_tb;
//头部滚动视图
UIScrollView *_topScrollView;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super
viewDidLoad];
[self
setupTopScroll];
[self
setupVCArray];
[self
setupTableView];
}
#define SWIDTH [UIScreen mainScreen].bounds.size.width
#define SHEIGHT [UIScreen mainScreen].bounds.size.height
-(void)setupTopScroll{
//不让他自动调整scroll
_btnsArray = [NSMutableArray
array];
self.automaticallyAdjustsScrollViewInsets =
NO;
_topScrollView = [[UIScrollView
alloc]initWithFrame:CGRectMake(0, 64,
SWIDTH, 30)];
//[self.view addSubview:_topScrollView];
self.navigationItem.titleView =
_topScrollView;
NSArray *titles = @[@"科技",@"博客",@"动态",@"新闻",
@"王大",@"王二",@"王三",@"王四",
@"王五",@"王六",@"王七",@"王八"
];
for(int i = 0;i < 12;i++){
UIButton *button = [UIButton
buttonWithType:UIButtonTypeCustom];
button.frame =
CGRectMake(i*SWIDTH/4, 0,
SWIDTH/4, 30);
[button setTitle:titles[i]
forState:UIControlStateNormal];
if (i == 0) {
[button setTitleColor:[UIColor
colorWithRed:0.8
green:0 blue:0
alpha:1.0] forState:UIControlStateNormal];
}
else{
[button setTitleColor:[UIColor
colorWithRed:0.8
green:0.8 blue:0.8
alpha:1.0] forState:UIControlStateNormal];}
button.tag = 1000+i;
[button addTarget:self
action:@selector(changePage:)
forControlEvents:UIControlEventTouchUpInside];
button.titleLabel.font = [UIFont
systemFontOfSize:14];
[_topScrollView
addSubview:button];
[_btnsArray
addObject:button];
}
_topScrollView.contentSize =
CGSizeMake(SWIDTH*3, 0);
}
//初始化数据源
数据源存放视图控制器
-(void)setupVCArray{
_vcArray = [[NSMutableArray
alloc]init];;
for (NSInteger i = 0; i < 12; i++) {
//此时subVC的view还没有被创建出来,也即是subVC中的viewDidLoad方法不会被执行
如何使用到view viewDidLoad会被立刻执行
SubViewController *subVC = [[SubViewController
alloc]init];
subVC.index = i;
[_vcArray
addObject:subVC];
}
}
//初始化tableView
-(void)setupTableView{
_tb= [[UITableView
alloc]init];
//逆时针旋转90度
让tableView变成横向滚动
_tb.transform =
CGAffineTransformMakeRotation(-M_PI_2);
//旋转过后再去设置frame
_tb.frame =
CGRectMake(0, 94,
SWIDTH, SHEIGHT-94);
//关闭回弹
_tb.bounces =
NO;
_tb.pagingEnabled =
YES;
//去除分割线
_tb.separatorStyle =
UITableViewCellSeparatorStyleNone;
//设置行高
_tb.rowHeight =
SWIDTH;
//去除tableView的滚动条
_tb.showsVerticalScrollIndicator =
NO;
_tb.delegate =
self;
_tb.dataSource =
self;
[self.view
addSubview:_tb];
[_tb
registerClass:[UITableViewCell
class] forCellReuseIdentifier:@"Cell"];
}
#pragma mark - tableViewDelegate
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return
_vcArray.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath
*)indexPath{
UITableViewCell *cell = [tableView
dequeueReusableCellWithIdentifier:@"Cell"
forIndexPath:indexPath];
//去除cell的选中样式
cell.selectionStyle =
UITableViewCellSelectionStyleNone;
cell.transform =
CGAffineTransformMakeRotation(M_PI_2);
UILabel *label = [[UILabel
alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
label.text =
@"zhehisdadasd";
[cell.contentView
addSubview:label];
//布局cell
UIViewController *vc =
_vcArray[indexPath.row];
vc.view.frame = cell.contentView.bounds;
//先移除子视图,否则可能出现一个cell上出现了多个视图控制器的view
[cell.contentView.subviews
makeObjectsPerformSelector:@selector(removeFromSuperview)];
[cell.contentView
addSubview:vc.view];
return cell;
}
//滚动中实时被调用
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
//tableView 偏移量
横向过来了
CGFloat offSetY = scrollView.contentOffset.y;
//每一页偏移量 SWIDTH
//相对位移CGFloat width = (NSInteger )offSetX%(NSInteger)SWIDTH;
CGFloat ratio = (NSInteger )offSetY%(NSInteger)SWIDTH/SWIDTH;
NSLog(@"%f",ratio);
//当前的页数
NSInteger curIndex = (offSetY+SWIDTH/2)/SWIDTH;
NSLog(@"%ld",curIndex);
//下一页
//NSInteger nextIndex = ratio<0.5?curIndex+1:curIndex-1;
if (offSetY !=
SWIDTH*curIndex) {
NSInteger nextIndex= offSetY>curIndex*SWIDTH?curIndex+1:curIndex-1;
if(curIndex >= nextIndex){
curIndex = curIndex +nextIndex;
nextIndex = curIndex -nextIndex;
curIndex = curIndex -nextIndex;
}
UIButton *curBtn =
_btnsArray[curIndex];
UIButton *nextBtn =
_btnsArray[nextIndex];
[curBtn setTitleColor:[UIColor
colorWithRed:0.8
green:0.8*ratio blue:0.8*ratio
alpha:1.0] forState:UIControlStateNormal];
[nextBtn setTitleColor:[UIColor
colorWithRed:0.8
green:0.8*(1-ratio) blue:0.8*(1-ratio)
alpha:1.0] forState:UIControlStateNormal];
curBtn.transform =
CGAffineTransformMakeScale(1+0.2-ratio*0.2, 1+0.2-ratio *0.2);
nextBtn.transform =
CGAffineTransformMakeScale(1+ratio*0.2, 1+ratio*0.2);
}else{
//翻页结束时获取当前页所对应的按钮
UIButton *btn =
_btnsArray[curIndex];
//获取按钮中心点坐标
//CGRectGetMaxX(btn.frame)-SWIDTH/2顶部scroll要偏移的大小
//_topScrollView.contentSize.width - SWIDTH
顶部scrollview在x轴上偏移的最大值
if ((CGRectGetMidX(btn.frame)-SWIDTH/2)>(_topScrollView.contentSize.width
- SWIDTH) ) {
[_topScrollView
setContentOffset:CGPointMake(_topScrollView.contentSize.width
- SWIDTH, 0)
animated:YES];
}else
if(CGRectGetMidX(btn.frame)>SWIDTH/2){
[_topScrollView
setContentOffset:CGPointMake(CGRectGetMidX(btn.frame)
-SWIDTH/2, 0)
animated:YES];
}else{
[_topScrollView
setContentOffset:CGPointMake(0, 0)
animated:YES];
}
}
//获取产生动画的button
}
//停止减速
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
}
//停止拖拽
//decelerate为NO是scrollView为静止
不会触发scrollViewDidEndDecelerate
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
}
//-(void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{
// //即将拖拽结束
//}
#pragma mark - 点击事件
-(void)changePage:(UIButton*)button{
//获取当前页的索引
NSInteger index =
_tb.contentOffset.y/SWIDTH;
UIButton *curBtn =
_btnsArray[index];
[curBtn setTitleColor:[UIColor
colorWithRed:0.8
green:0.8 blue:0.8
alpha:1.0] forState:UIControlStateNormal];
[button setTitleColor:[UIColor
colorWithRed:0.8
green:0 blue:0
alpha:1.0] forState:UIControlStateNormal];
//让tableView滚动到这个页面
//btn在数组中的索引
[_tb
setContentOffset:CGPointMake(0,SWIDTH*(button.tag
- 1000)) animated:NO];
//_tb.contentOffset = CGPointMake(SWIDTH*(button.tag - 1000), 0);
}
- (void)didReceiveMemoryWarning {
[super
didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
相关文章推荐
- iOS-地图真实坐标表示形式之间转换(double型,int型 互转)
- Ios 性能分析工具 及其使用侧重点
- 不让苹果开发者账号折磨我
- iOS自带MD5加密
- iOS 视频图像处理中的参照坐标系
- 更新 iOS 环境下 集成FFmpeg3.0
- IOS开发之显示微博表情
- iOS应用内付费(IAP)开发步骤列表
- iOS学习之——FMDB
- iOS学习之——简单的Git使用
- iOS-支持ipv6-only后,开发者应该做些什么??
- iOS应用内支付(IAP)的那些坑
- iOS 宏HUGE_VALL,HUGE_VAL,HUGE_VALF的含义
- iOS 应用支持 IPv6,就那点事儿
- iOS开发----懒加载
- iOS学习之——开发中常见的英文词汇(持续更新,英文不好的同学可以参考下)
- iOS方法警告
- 博客资源
- iOS 应用支持 IPv6,就那点事儿
- iOS学习之——地图、定位