可以从上面代码看到, 创建了一个tableView. 并根据数组个数给分区数量赋值, 然后在tableView: viewForHeaderInSection:方法里, 用一个自定的view给分区头视图赋值. 在tableView: cellForRowAtIndexPath:方法里给每个分区对应的cell进行了赋值. 先看一下效果.

从上图可以看到现在每个分区中对应有不同数量的row,但是还没有实现我们想要的效果.所以再往下继续看.
SectionView.m
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.delegate touchAction:self];
}
/*
[self.delegate touchAction:self];
协议方法会刷新tableview,然后会刷新tableview的 viewForHeaderInSection:方法
就会重新布局SectionView所以会走layoutSubviews方法
*/
-(void)layoutSubviews
{
[super layoutSubviews];
// 改变imageView的transform属性 点击时有开闭的效果
[UIView animateWithDuration:0.3 animations:^{
_imageView.transform = _group.opened ? CGAffineTransformMakeRotation(M_PI_2) : CGAffineTransformMakeRotation(0);
}];
}
点击SectionView时 就让代理人去执行协议方法,但是在VC的协议方法中什么都没写, 所以需要完善一下
- (void)touchAction:(SectionView *)sectionView {
// 通过前面设置的tag值找到分区的index
NSInteger index = sectionView.tag - 1000;
FriendGroup *group = [self.allArray objectAtIndex:index];
// 每次点击, 状态变为与原来相反的值
group.opened = !group.isOpened;
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:index] withRowAnimation:UITableViewRowAnimationNone];
}
我们平时用的QQ下拉列表, 未打开时不显示好友, 打开后才展示好友列表. 所以应该在numberOfRowsInSection方法中要进行设置.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
FriendGroup *group = [self.allArray objectAtIndex:section];
// 如果未打开 count为0 如果打开 count为group的属性数组对应的个数
NSInteger count = group.isOpened ? group.friends.count : 0;
return count;
}
效果如下图

总结
以上就是IOS实现简易版的QQ下拉列表的全部内容,效果虽然很简单,但还会希望对大家开发IOS有所帮助。
注:相关教程知识阅读请移步到IOS开发频道。










