美文网首页程序员
iOS开发类似美团的分页菜单支持动态数据

iOS开发类似美团的分页菜单支持动态数据

作者: MissSaturday | 来源:发表于2018-05-30 17:43 被阅读121次

最近在做一款外卖类的app 首页菜单栏要求做成动态分页的

要求可以分页左右滑动以及动态按钮及跳转

思考:

1.首先首页按钮个数固定了8个(或者n个),如果后台给的按钮个数不足8个(n个),那么不需要滚动,直接创建按钮

2.如果后台给的按钮个数超过8个(n个),这时候需要做滑动分页,按钮需要横向分页排列。

3.怎么确定页数,array.count/8?可能没这么简单

下面是设计图,比较lou

手绘轮播图

说下我的思路(不保证最优,只是目前的思路,如果有更好的方法,我定虚心请教)

首先我准备在底层放UIScrollView

然后根据数组确定scrollview的分页个数(这个可能有很多种方法)我的方法是

int page;  //分页个数

    if(caiCateArray.count%8==0) {

        page = (int)caiCateArray.count/8;

    }else{

        page = (int)caiCateArray.count/8+1;

    }

注:caiCateArray是全局接收按钮信息的数组,里面包含按钮的图片,id以及title

数字8可以是任意数,目前需求是每页8个按钮

如果数据按钮个数正好是8的倍数,那么就有 caiCateArray.count/8个页面

如果不是8的倍数,为什么页数是 caiCateArray.count/8+1个,举个例子5/8 = 0...5,这时候是有一页的,20/8 = 2...4,需要3页

有了分页的页数,接下来创建UIView放在scrollview上,大小等于scrollview

再在UIView上根据数组个数创建按钮

这里比较关键

首先caiCateArray是一个数组,比如里面有10个按钮信息

这时候首页8个可以直接取前8个信息,第二页取后两个,方法可行,但是失去了动态性

我的思路是把数组拆分,每个界面对应相应的数据

下面上代码

  NSArray *array = [self splitArray:caiCateArray withSubSize:8];

    intpage;  //分页个数

    if(caiCateArray.count%8==0) {

        page = (int)caiCateArray.count/8;

    }else{

        page = (int)caiCateArray.count/8+1;

    }

    CGFloatwidth = (DeviceWidth-15*5)/4;

    for(inti =0; i < page; i++) {

        UIView *view = [[UIView alloc]initWithFrame:CGRectMake(DeviceWidth *i, 0, DeviceWidth, 174)];

        view.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1];

        [self.btnScrollViewaddSubview:view];

        NSArray*caiArray = array[i];

        for(inta =0; a < caiArray.count; a++) {

            UIView*btnView = [[UIViewalloc]initWithFrame:CGRectMake(15+ a%4*(width+15),15+75*(a/4), width,60)];

            btnView.backgroundColor = [UIColor whiteColor];

            [viewaddSubview:btnView];

        }

    }

    self.btnScrollView.contentSize = CGSizeMake(DeviceWidth *page, 174);

- (NSArray*)splitArray: (NSArray*)array withSubSize : (int)subSize{

    //  数组将被拆分成指定长度数组的个数

    unsignedlongcount = array.count% subSize ==0? (array.count/ subSize) : (array.count/ subSize +1);

    //  用来保存指定长度数组的可变数组对象

    NSMutableArray *arr = [[NSMutableArray alloc] init];

    //利用总个数进行循环,将指定长度的元素加入数组

    for(inti =0; i < count; i ++) {

        //数组下标

        intindex = i * subSize;

        //保存拆分的固定长度的数组元素的可变数组

        NSMutableArray *arr1 = [[NSMutableArray alloc] init];

        //移除子数组的所有元素

        [arr1removeAllObjects];

        intj = index;

        //将数组下标乘以1、2、3,得到拆分时数组的最大下标值,但最大不能超过数组的总大小

        while(j < subSize*(i +1) && j < array.count) {

            [arr1addObject:[arrayobjectAtIndex:j]];

            j +=1;

        }

        //将子数组添加到保存子数组的数组中

        [arraddObject:[arr1copy]];

    }

    return[arrcopy];

}

实现效果

轮子

最后的效果

加载数据后

第一次发文章,不会编辑代码格式,跟xcode一样的那种。见谅

如果这篇文章帮到了一些人,我会很开心

谢谢

相关文章

网友评论

    本文标题:iOS开发类似美团的分页菜单支持动态数据

    本文链接:https://www.haomeiwen.com/subject/gpkxsftx.html