需求分析:

  1、类似网易新闻客户端页面滚动组件、菜单栏对应菜单项一直居中

  2、点击菜单栏可以切换到对应的page

  3、滑动页面可以自动切换相应的菜单、并且对应的菜单栏居中显示

  4、初始化时可以自定义菜单项

  5、菜单内容、页面内容自定义

设计实现:

  1、菜单和页面内容分别设计为两个横向滚动的UITableView,将两个横向滚动的tableView 放置在一个UIView中

  2、点击菜单栏时响应该事件,并将页面切换到响应页

  3、内容页面滚动停止时,将对应菜单项滚动到中间

实现效果:

  

四、关键代码

  1、横向的tableview 如何实现

  

- (UITableView *)topMenuTableView
{
if(nil == _topMenuTableView)
{
CGFloat topMenuHeight = TopTabControl_Default_TopMenuHeight;
if([self.datasource respondsToSelector:@selector(TopTabHeight:)])
{
topMenuHeight = [self.datasource TopTabHeight:self];
} //before rotate bounds = (0, 0, width, height) , rototate -90 bounds = (0, 0, height, width)
CGFloat x = CGRectGetWidth(self.frame)/ - topMenuHeight/;
CGFloat y = -CGRectGetWidth(self.frame)/ + topMenuHeight/;
CGRect topMenuRect = CGRectMake(x, y, topMenuHeight, CGRectGetWidth(self.frame));
_topMenuTableView = [[UITableView alloc] initWithFrame:topMenuRect
style:UITableViewStylePlain];
[self addSubview:_topMenuTableView];
_topMenuTableView.backgroundColor = [UIColor randomColor];
_topMenuTableView.dataSource = self;
_topMenuTableView.delegate = self;
_topMenuTableView.showsVerticalScrollIndicator = NO;
_topMenuTableView.transform = CGAffineTransformMakeRotation(-M_PI / ); }
return _topMenuTableView;
} - (UITableView *)contentTableView
{
if(nil == _contentTableView)
{
CGFloat contentHeight = CGRectGetWidth(self.frame);
CGFloat contentWidth = CGRectGetHeight(self.frame) - [self getMenuHeight];
CGFloat x = CGRectGetWidth(self.frame)/ - contentWidth/;
CGFloat y = (CGRectGetHeight(self.frame) - [self getMenuHeight])/ - contentHeight/ + ([self getMenuHeight]);
CGRect contentRect = CGRectMake(x, y, contentWidth, contentHeight);
_contentTableView = [[UITableView alloc] initWithFrame:contentRect
style:UITableViewStylePlain];
[self addSubview:_contentTableView]; _contentTableView.backgroundColor = [UIColor randomColor];
_contentTableView.dataSource = self;
_contentTableView.delegate = self;
_contentTableView.showsVerticalScrollIndicator = NO;
_contentTableView.pagingEnabled = YES;
_contentTableView.transform = CGAffineTransformMakeRotation(-M_PI / );
} return _contentTableView;
}

  2、协议接口

/** @brief TopTabControl datasource 需要支持的协议 */
@protocol TopTabControlDataSource<NSObject> @optional /**
* 得到顶部菜单栏的高度
*
* @param tabCtrl tab控件
*
* @return 高度(像素)
*/
- (CGFloat)TopTabHeight:(TopTabControl *)tabCtrl; /**
* 得到顶部菜单栏的宽度
*
* @param tabCtrl tab控件
*
* @return 高度(像素)
*/
- (CGFloat)TopTabWidth:(TopTabControl *)tabCtrl; /**
* 得到顶部菜单的个数
*
* @param tabCtrl tab控件
*
* @return 返回菜单的个数
*/
- (NSInteger)TopTabMenuCount:(TopTabControl *)tabCtrl; /**
* 得到第几个菜单的view
*
* @param tabCtrl tab控件
* @param index 菜单的index,从0开始
*
* @return 返回单个菜单项
*/
- (TopTabMenuItem *)TopTabControl:(TopTabControl *)tabCtrl
itemAtIndex:(NSUInteger)index; /**
* 得到第几个菜单对应的page内容
*
* @param tabCtrl tab控件
* @param index 菜单的index,从0开始
*
* @return 返回单个菜单页
*/
- (TopTabPage *)TopTabControl:(TopTabControl *)tabCtrl
pageAtIndex:(NSUInteger)index; @end

五、完整代码

 https://github.com/liqiushui/TopTabControl

IOS 类似网易新闻客户端内容滚动菜单跟随居中组件的更多相关文章

  1. 类似网易新闻 title栏 滚动时 文字放大&变色

    http://files.cnblogs.com/files/n1ckyxu/ScrollTitleView.zip

  2. 类似掌盟的Tab页 Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签 (转)

    原博客地址  :http://blog.csdn.net/xiaanming/article/details/10766053 本文转载,记录学习用,如有需要,请到原作者网站查看(上面这个网址) 之前 ...

  3. Android SlidingMenu 仿网易新闻客户端布局

    前面两篇文章中的SlidingMenu都出现在左侧,今天来模仿一下网易新闻客户端左右两边都有SlidingMenu的效果,以下是网易新闻客户端效果: 不扯闲话了,直接进入正题吧 frame_conte ...

  4. ActionBar+DrawerLayout实现网易新闻客户端首页

    一.概述 随着android版本的不断的更新,google推出了越来越多的高级组件,采用这些官方组件我们可以方便的实现一些以前需要通过复杂编码或者使用第三方组件才能实现的效果,比如slidingmen ...

  5. Android Studio精彩案例(四)《DrawerLayout使用详解仿网易新闻客户端侧边栏 》

    转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 为了提高兴趣,咱们开头先看看最终要实现什么样的效果: 侧拉菜单在Android应用中非常常见,它的实现方式太多了,今天我们就说说使用G ...

  6. Android组件——使用DrawerLayout仿网易新闻v4.4侧滑菜单

    摘要: 转载请注明出处:http://blog.csdn.net/allen315410/article/details/42914501 概述        今天这篇博客将记录一些关于DrawerL ...

  7. Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签

    转载请注明出处:http://blog.csdn.net/xiaanming/article/details/10766053 之前用JakeWharton的开源框架ActionBarSherlock ...

  8. 分享一个仿网易新闻客户端iPhone版的标签式导航ViewController

    该Controller是一个容器,用于容纳其他的controller.效果与网易新闻客户端的标签式导航基本一样: (1)点击上面的标签,可以切换到对应的controller,标签下面的红色提示条的长度 ...

  9. iOS仿网易新闻栏目拖动重排添加删除效果

    仿网易新闻栏目选择页面的基本效果,今天抽了点时间教大家如何实现UICollectionView拖动的效果! 其实实现起来并不复杂,这里只是基本的功能,没有实现细节上的修改,连UI都是丑丑的样子,随手画 ...

随机推荐

  1. FZU 2086 餐厅点餐(模拟)

    Problem 2086 餐厅点餐 Problem Description Jack最近喜欢到学校餐厅吃饭,好吃干净还便宜. 在学校餐厅,有a种汤,b种饭,c种面条,d种荤菜,e种素菜. 为了保证膳食 ...

  2. IOS开发自定义tableviewcell的注意点😄

    自定义tableviewcell 1.xib,nib拖控件:awakefromnib: 设置2,不拖控件:- (instancetype)initWithStyle:(UITableViewCellS ...

  3. js中setTimeout()的使用

    setTimeout()在js类中的使用方法   setTimeout (表达式,延时时间)setTimeout(表达式,交互时间)延时时间/交互时间是以豪秒为单位的(1000ms=1s) setTi ...

  4. php相关书籍视频

    虽然如今web领域,PHP JSP .NET 并驾齐驱,但PHP用的最广,原因不用我多说. 首先发一个PHP手册,方便查询,这个肯定是学PHP必备的.  下载地址:http://u.115.com/f ...

  5. HDU 5868 Different Circle Permutation

    公式,矩阵快速幂,欧拉函数,乘法逆元. $an{s_n} = \frac{1}{n}\sum\limits_{d|n} {\left[ {phi(\frac{n}{d})×\left( {fib(d ...

  6. [河南省ACM省赛-第四届] 表达式求值(nyoj 305)

    栈的模拟应用: #include<iostream> #include<cstdio> #include<cstring> #include<string&g ...

  7. js关于setTimeout传参

    setTimeout函数有两个参数,都是必须的,一个是要执行的函数,一个是延时的时间 第一个参数: 要执行的函数,一般来说是可以执行的,但是这里遇到一个问题,就是如果变量是个数组的话, 如果数组为nu ...

  8. Struts2中的一个类型转换示例

    1.写一个属性文件,里面写好需要转换的类型数据,xwork-conversion.properties,解释: xwork-conversion.properties表示对所有action中的指定数据 ...

  9. SQL in优化将In转化为联合查询

    in查询有时候会非常影响性能,最好能转化为联合查询,但有的网友说sqlserver会自动将in转化为联合查询,但我实际遇到的有时候却不是这样.所以最好还是不要用in. 我自己的例子,用in的时候耗费了 ...

  10. bison实例

    逆波兰记号计算器[文件名rpcalc.y]%{ #define YYSTYPE double #include <stdio.h> #include <math.h> #inc ...