ClassifyMenuDemo
多級(jí)分類(lèi)菜單 多集列表展開(kāi)合并 仿口碑分類(lèi)效果
ClassifyMenuDemo 簡(jiǎn)單使用 無(wú)入侵 對(duì)原項(xiàng)目無(wú)污染
分類(lèi)菜單 篩選菜單 口碑分類(lèi)篩選菜單 電商通用篩選菜單 多級(jí)列表
效果演示 源碼公開(kāi) 可以隨意修改成你喜歡的樣子

分類(lèi)菜單演示.gif
使用方法:
- (void)clickTitleBtn:(UIButton *)sender {
if (self.isShowMenu == NO) {
WEAKSELF
self.rootNode = [self doConfigNodes]; // 整理數(shù)據(jù)
self.menu = [[ClassifyMenu alloc] initWithFrame:CGRectZero rootNode:self.rootNode chooseResult:^(CMNode *node) {
weakSelf.isShowMenu = NO;
NSString *result = @"";
if (node.depth == 0) {
// 一級(jí)終結(jié)
result = [NSString stringWithFormat:@"%@", node.name];
}else if (node.depth == 1) {
// 二級(jí)終結(jié)
result = [NSString stringWithFormat:@"%@-%@", node.parentNode.name, node.name];
}else if (node.depth == 2) {
// 三級(jí)終結(jié)
result = [NSString stringWithFormat:@"%@-%@-%@", node.parentNode.parentNode.name, node.parentNode.name, node.name];
}
NSLog(@"選擇的結(jié)果:%@", result);
self.resultLabel.text = result;
} closeMenuAction:^{
weakSelf.isShowMenu = NO;
}];
[self.menu show];
self.isShowMenu = YES;
}else {
self.isShowMenu = NO;
if (self.menu) {
[self.menu close];
}
}
}
數(shù)據(jù)整理成CMNode類(lèi)集合 按照層次整理 加入只做多級(jí)列表的話 只用左側(cè)的列表,可以做無(wú)數(shù)級(jí),也是按照如下所示的方法整理數(shù)據(jù)格式就行了
#pragma mark - 數(shù)據(jù)格式源整理
- (CMNode *)doConfigNodes {
NSDictionary *item1 = @{@"name":@"一級(jí)分類(lèi)1", @"arr":@[@{@"name":@"二級(jí)分類(lèi)1", @"arr":@[@{@"name":@"三級(jí)分類(lèi)11"}, @{@"name":@"三級(jí)分類(lèi)22"}, @{@"name":@"三級(jí)分類(lèi)33"}, @{@"name":@"三級(jí)分類(lèi)44"}, @{@"name":@"三級(jí)分類(lèi)55"}]},
@{@"name":@"二級(jí)分類(lèi)2", @"arr":@[@{@"name":@"游泳館1"}, @{@"name":@"游泳館2"}, @{@"name":@"游泳館3"}, @{@"name":@"游泳館4"}, @{@"name":@"游泳館5"}]},
@{@"name":@"二級(jí)分類(lèi)3", @"arr":@[@{@"name":@"舞蹈1"}, @{@"name":@"舞蹈2"}, @{@"name":@"舞蹈3"}, @{@"name":@"舞蹈4"}, @{@"name":@"舞蹈5"}]},
@{@"name":@"親子", @"arr":@[@{@"name":@"少兒才藝"}, @{@"name":@"少兒打架"}, @{@"name":@"科普"}]},
@{@"name":@"二級(jí)分類(lèi)5", @"arr":@[@{@"name":@"hello1"}, @{@"name":@"hello Kitty"}, @{@"name":@"藍(lán)胖子"}, @{@"name":@"小黑"}, @{@"name":@"大大pan"}]}]};
NSDictionary *item2 = @{@"name":@"熱門(mén)精選", @"arr":@[@{@"name":@"為你推薦", @"arr":@[@{@"name":@"快餐小吃1"}, @{@"name":@"快餐小吃2"}]}, @{@"name":@"超市", @"arr":@[@{@"name":@"超市1"}, @{@"name":@"超市2"}, @{@"name":@"超市3"}, @{@"name":@"超市4"}, @{@"name":@"超市5"}]}]};
NSDictionary *item3 = @{@"name":@"休閑娛樂(lè)", @"arr":@[@{@"name":@"彩妝造型1", @"arr":@[@{@"name":@"美發(fā)1"}, @{@"name":@"美發(fā)2"}, @{@"name":@"美發(fā)3"}, @{@"name":@"美發(fā)4"}, @{@"name":@"美發(fā)5"}]}, @{@"name":@"寵物", @"arr":@[@{@"name":@"狗狗1"}, @{@"name":@"狗狗2"}, @{@"name":@"狗狗3"}, @{@"name":@"狗狗4"}, @{@"name":@"狗狗5"}]}]};
NSDictionary *item4 = @{@"name":@"運(yùn)動(dòng)健身", @"arr":@[@{@"name":@"少林武術(shù)", @"arr":@[@{@"name":@"少林棍1"}, @{@"name":@"少林棍2"}, @{@"name":@"少林棍3"}, @{@"name":@"少林棍4"}, @{@"name":@"少林棍5"}]}, @{@"name":@"峨眉派", @"arr":@[@{@"name":@"白骨爪1"}, @{@"name":@"白骨爪2"}, @{@"name":@"白骨爪3"}, @{@"name":@"白骨爪4"}, @{@"name":@"白骨爪5"}]}]};
NSDictionary *item5 = @{@"name":@"電影", @"arr":@[@{@"name":@"萬(wàn)達(dá)院1", @"arr":@[@{@"name":@"王思聰1"}, @{@"name":@"王思聰2"}, @{@"name":@"王思聰3"}, @{@"name":@"王思聰4"}, @{@"name":@"王思聰5"}]}, @{@"name":@"萬(wàn)達(dá)院2", @"arr":@[@{@"name":@"IceBear1"}, @{@"name":@"IceBear2"}]}]};
NSArray *temps = @[item1, item2, item3, item4, item5];
// 找到已選擇的
NSArray *temp = [self.resultLabel.text componentsSeparatedByString:@"-"];
NSString *nodeName1 = @"";
NSString *nodeName2 = @"";
NSString *nodeName3 = @"";
if (temp.count == 1) {
nodeName1 = temp[0];
}else if (temp.count == 2) {
nodeName1 = temp[0];
nodeName2 = temp[1];
}else if (temp.count == 3) {
nodeName1 = temp[0];
nodeName2 = temp[1];
nodeName3 = temp[2];
}
CMNode *rootNode = [[CMNode alloc] initWithParent:nil expand:NO];
// 這里可根據(jù)實(shí)際情況進(jìn)行多層級(jí)的列表嵌套,只需要把子節(jié)點(diǎn)添加到父節(jié)點(diǎn)下就可以了。
// 后面會(huì)根據(jù)實(shí)際的數(shù)據(jù)進(jìn)行UI的設(shè)置
for (int i = 0; i < temps.count; i++) {
// 一級(jí)的列表
CMNode *node = [CMNode initWithParent:rootNode expand:YES];
node.name = temps[i][@"name"];
if ((ISEMPTY(self.resultLabel.text) || [nodeName1 isEqualToString:@"全部類(lèi)目"]) && i==0) {
node.isChoosed = YES;
node.expand = YES;
}else {
if ([nodeName1 isEqualToString:node.name]) {
node.isChoosed = YES;
node.expand = YES;
}else {
node.isChoosed = NO;
node.expand = NO;
}
}
[rootNode.subNodes addObject:node];
NSArray *twoLevelObjs = temps[i][@"arr"];
for (int j = 0; j < twoLevelObjs.count; j++) {
// 二級(jí)列表
CMNode *subnode = [CMNode initWithParent:node expand:NO];
subnode.name = twoLevelObjs[j][@"name"];
if ((ISEMPTY(self.resultLabel.text) || [nodeName1 isEqualToString:@"全部類(lèi)目"]) && ISEMPTY(nodeName2) && i==0 && j==0) {
subnode.isChoosed = YES;
}else {
if ([nodeName1 isEqualToString:node.name] && [nodeName2 isEqualToString:subnode.name]) {
subnode.isChoosed = YES;
}else {
subnode.isChoosed = NO;
}
}
[node.subNodes addObject:subnode];
NSArray *threeLevelObjs = twoLevelObjs[j][@"arr"];
for (int k = 0; k < threeLevelObjs.count; k++) {
// 三級(jí)的列表 (整理后放右側(cè)陳列)
CMNode *threeNode = [CMNode initWithParent:subnode expand:NO];
threeNode.name = threeLevelObjs[k][@"name"];
if ((ISEMPTY(self.resultLabel.text) || [nodeName1 isEqualToString:@"全部類(lèi)目"]) && i==0 && j==0 && k==0) {
threeNode.isChoosed = YES;
}else {
if ([nodeName1 isEqualToString:node.name] && [nodeName2 isEqualToString:subnode.name] && [nodeName3 isEqualToString:threeNode.name]) {
threeNode.isChoosed = YES;
}else {
threeNode.isChoosed = NO;
}
}
[subnode.threeNodes addObject:threeNode];
}
}
}
return rootNode;
}