需求分析:

  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. 2014蓝桥杯问题 C: 神奇算式

    没做完,先搞答题了 #include <stdio.h> #include<string.h> #include<stdlib.h> int comp(const ...

  2. JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解

    Jmap是一个可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本.打印出某个java进程(使用pid)内存内的,所有'对象'的情况(如:产生那些对象,及其数量). 使用方法 ...

  3. Word 2016插入公式快捷键

    实用的插入公式快捷键"Alt+=", 与君共享

  4. js 增加 onclick 事件

    obj.onclick = function(){check(this)} function check(obj){ alert(obj)l }

  5. Front-End(五)——工具使用

    mac端推荐使用sublime+emmet. 环境搭建 sublime 官网下载sublime text 02或者03,03现在(2016.07)还是测试版,我使用的是text02. emmet su ...

  6. 【Time系列四】查询各月份的日历

    荒废了两个星期没学java了,今天一心想突破"日历查询"这个小程序.先用比较简单的python实现下. 无奈天资愚钝,想了一个上午.最后卡在了日期排列的问题上,只好去参考下别人的代 ...

  7. python3数据结构

    列表 list.append(x) 把一个元素添加到列表的结尾,相当于a[len(a):]=[x] list.extend(L) 将一个给定列表中的所有元素都添加到另一个列表中,相当于a[(len): ...

  8. Python学习笔记——基础篇【第六周】——PyYAML & configparser模块

    PyYAML模块 Python也可以很容易的处理ymal文档格式,只不过需要安装一个模块,参考文档:http://pyyaml.org/wiki/PyYAMLDocumentation 常用模块之Co ...

  9. spring+springmvc+maven+mybatis整合

    jar包依赖:网址search.maven.org 1.spring :spring-core            2. myhabits:myhabits 3.整合spring和myhabits: ...

  10. [Q]系统环境改变导致“未注册”的解决方法

    据用户反映设置账户开机密码后显示未注册, 具体表现: 1. 重装试用版,重新获取注册申请码,发现注册申请码跟原来没有发生变化. 2. 重新使用原来的授权文件注册,但打开后显示未注册. 3. 发现“** ...