使用tableview实现这种功能
需要有以下三个属性,省略很多代码,这里介绍核心代码。
//用于存放每一个好友
@property (nonatomic,strong)NSMutableArray * dataSource;
//用于记住组的展开和闭合状态
@property(nonatomic,strong)NSMutableArray * groupState;
@property (nonatomic,strong)UITableView * tableView;
初始化小组都是关闭
/*懒加载 用于记住组的展开和闭合状态(初始化为关闭状态)*/
- (NSMutableArray *)groupState
{
if (!_groupState) {
_groupState = [NSMutableArraynew];
for (int i =0; i <self.dataSource.count; i++) {
// [_groupState addObject:[NSNumber numberWithBool:NO]];
//简写为
[_groupStateaddObject:@NO];
}
}
return_groupState;
}
/*制作假数据 datasource里面存放了几个数组,每个数组代表每个好友小组*/
- (NSMutableArray *)dataSource {
if (!_dataSource) {
_dataSource = [NSMutableArraynew];
NSArray * pfp = [[NSBundlemainBundle] pathsForResourcesOfType:@"plist"inDirectory:nil];
for (NSString * ppin pfp) {
if ([pphasSuffix:@"Info.plist"]) {
continue;
}
NSMutableArray * array = [NSMutableArrayarrayWithContentsOfFile:pp];
[_dataSourceaddObject:array];
}
}
return_dataSource;
}
#pragma - mark DataSource
/*返回有多少个好友分组*/
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
returnself.dataSource.count;
}
/*返回每个组有多少好友*/
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
//当小组状态为关闭时,返回0个好友(即小组为关闭状态)
if ([self.groupState[section]boolValue] == NO) {
return0;
}
return [self.dataSource[section]count];
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
UIView * view = [[UIViewalloc] initWithFrame:CGRectMake(0,0, 1,1)];
view.backgroundColor = [UIColororangeColor];
//实现折叠效果
//1.在每一组的头上添加一个按钮,好友的展开关闭按钮
UIButton * btn = [UIButtonbuttonWithType:UIButtonTypeSystem];
btn.frame =CGRectMake(0,0, 50,50);
[btn setTitle:@"➡️"forState:UIControlStateNormal];
[btn addTarget:selfaction:@selector(btnClicked:)forControlEvents:UIControlEventTouchUpInside];
btn.tag = section +100;
[view addSubview:btn];
//2.根据组的折叠状态,设置btn的指示方向
if ([self.groupState[section]boolValue] == YES) {
btn.transform =CGAffineTransformMakeRotation(M_PI/2.0);
}
return view;
}
/*小组展开关闭按钮点击事件*/
- (void)btnClicked:(UIButton *)btn
{
//取到按钮所在的section的序号
NSInteger sectionIndex = btn.tag -100;
//修改groupState标记数组里面对应序号的Bool变量
// 1.取出变量原来的值
BOOL oldBool = [self.groupState[sectionIndex]boolValue];
// 2. 将原来的值取反
NSNumber * newValue =
[NSNumbernumberWithBool:!oldBool];
// 3. 将取反的值替换数组中对应序号的对象
[self.groupStatereplaceObjectAtIndex:sectionIndexwithObject:newValue];
//4.需要重新加载TableView
// 通过调用UITableView的 reloadData方法,
// [self.tableView reloadData];
//刷新指定的组,并且可以加上动画效果
[self.tableViewreloadSections:[NSIndexSetindexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
}
大致就是这样的思路,省略了一些代码,只是一个简单的demo。