实现网易新闻界面分段滑动展示的设计

工作中经历的两个项目的界面设计都是类似于网易新闻的那种形式,本人也确实认为这种展示在特定情况下是一种非常直观的形式。

例:

所以在这里整体的分析一下实现思路。

首先对这种界面的逻辑进行分析:

1.界面上端有分段点击选择的视图,且可滑动。

2.由于上端的分段选择视图可点击范围较小,而且用户也习惯于用手势来滑动切转界面,所以展示界面是需要滑动的。

3.点击分段选择的Button和手势去滑动切转的界面要对应。

4.第一次切转到的界面需要创建,而之后再滑动到这个界面时,则不需要创建。也就是说:如果上端的分段选择控件上有7种分类的按钮,则分别点击则只需创建7次展示的界面,之后再切转到这个界面时如果需要刷新数据则只需上拉刷新即可。

5. 一般展示界面的风格设计都是一样的,可能要考虑到界面重复利用

大致就是这些。。。

下面开始进行界面的构建:

第一步是界面,因为下端是可以滑动的,所以展示界面肯定是放在一个scrollView上面的。所以先在viewcontroller里面创建一个UIScrollView属性, 然后对其进行初始化

- (UIScrollView*)scrollView
{
    if (!_scrollView) {
        self.scrollView = [[UIScrollView alloc] init];
        self.scrollView.showsVerticalScrollIndicator = NO;
        self.scrollView.showsHorizontalScrollIndicator = NO;
        self.scrollView.pagingEnabled = YES;
        self.scrollView.directionalLockEnabled = YES;
        self.scrollView.bounces = NO;
    }
    return _scrollView;
}
在viewDidLoad里调用创建scrollView的方法  //104 = 64导航栏高度+40分段选择视图的高度//kSelectButtonNum是分段选择视图的button个数- (void)layoutSctollView{    self.scrollView.frame = CGRectMake(0, 104, kScreenW, kScreenH - 104);
//设置scrollView的容量
    self.scrollView.contentSize = CGSizeMake(kScreenW * kSelectButtonNum, kScreenH - 104);

    self.scrollView.delegate = self;

    //将scrollView添加到view中
    [self.view addSubview:self.scrollView];
}

第二步是上面的可滑动的选择控件,本来想自己封装一个这样的控件,但网上查到一个基本能够实现这种需求的类别,所以就直接拿来用了,封装的也可以,用起来也简单。  XWCatergoryView  就是这个

按照要求进行一些设置

//catergoryView
    XWCatergoryView* catergoryView = [XWCatergoryView new];
    //必须设置titles数据源
    catergoryView.titles = @[ @"按钮1", @"按钮2", @"按钮3", @"按钮4", @"按钮5", @"按钮6", @"按钮7" ];
    //必须设置关联的scrollview
    catergoryView.scrollView = self.scrollView;

    //代理监听点击;
    catergoryView.delegate = self;
    //当前选中的item是否缩放
    catergoryView.scaleEnable = YES;
    //设置文字左右渐变
    catergoryView.titleColorChangeEable = YES;
    //item的间距
    catergoryView.itemSpacing = 30;
    //开启底部线条
    catergoryView.bottomLineEable = YES;
    catergoryView.titleFont = [UIFont systemFontOfSize:12];
    //设置底部线条距离item底部的距离
    catergoryView.bottomLineSpacingFromTitleBottom = 10;
    //禁用点击item滚动scrollView的动画
    catergoryView.scrollWithAnimaitonWhenClicked = NO;
    [catergoryView mas_makeConstraints:^(MASConstraintMaker* make) {
        make.left.right.equalTo(self.view);
        make.top.equalTo(self.view.mas_top).offset(64);
        make.height.equalTo(@50);
        make.bottom.equalTo(self.scrollView.mas_top);
    }];
    [self.view addSubview:catergoryView];
    self.catergoryView = catergoryView;

第三步是分别实现 XWCatergoryView和UIScrollView的代理方法

XWCatergoryView的代理方法:

/**
 *  监听item点击
 */
- (void)catergoryView:(XWCatergoryView*)catergoryView didSelectItemAtIndexPath:(NSIndexPath*)indexPath
{
    //将scrollView展示对应的界面
    [self.scrollView setContentOffset:CGPointMake(kScreenW * indexPath.row, 0) animated:NO];
    //处理界面逻辑
    [self scrollViewContrntOffSet:_scrollView];
}

UIScrollViewDelegate:

/**
 *  当scrollView已经结束减速时调用(滑动时调用)
 */
- (void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView
{
    [self scrollViewContrntOffSet:scrollView];
}

处理界面逻辑的方法

/**
 *  当scrollView偏移到不同的位置时添加不同的tableview
 *  无论点击button还是手势滑动都会调用这个方法
 */
- (void)scrollViewContrntOffSet:(UIScrollView*)scrollView
{
    NSInteger count = scrollView.contentOffset.x / kScreenW;

    //将scrollView停止滑动时, 判断其偏移量, 并将其存入数组, 之后每次与数组元素对比, 以确保每个偏移量上只创建一个tableview
    NSString* tempStr = [NSString stringWithFormat:@"%ld", (long)count];
    if (count) {
        if (![self.mutableArr containsObject:tempStr]) {
            [self.mutableArr addObject:tempStr];
            ListController* TableVC = [[ListController alloc] initWithStyle:UITableViewStylePlain];
            TableVC.indentState = count;
            TableVC.tableView.frame = CGRectMake(kScreenW * count, 0, kScreenW, kScreenH - 104);

            //将订单列表控制器受容器控制
            [self addChildViewController:TableVC];
            [self.scrollView addSubview:TableVC.tableView];

            [self.ListArr addObject:TableVC];
        }
    }
}

***这里有一个值得提醒的地方,就是当界面第一次加载时,底层的scrollView既没有滑动,分段选择控件也没有点击, 也就是说当界面加载完后scrollView的偏移量为0时是没有创建展示界面的(也就是ListController)

所以我的处理方法是在viewcontroller的viewDidLoad里直接创建一个ListController,并将其放在scrollView偏移量为0时的位置。这里也是为什么上面要判断count是否为零

第四步:创建ListController放在scrollView偏移量为0的位置

- (void)layoutListView
{
    ListController* TableVC = [[ListController alloc] initWithStyle:UITableViewStylePlain];
    //默认显示全部数据(状态是:全部)
    TableVC.indentState = 0;
    TableVC.tableView.frame = CGRectMake(0, 0, kScreenW, kScreenH - 104);
    [self.ListArr addObject:TableVC];
    //将订单列表控制器受容器控制
    [self addChildViewController:TableVC];

    [self.scrollView addSubview:TableVC.tableView];
}

所以最后viewDidLoad的方法里是这样调用的

- (void)viewDidLoad
{
    [super viewDidLoad];

    //布局scrollView
    [self layoutSctollView];

    //布局顶端选择列表
    [self layoutSelectView];

    //布局列表视图
    [self layoutListView];
}

上面用到得数组初始化

- (NSMutableArray *)ListArr
{
    if (!_ListArr) {
        self.ListArr = [NSMutableArray array];
    }
    return _ListArr;
}

- (NSMutableArray*)mutableArr
{
    if (!_mutableArr) {
        self.mutableArr = [NSMutableArray array];    //因为scrollView偏移量为0时,在界面viewDidLoad里面创建过了ListView,所以这个数组里面应该默认就有“0”    NSString* str = @"0";    [self.mutableArr addObject:str];    }    return _mutableArr; }

就这样了  上面所有分析的界面逻辑都已实现。。。

时间: 2024-10-12 20:59:40

实现网易新闻界面分段滑动展示的设计的相关文章

【FastDev4Android框架开发】HorizontalScrollView,Fragment,FragmentStatePagerAdapter打造网易新闻Tab及滑动页面效果(三十六)

转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/50145759 本文出自:[江清清的博客] (一).前言: 仿36Kr客户端开发过程中,因为他们网站上面的新闻文章分类比较多,所以我这边还是打算模仿网易新闻APP的主界面新闻标签Tab以及页面滑动效果来进行实现.要实现的顶部的Tab标签的效果有很多方法例如采用开源项目ViewPagerIndicator中的TabPageIndicator就可以实现,不过查看了源码发现

仿网易新闻界面

#import "AppDelegate.h" #import "ViewController.h" @interfaceAppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [

用jquery来实现类似“网易新闻”横向标题滑动的移动端页面

HTML: <div id="navbar"> <div id='navbar_content' style="left:0px;"> <div class="channel active"> <span>shouye</span> </div> <div class="channel"> <span>shouyeshouye<

iOS界面-仿网易新闻左侧抽屉式交互

1.介绍 用过网易新闻客户端的同学都会发现,网易新闻向左滑动时,左侧的导航栏会跟着拖动出来,新闻内容列表会拉到最右侧.像一个抽屉拉出来一样.很酷.除了网易新闻,现在好多应用都采用了这样的交互. 对手势识别不熟悉的请参考上篇: iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势) 这个交互效果主要用到两个手势,一个是pan拖拽,一个是tap点击.拖拽可以把抽屉拉出来,再推回去.点击可以把抽屉推回去. 效果如下:     那么这个效果如何实现呢? 2.实现思路和步骤 思路:从实现

Android应用经典主界面框架之二:仿网易新闻client、CSDN client (Fragment ViewPager)

另外一种主界面风格则是以网易新闻.凤凰新闻以及新推出的新浪博客(阅读版)为代表.使用ViewPager+Fragment,即ViewPager里适配器里放的不是一般的View.而是Fragment.所以适配器不能继承PagerAdapter,而要继承FragmentPagerAdapter,这是在android.support.v4.app.FragmentPagerAdapter包里的.有点奇葩的是,FragmentPagerAdapter仅仅在这个包里有,在android.app.*这个包以

Android应用经典主界面框架之二:仿网易新闻客户端、CSDN 客户端 (Fragment ViewPager)

第二种主界面风格则是以网易新闻.凤凰新闻以及新推出的新浪博客(阅读版)为代表,使用ViewPager+Fragment,即ViewPager里适配器里放的不是一般的View,而是Fragment.所以适配器不能继承PagerAdapter,而要继承FragmentPagerAdapter,这是在android.support.v4.app.FragmentPagerAdapter包里的.有点奇葩的是,FragmentPagerAdapter只在这个包里有,在android.app.*这个包下面么

iOS开发之AVPlayer的精彩使用---&gt;网易新闻视频播放界面的另类实现

遇到个需求需要涉及到视频播放,那么没办法,先找资料开始进一步了解下这个不熟悉的东西.一个是MP,一个 是AV,MP是封装好的,用起来非常简单,但是自定义样式就基本不可能了.AVPlayer存在于AVFundation中,更接近 于底层,所以灵活性更强大,废话不多说,咱们先简单写个Demo看下他的工作原理,然后模仿网易新闻写个界面出 来,这里用到了一个封装的框架,如果不熟悉内部原理的同学可以先看看我写的第一个Demo,基本所有逻辑都有. 这里容我啰嗦一句: 开发中,单纯的使用AVPlayer类是无

iOS界面-仿网易新闻左侧抽屉式交互 续(添加新闻内容页和评论页手势)

本文转载至  http://blog.csdn.net/totogo2010/article/details/8637430 1.介绍 有的博友看了上篇博文iOS界面-仿网易新闻左侧抽屉式交互 ,在微博里问,网易新闻里的内容和评论的拖拽如何实现, 上面的UINavigation如何嵌进去.可能不少人有这样的需求,现在花了些时间把这两个效果做一下, 和大家分享交流.思路和上篇基本差不多,但是没有用到UINavigation,其实在我看来上面的返回. 评论按钮都是可以通过addsubview添加的.

Android 仿网易新闻v3.5:上下滑动的引导页

版权声明:本文为博主原创文章,未经博主允许不得转载. 最近看了下网易新闻月初发布的3.5版,发现两个比较明显的改动: 1.引导页的修改,变为上下滑动. 2.增加了聚合阅读,里面的动画效果也是蛮有创意的.于是又禁不住模仿一下 这次先看这个上下滑动的引导页效果图: 这种效果具体怎么做呢? 首先直接上github,直接看有没有相关的开源项目,果不其然,被我找到了: https://github.com/JakeWharton/Android-DirectionalViewPager JakeWhart