码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-04-09 18:59:30      阅读:552      评论:0      收藏:0      [点我收藏+]

标签:

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

例: 

技术分享

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

 

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

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;
}

 

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

 

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

标签:

原文地址:http://www.cnblogs.com/Tempation/p/5372040.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!