IOS-筛选功能之封装重构

来源:互联网 发布:皇朝万鑫软件 编辑:程序博客网 时间:2024/06/05 14:28

最近项目中用到筛选功能 具体效果图如下


做这个之前 我先考虑到的是 每个Item 之间的算法和自定义的每个Item样式的UI,其次我们要考虑产品的业务逻辑以及点击展开后的Height和Top

自定义的View 也就是Item 就不多说了,很简单.

1.我们整个白色的View 背景要满足点击展开后的效果,也就是我们要随着每个展开的高度做适应,首先我选择用的是滚动视图

2.筛选功能一般是一个按钮点击触发的,动画特效在这也不多说,因为点击筛选后 下拉出来的界面每个第一个选项默认选中,所以我们要点击的时候就要知道对应的值

3.关于请求数据:我这里选择胖model的结构方式, 把使用到的结构体都丢到整体model  例子:   

                weakSelf.filterCondition = [[MYFilterConditionModelalloc] initWithJson:dict];

这样就比较方便了一行就可以满足我们接受所有服务器返回的结构体或者数组字典等等
4.创建每一个View 拿品牌来说,整个品牌(Title) + 下面排序的Item + 展开按钮 都是一个整体View  每次都要去创建一个对象View 丢到数组中 在从中抽取
5.改变 每个视图之间的Height 和Top   and  scrollview 的 contentSize   
 改变height 和top 的核心代码如下:

- (void)updateLayout

{

    CGFloat top = 0;

    for (MYSearchFilterConditionView *filterin self.searchArray) {

        filter.top = top;

        filter.height = [filtergetHeight];

        top += [filtergetHeight];

    }

    self.contentView.contentSize =CGSizeMake(self.contentView.width, top+18);

}

6,我们点击展开的时候触发的也是上面所写代码,因为一个方法就足以满足我们的需求

7.因为我这里的需求是 分品牌,价格 属性 所以我采用枚举如下

typedef enum {

    MYSearch_Brand  =0,    //品牌

    MYSearch_Price  =1,    //价格区间()

    MYSearch_property         =2,    //类别属性

}MYSearchType;

一个类别可能有多个属性,增加了功能的难度.


8.接下来来说一下 九宫格算法,其实也不难,我们知道,每个Item 的的控件都要适应他其中的Title,适应宽度,并且我们要确定如果一个Item 超过了一个屏幕的宽度我们就要对其截取,或者折行. 算法如下: Item.width > self.width 如果我们的item 大于屏幕自身的宽度 我们就要进行处理


   leftPosition  = 16;

            item.left = leftPosition;

            colIndex =1;

            rowIndex++;

            if (rowIndex >= 1) {

                topPosition += verticalGap +28;

            }

            item.top =self.searchLaebl.bottom + topPosition;

            leftPosition +=item.width + horizationGap;

            if (self.isOpen ==NO) {

                if (rowIndex >= 2) {

                    //此处对应 展开功能 

                   break;

                }else{

                   self.openView.hidden =YES;

                }

            }

        }else{

            

            colIndex++;

            item.left = leftPosition;

            leftPosition += item.width;

            if (colIndex >= 1) {

                leftPosition +=horizationGap;

            }

            item.top =self.searchLaebl.bottom + topPosition;

        }

        

        itemTag++;

        

        [item searchFilterItemAddTarget:selfaction:@selector(infoConditionClicked:)forControlEvents:UIControlEventTouchUpInside];

        [self.searchItemArrayaddObject:item];

        [selfaddSubview:item];


if (self.isOpen) {

        //此处是点击展开后的回收

    }


9.我们如何保存 我们点击后的状态值呢? 这里我使用下标,因为我把所有的数据都存在一个数组中 里面对应的很多结构体,我们可以使用这种方式判断isKindOfClass这样就很轻松的拿到我们要的 Item其中的数据,和对应的下标,然后我们再把所有选择的 item 的ID 点击确定的时候一起传递过去就可以了.


有不太懂的的就给我留言吧,我有时间就会回复哒.谢谢帮助我的人们 感谢你们!~~~~~

1 0