IOS展开三级列表效果示例

效果图如下:

#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@end
#import "AppDelegate.h"
#import "RootViewController.h"
@interface AppDelegate ()

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
  // Override point for customization after application launch.
  self.window.backgroundColor = [UIColor whiteColor];

  RootViewController *root = [[RootViewController alloc] init];
  UINavigationController *navi = [[UINavigationController alloc] initWithRootViewController:root];
  self.window.rootViewController = navi;

  [self.window makeKeyAndVisible];
  return YES;
}

@end
#import <UIKit/UIKit.h>

@interface RootViewController : UIViewController

@end
#import "RootViewController.h"
#import "MainCell.h"
#import "DetialTableViewCell.h"
@interface RootViewController ()<UITableViewDataSource,UITableViewDelegate>
{
  UITableView *_tableView;
  NSMutableDictionary *dic;//存对应的数据
  NSMutableArray *selectedArr;// 二级列表是否展开状态
  NSMutableArray *titleDataArray;
  NSArray *dataArray;//数据源,显示每个cell的数据
  NSMutableDictionary *stateDic;//三级列表是否展开状态
  NSMutableArray *groupArr0;
  NSMutableArray *groupArr1;
  NSMutableArray *groupArr2;
  NSMutableArray *groupArr3;
  NSMutableArray *groupArr4;
  NSMutableArray *groupArr5;

}
@end

@implementation RootViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  self.title = @"列表";
  dic = [[NSMutableDictionary alloc] init];
  selectedArr = [[NSMutableArray alloc] init];
  dataArray = [[NSMutableArray alloc] init];

  // 初始化tableView
  _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320*scaleX, [UIScreen mainScreen].bounds.size.height) style:UITableViewStylePlain];
  _tableView.delegate = self;
  _tableView.dataSource = self;
  // 隐藏滚动条
  _tableView.showsVerticalScrollIndicator = NO;
  _tableView.showsHorizontalScrollIndicator = NO;
  _tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
  [self.view addSubview:_tableView];

  // 加载数据
  [self loadData];
}
/**
 * 加载数据
 */
- (void)loadData
{
  titleDataArray = [[NSMutableArray alloc] initWithObjects:@"亲朋",@"家人",@"好友", @"蓝颜",@"同学",@"老乡",nil];

  NSMutableDictionary *nameAndStateDic1 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",@"小莉",@"name",@"NO",@"state", nil];
  NSMutableDictionary *nameAndStateDic2 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",@"婷婷",@"name",@"NO",@"state", nil];
  NSMutableDictionary *nameAndStateDic3 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",@"小庄",@"name",@"NO",@"state", nil];

  groupArr0 = [[NSMutableArray alloc] initWithObjects:nameAndStateDic1,nameAndStateDic2,nameAndStateDic3, nil];

  NSMutableDictionary *nameAndStateDic4 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",@"晨晨姐",@"name",@"NO",@"state",nil];
  NSMutableDictionary *nameAndStateDic5 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",@"李涛",@"name",@"NO",@"state",nil];
  NSMutableDictionary *nameAndStateDic6 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",@"海波",@"name",@"NO",@"state",nil];
  NSMutableDictionary *nameAndStateDic7 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",@"张敏",@"name",@"NO",@"state",nil];

  groupArr1 = [[NSMutableArray alloc]initWithObjects:nameAndStateDic4,nameAndStateDic5,nameAndStateDic6,nameAndStateDic7, nil];

  NSMutableDictionary *nameAndStateDic8 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",@"杨浩",@"name",@"NO",@"state",nil];
  NSMutableDictionary *nameAndStateDic9 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",@"小明",@"name",@"NO",@"state",nil];
  NSMutableDictionary *nameAndStateDic10 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",@"洋洋",@"name",@"NO",@"state",nil];
  NSMutableDictionary *nameAndStateDic11 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",@"赵蒙",@"name",@"NO",@"state",nil];
  NSMutableDictionary *nameAndStateDic12 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",@"小催",@"name",@"NO",@"state",nil];
  NSMutableDictionary *nameAndStateDic13 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",@"和平",@"name",@"NO",@"state",nil];

  groupArr2 = [[NSMutableArray alloc]initWithObjects:nameAndStateDic8,nameAndStateDic9,nameAndStateDic10,nameAndStateDic11,nameAndStateDic12,nameAndStateDic13,nil];

  NSMutableDictionary *nameAndStateDic14 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",@"超人",@"name",@"NO",@"state",nil];
  NSMutableDictionary *nameAndStateDic15 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",@"怪兽",@"name",@"NO",@"state",nil];

  groupArr3 = [[NSMutableArray alloc] initWithObjects:nameAndStateDic14,nameAndStateDic15, nil];

  NSMutableDictionary *nameAndStateDic16 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",@"大包",@"name",@"NO",@"state",nil];
  NSMutableDictionary *nameAndStateDic17 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",@"小林子",@"name",@"NO",@"state",nil];
  NSMutableDictionary *nameAndStateDic18 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",@"石头",@"name",@"NO",@"state",nil];
  NSMutableDictionary *nameAndStateDic19 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",@"小轩轩",@"name",@"NO",@"state",nil];
  NSMutableDictionary *nameAndStateDic20 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",@"阿东",@"name",@"NO",@"state",nil];

  groupArr4 = [[NSMutableArray alloc]initWithObjects:nameAndStateDic16,nameAndStateDic17,nameAndStateDic18,nameAndStateDic19,nameAndStateDic20, nil];

  NSMutableDictionary *nameAndStateDic21 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",@"郑平",@"name",@"NO",@"state",nil];
  NSMutableDictionary *nameAndStateDic22 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",@"刘凡",@"name",@"NO",@"state",nil];
  NSMutableDictionary *nameAndStateDic23 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",@"韩琴",@"name",@"NO",@"state",nil];
  NSMutableDictionary *nameAndStateDic24 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",@"刘华健",@"name",@"NO",@"state",nil];
  NSMutableDictionary *nameAndStateDic25 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",@"彭晓明",@"name",@"NO",@"state",nil];
  NSMutableDictionary *nameAndStateDic26 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",@"张欢",@"name",@"NO",@"state",nil];
  NSMutableDictionary *nameAndStateDic27 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",@"刘来楠",@"name",@"NO",@"state",nil];
  NSMutableDictionary *nameAndStateDic28 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",@"任强",@"name",@"NO",@"state",nil];

  groupArr5 = [[NSMutableArray alloc]initWithObjects:nameAndStateDic21,nameAndStateDic22,nameAndStateDic23,nameAndStateDic24,nameAndStateDic25,nameAndStateDic26,nameAndStateDic27,nameAndStateDic28, nil];

  [dic setValue:groupArr0 forKey:@"0"];
  [dic setValue:groupArr1 forKey:@"1"];
  [dic setValue:groupArr2 forKey:@"2"];
  [dic setValue:groupArr3 forKey:@"3"];
  [dic setValue:groupArr4 forKey:@"4"];
  [dic setValue:groupArr5 forKey:@"5"];

}

#pragma mark - tableViewDelegate -
// 返回几个表头
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
  return titleDataArray.count;
}

// 每个表头返回几行
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
  NSString *string = [NSString stringWithFormat:@"%d",(int)section];
  // 如果表头返回值不为零,则修改图片(改成箭头向下的图片)
  if ([selectedArr containsObject:string]) {
    UIImageView *imageView = (UIImageView *)[_tableView viewWithTag:20000 + section];
    imageView.image = [UIImage imageNamed:@"buddy_header_arrow_down"];

    NSArray *array1 = dic[string];
    return array1.count;
  }
  return 0;
}

// 设置表头的高度
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
  return 40*scaleX;
}
// Section Footer的高度
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
  return 0.2;
}
// 设置view,将替代titleForHeaderInsection方法
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
  UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320*scaleX, 30*scaleY)];
  view.backgroundColor = [UIColor whiteColor];

  UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(20*scaleX, 5*scaleY, tableView.frame.size.width - 20*scaleX, 30*scaleY)];
  titleLabel.text = [titleDataArray objectAtIndex:section];
  [view addSubview:titleLabel];

  UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(5*scaleX, 12*scaleY, 15*scaleX, 15*scaleY)];
  imageView.tag = 20000+section;

  // 判断是不是选中状态
  NSString *string = [NSString stringWithFormat:@"%d",(int)section];
  if ([selectedArr containsObject:string]) {
    imageView.image = [UIImage imageNamed:@"buddy_header_arrow_down"];
  }else{
    imageView.image = [UIImage imageNamed:@"buddy_header_arrow_right"];
  }
  [view addSubview:imageView];

  UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
  button.frame = CGRectMake(0, 0, 320*scaleX, 40*scaleY);
  button.tag = 100 + section;
  [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
  [view addSubview:button];

  UIImageView *lineImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 40*scaleY - 1, 320*scaleX, 1)];
  lineImage.image = [UIImage imageNamed:@"line"];
  [view addSubview:lineImage];

  return view;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
  NSString *indexStr = [NSString stringWithFormat:@"%d",(int)indexPath.section];
  if ([dic[indexStr][indexPath.row][@"cell"] isEqualToString:@"MainCell"]) {
    return 60*scaleY;
  }else{
    return 40*scaleY;
  }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  // 当前是第几个表头
  NSString *indexStr = [NSString stringWithFormat:@"%d",(int)indexPath.section];
  if ([dic[indexStr][indexPath.row][@"cell"] isEqualToString:@"MainCell"]) {
    static NSString *identifier = @"MainCell";
    MainCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

    if (cell == nil) {
      cell = [[MainCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
      cell.selectionStyle = UITableViewCellSelectionStyleGray;
    }

    if ([selectedArr containsObject:indexStr]) {
      cell.Headerphoto.image = [UIImage imageNamed:[NSString stringWithFormat:@"%d.png",arc4random()%11]];
      cell.nameLabel.text = dic[indexStr][indexPath.row][@"name"];
      cell.IntroductionLabel.text = @"滴滴雨点仿佛似流泪,滴在我冰冷的身躯";
      cell.networkLabel.text = @"2G";
    }
    // ???
    if (indexPath.row == dataArray.count - 1) {
      cell.imageLine.image = nil;
    }else{
      cell.imageLine.image = [UIImage imageNamed:@"line"];
    }
    return cell;
  }else if ([dic[indexStr][indexPath.row][@"cell"] isEqualToString:@"AttachedCell"]){
    static NSString *detialIdentifier = @"AttachedCell";
    DetialTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:detialIdentifier];

    if (cell == nil) {
      cell = [[DetialTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:detialIdentifier];
      cell.selectionStyle = UITableViewCellSeparatorStyleNone;
      cell.imageLine.image = [UIImage imageNamed:@"line"];
    }
    return cell;
  }
  return nil;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
  // TODO:search
  [_tableView deselectRowAtIndexPath:indexPath animated:YES];
  NSString *indexStr = [NSString stringWithFormat:@"%d",(int)indexPath.section];
  NSIndexPath *path = nil;

  if ([dic[indexStr][indexPath.row][@"cell"] isEqualToString:@"MainCell"]) {
    // TODO:search
    path = [NSIndexPath indexPathForItem:(indexPath.row + 1) inSection:indexPath.section];
  }else{
    path = indexPath;
  }
  if ([dic[indexStr][indexPath.row][@"state"] boolValue]) {
    // 关闭附加cell
    NSMutableDictionary *dd = dic[indexStr][indexPath.row];
    NSString *name = dd[@"name"];

    NSMutableDictionary *nameAndStateDic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",name,@"name",@"NO",@"state", nil];

    switch (indexPath.section) {
      case 0:
      {
        groupArr0[(path.row-1)] = nameAndStateDic;
        [groupArr0 removeObjectAtIndex:path.row];
      }
        break;
      case 1:
      {
        groupArr1[(path.row-1)] = nameAndStateDic;
        [groupArr1 removeObjectAtIndex:path.row];
      }
        break;
      case 2:
      {
        groupArr2[(path.row-1)] = nameAndStateDic;
        [groupArr2 removeObjectAtIndex:path.row];
      }
        break;
      case 3:
      {
        groupArr3[(path.row-1)] = nameAndStateDic;
        [groupArr3 removeObjectAtIndex:path.row];
      }
        break;
      case 4:
      {
        groupArr4[(path.row-1)] = nameAndStateDic;
        [groupArr4 removeObjectAtIndex:path.row];
      }
        break;
      case 5:
      {
        groupArr5[(path.row-1)] = nameAndStateDic;
        [groupArr5 removeObjectAtIndex:path.row];
      }
        break;
      default:
        break;
    }

    [_tableView beginUpdates];
    [_tableView deleteRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationMiddle];
    [_tableView endUpdates];
  }else{
    // 打开附加cell
    NSMutableDictionary *dd = dic[indexStr][indexPath.row];
    NSString *name = dd[@"name"];

    NSMutableDictionary *nameAndStateDic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"MainCell",@"cell",name,@"name",@"YES",@"state", nil];
    switch (indexPath.section) {
      case 0:
      {
        groupArr0[(path.row-1)] = nameAndStateDic;
        NSMutableDictionary *nameAndStateDic1 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"AttachedCell",@"cell",@"YES",@"state", nil];
        [groupArr0 insertObject:nameAndStateDic1 atIndex:path.row];
      }
        break;
      case 1:
      {
        groupArr1[(path.row-1)] = nameAndStateDic;
        NSMutableDictionary *nameAndStateDic1 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"AttachedCell",@"cell",@"YES",@"state", nil];
        [groupArr1 insertObject:nameAndStateDic1 atIndex:path.row];
      }
        break;
      case 2:
      {
        groupArr2[(path.row-1)] = nameAndStateDic;
        NSMutableDictionary *nameAndStateDic1 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"AttachedCell",@"cell",@"YES",@"state", nil];
        [groupArr2 insertObject:nameAndStateDic1 atIndex:path.row];
      }
        break;
      case 3:
      {
        groupArr3[(path.row-1)] = nameAndStateDic;
        NSMutableDictionary *nameAndStateDic1 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"AttachedCell",@"cell",@"YES",@"state", nil];
        [groupArr3 insertObject:nameAndStateDic1 atIndex:path.row];
      }
        break;
      case 4:
      {
        groupArr4[(path.row-1)] = nameAndStateDic;
        NSMutableDictionary *nameAndStateDic1 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"AttachedCell",@"cell",@"YES",@"state", nil];
        [groupArr4 insertObject:nameAndStateDic1 atIndex:path.row];
      }
        break;
      case 5:
      {
        groupArr5[(path.row-1)] = nameAndStateDic;
        NSMutableDictionary *nameAndStateDic1 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"AttachedCell",@"cell",@"YES",@"state", nil];
        [groupArr5 insertObject:nameAndStateDic1 atIndex:path.row];
      }
        break;
      default:
        break;
    }
    [_tableView beginUpdates];
    [_tableView insertRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationMiddle];
    [_tableView endUpdates];
  }
}

-(void)buttonAction:(UIButton *)sender
{
  NSString *string = [NSString stringWithFormat:@"%d",(int)(sender.tag-100)];

  //数组selectedArr里面存的数据和表头想对应,方便以后做比较
  if ([selectedArr containsObject:string])
  {
    [selectedArr removeObject:string];
  }
  else
  {
    [selectedArr addObject:string];
  }

  [_tableView reloadData];
}

- (void)didReceiveMemoryWarning {
  [super didReceiveMemoryWarning];
  // Dispose of any resources that can be recreated.
}

@end
#import <UIKit/UIKit.h>

@interface MainCell : UITableViewCell

@property (strong, nonatomic) UILabel *nameLabel;

@property (strong, nonatomic) UILabel *IntroductionLabel;

@property (strong, nonatomic) UILabel *networkLabel;

@property (strong, nonatomic) UIImageView *Headerphoto;

@property (strong, nonatomic) UIImageView *imageLine;

@end
#import "MainCell.h"

@implementation MainCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
  self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
  if (self) {
    // 头像
    _Headerphoto = [[UIImageView alloc] initWithFrame:CGRectMake(6*scaleX, 5*scaleY, 50*scaleX, 50*scaleX)];
    [self.contentView addSubview:_Headerphoto];
    // 名字
    _nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(60*scaleX, 5*scaleY, 200*scaleX, 25*scaleX)];
    _nameLabel.font = [UIFont systemFontOfSize:15];
    [self.contentView addSubview:_nameLabel];
    // 简介
    _IntroductionLabel = [[UILabel alloc] initWithFrame:CGRectMake(60*scaleX, 28*scaleY, 240*scaleX, 25*scaleX)];
    _IntroductionLabel.backgroundColor = [UIColor clearColor];
    _IntroductionLabel.textColor = [UIColor lightGrayColor];
    _IntroductionLabel.font = [UIFont systemFontOfSize:13];
    [self.contentView addSubview:_IntroductionLabel];

    // 网络
    _networkLabel = [[UILabel alloc] initWithFrame:CGRectMake(290*scaleX, 5*scaleY, 50*scaleX, 25*scaleY)];
    _networkLabel.backgroundColor = [UIColor clearColor];
    _networkLabel.textColor = [UIColor lightGrayColor];
    _networkLabel.font = [UIFont systemFontOfSize:13];
    [self.contentView addSubview:_networkLabel];

    // 分割线
    _imageLine = [[UIImageView alloc] initWithFrame:CGRectMake(60*scaleX, 60*scaleY - 1, (320 - 60)*scaleX, 1)];
    [self.contentView addSubview:_imageLine];
  }
  return self;
}

@end
#import <UIKit/UIKit.h>

@interface DetialTableViewCell : UITableViewCell

@property (strong, nonatomic) UIImageView *imageLine;

@end
#import "DetialTableViewCell.h"
#import "UIButton+initializer.h"
@implementation DetialTableViewCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
  self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
  if (self) {
    // 分割线
    _imageLine = [[UIImageView alloc] initWithFrame:CGRectMake(60*scaleX, 40*scaleY - 1, (320 - 60)*scaleY, 1)];
    [self.contentView addSubview:_imageLine];

    UIButton *btn1 = [UIButton initButtonWithFrame:CGRectMake(70*scaleX, 9*scaleY, 50*scaleX, 20*scaleY) Title:@"语音" Target:self Selector:@selector(btnAction:)];
    btn1.tag = 100;

    UIButton *btn2 = [UIButton initButtonWithFrame:CGRectMake(130*scaleX, 9*scaleY, 50*scaleX, 20*scaleY) Title:@"视频" Target:self Selector:@selector(btnAction:)];
    btn2.tag = 200;

    UIButton *btn3 = [UIButton initButtonWithFrame:CGRectMake(190*scaleX, 9*scaleY, 50*scaleX, 20*scaleY) Title:@"图片" Target:self Selector:@selector(btnAction:)];
    btn3.tag = 300;

    UIButton *btn4 = [UIButton initButtonWithFrame:CGRectMake(250*scaleX, 9*scaleY, 50*scaleX, 20*scaleY) Title:@"表情" Target:self Selector:@selector(btnAction:)];
    btn4.tag = 400;

    [self.contentView addSubview:btn1];
    [self.contentView addSubview:btn2];
    [self.contentView addSubview:btn3];
    [self.contentView addSubview:btn4];
  }
  return self;
}

- (void)btnAction:(UIButton *)sender
{
  switch (sender.tag) {
    case 100:
    {
      NSLog(@"~~~~语音~~~~");
    }
      break;
    case 200:
    {
      NSLog(@"~~~~视频~~~~");
    }
      break;
    case 300:
    {
      NSLog(@"~~~~图片~~~~");
    }
      break;
    case 400:
    {
      NSLog(@"~~~~表情~~~~");
    }
      break;
    default:
      break;
  }
}

- (void)awakeFromNib {
  // Initialization code
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
  [super setSelected:selected animated:animated];

  // Configure the view for the selected state
}

@end
#import <UIKit/UIKit.h>

@interface UIButton (initializer)
/**
 * 初始化button
 *
 * @param frame    button的尺寸
 * @param target    button的目标对象
 * @param selector   点击button所触发的方法
 * @param image    button的背景图片
 * @param imagePressed button高亮时的图片
 *
 * @return button
 */
+ (UIButton *)initButtonWithFrame:(CGRect)frame Target:(id)target Selector:(SEL)selector Image:(NSString *)image ImagePressed:(NSString *)imagePressed;
/**
 * 初始化button
 *
 * @param frame  button的尺寸
 * @param title  button的标题
 * @param target  button的目标对象
 * @param selector 点击button所触发的方法
 *
 * @return button
 */
+ (UIButton *)initButtonWithFrame:(CGRect)frame Title:(NSString *)title Target:(id)target Selector:(SEL)selector;

@end
#import "UIButton+initializer.h"

@implementation UIButton (initializer)

+ (UIButton *)initButtonWithFrame:(CGRect)frame Target:(id)target Selector:(SEL)selector Image:(NSString *)image ImagePressed:(NSString *)imagePressed
{
  UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
  [button setFrame:frame];
  UIImage *newImage = [UIImage imageNamed:image];
  [button setBackgroundImage:newImage forState:0];
  UIImage *newPressedImage = [UIImage imageNamed:imagePressed];
  [button setBackgroundImage:newPressedImage forState:UIControlStateHighlighted];
  [button addTarget:target action:selector forControlEvents:UIControlEventTouchUpInside];
  return button;
}

+ (UIButton *)initButtonWithFrame:(CGRect)frame Title:(NSString *)title Target:(id)target Selector:(SEL)selector
{
  UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
  [button setFrame:frame];
  [button setTitle:title forState:0];
  [button addTarget:target action:selector forControlEvents:UIControlEventTouchUpInside];
  return button;
}

@end

pch文件的代码:

#ifndef QQList_PrefixHeader_pch
#define QQList_PrefixHeader_pch

#define scaleX [UIScreen mainScreen].bounds.size.width/320.0
#define scaleY [UIScreen mainScreen].bounds.size.height/568.0

#endif

总结

以上就是在IOS展开三级列表效果示例的全部内容,希望本文的内容对大家IOS时能有所帮助。

(0)

相关推荐

  • Android实现三级联动下拉框 下拉列表spinner的实例代码

    主要实现办法:动态加载各级下拉值的适配器 在监听本级下拉框,当本级下拉框的选中值改变时,随之修改下级的适配器的绑定值              XML布局: 复制代码 代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_w

  • iOS多级列表实现代码

    在项目开发中,层级列表经常遇到,简单点的二级列表利用UITableView的Header就可以实现,再简单点的三级列表通过对Cell高度进行调整也可以实现三级列表的效果.但遇到多级列表,尤其是层次不明的动态列表就比较麻烦了. 原理 层级列表和树形结构比较类似,不过不是二叉树,而是多叉树.每个节点只需要拥有指向父节点和子节点的两个指针,就能形成一颗树.我们将多级列表中每一级对象看作一个node,node拥有两个属性,分别为父节点和子节点的ID. 每棵树有个一个虚拟的root节点,它的ID为root

  • 讲解iOS开发中UITableView列表设计的基本要点

    一.UITableView简单介绍 1.tableView是一个用户可以滚动的多行单列列表,在表视图中,每一行都是一个UITableViewCell对象,表视图有两种风格可选 复制代码 代码如下: typedef NS_ENUM(NSInteger, UITableViewStyle) {     UITableViewStylePlain,                  // regular table view     UITableViewStyleGrouped           

  • 使用UItableview在iOS应用开发中实现好友列表功能

    基本实现 一.项目结构和plist文件 二.实现代码 1.说明: 主控制器直接继承UITableViewController 复制代码 代码如下: //  YYViewController.h //  02-QQ好友列表(基本数据的加载) // //  Created by apple on 14-5-31. //  Copyright (c) 2014年 itcase. All rights reserved. // #import <UIKit/UIKit.h> @interface YY

  • IOS实现展开二级列表效果

    先来看看效果图 用法(类似UITableView) 初始化XDMultTableView #import "XDMultTableView.h" ... @property(nonatomic, readwrite, strong)XDMultTableView *tableView; _tableView = [[XDMultTableView alloc] initWithFrame:CGRectMake(0, 64, self.view.frame.size.width, sel

  • iOS实现列表与网格两种视图的相互切换

    下图为京东商城的截图 很多人看到这个,第一眼想到的是用TableView和CollectionView来做切换,笔者刚开始也是认为这么做,后来发现还有一个非常的简单方法,就可以实现这个功能. 实现代码 1.首先创建一个CollectionView. - (UICollectionView *)collectionView { if (!_collectionView) { UICollectionViewFlowLayout *flowlayout = [[UICollectionViewFlo

  • IOS实现简易版的QQ下拉列表

    下面我们通过实例代码来一步步看怎么实现, 首先建立了两个模型类, 一个Friend, 一个FriendGroup类. 数据源用的本地的一个plist文件. plist文件中包含了FriendGroup的name,friends数组等属性. Friend.h 示例代码 #import <Foundation/Foundation.h> @interface Friend : NSObject @property (nonatomic, copy) NSString *name; @end Fri

  • iOS功能实现之列表的横向刷新加载

    库命名为PSRefresh,支持UIScrollView及所有UIScrollView的子类控件,UITableView(横向的tableVIew)及UICollectionView等皆可. 支持自定义文字,支持自定义gif图,可设置是否为最后一页. 本文一共提供了三种样式,分别是普通样式.gif加载样式(带有状态label).git加载样式(不带有状态label). Demo展示如下: 使用时导入 "UIScrollView+PSRefresh.h" 文件即可,文件中提供的属性及接口

  • ios基于UITableViewController实现列表

    实现效果图如下: News.h #import <Foundation/Foundation.h> @interface News : NSObject @property (nonatomic, strong) NSString *title; @property (nonatomic) NSUInteger count; @property (nonatomic, strong) NSString *imageName; + (NSArray *)demoData; @end<str

  • IOS展开三级列表效果示例

    效果图如下: #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @end #import "AppDelegate.h" #import "RootViewController.h" @interface AppDelegate

  • jQuery实现常见的隐藏与展示列表效果示例

    本文实例讲述了jQuery实现常见的隐藏与展示列表效果.分享给大家供大家参考,具体如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>www.jb51.net jquery品牌

  • 小程序实现展开/收起的效果示例

    前言:本章说下文字内容的展开与收起的实现,要实现这么一个效果:当收起的时候隐藏并显示省略号,当展开的时候显示全部文字. GitHub:https://github.com/Ewall1106/miniProgramDemo 先看下效果图: 小程序 - 展开/收起 1.结构样式 (1)首先我们定义一下html结构: <view class="container"> <view class="title"> <text class=&quo

  • iOS添加购物车动画效果示例

    一.计算动画开始结束点位置 方法: - (CGPoint)convertPoint:(CGPoint)point toView:(nullable UIView *)view; 1) 动画开始位置fromCenter 复制代码 代码如下: CGPoint fromCenter =  [animationView convertPoint:CGPointMake(animationView.frame.size.width * 0.5f, animationView.frame.size.heig

  • IOS购物车界面实现效果示例

    购物软件不可避免有添加购物车的页面,那么购物车功能是怎么实现的呐?这里提供一种简单的思路,插入本地数据库. 先看效果 页面结构 本页面是由一个tableview和底部的底部的bottomView构成 底部的bottomView上有按钮,也可以添加其他属性,比如总价格,总重量等参数. 代码结构 思路 看到这样的需求,我想到的是插入本地数据库,每一条数据都有对应的id和其他的例如价格等的参数,根据id插入本地是一条可行的方法,为了避免刷新的时候选中的单元格和没选中的单元格的复用,我们需要对按钮做一点

  • iOS中Cell的Section展开和收起的示例代码

    整理文档,搜刮出一个iOS中Cell的Section展开和收起的示例代码,稍微整理精简一下做下分享. 首先,先上图,让大家看看效果 相信大家对于TableViewd数据的设置都熟悉,这方面就不多说的,重点的还是来看: 1.如何实现cell的Section的展开和收起的效果 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [self.tableView des

  • vue和react等项目中更简单的实现展开收起更多等效果示例

    前言 本文题目中虽然写有vue和react,但是并非vue和react相关知识,而是最基本的html5和css3的一些知识,之所以写vue,是因为我最近项目中用到了类似效果,我用vue相关知识实现并不雅观,用html5和css3实现,则更加完美. 项目案例 项目中有如下效果: 好多展开收起,对于这个的实现,我一开始用了vue一些比较挫的dom操作,就是父元素toggleClass一个类名,进行子元素的显示和隐藏. 由于这个方法是通用方法,项目中好多地方使用,代码大概如下: toggleShow(

  • 使用mint-ui实现省市区三级联动效果的示例代码

    引用插件:饿了么的mint-ui组件中的picker功能,具体API可参照官网说明:http://mint-ui.github.io/docs/#/zh-cn2/picker 背景:项目需要做一个省份-城市-地区的选择级联效果,我从gayhub上找了一下,决定使用mint-ui的组件,因为各个功能都很全而且设计跟我们的项目风格类似. 具体实现: 通过阅读官网的实例,大概就能知道这个组件的用法: 在vue中写入组件:<mt-picker :slots="slots" @change

  • jquery+ajax实现省市区三级联动效果简单示例

    本文实例讲述了jquery+ajax实现省市区三级联动效果.分享给大家供大家参考,具体如下: 一直想学习下Ajax,没时间,汗,这借口太牵强了.下了点教程在手机里,翻了好几遍了,没实战一次. 最近的项目里需要Ajax实现效果,就下了个jquery,然后找了个实例,学习了一下,幡然醒悟,NND,jquery果然强大的一塌糊涂,实现Ajax简直就是不费吹灰之力.下面把学习过程跟大家分享下,虽然还没有搞清楚jquery ajax的底层相关.不管了.我们不需要去发明轮子.呵呵. 先上代码,是一个省市区三

随机推荐