zoukankan      html  css  js  c++  java
  • 一个tableview的自带动画

    最近在实习,这是最近老师叫做的项目里面的一个东西,先以为很难,做了很久也没做出来,后面老师讲了之后发现其实很简单,现在分享上来给大家。

    说一下他的主要逻辑,其实就是设置了几个section ,section的headview需要自定义。。存了几个字典在datasoure(也就是一个数组当中)。字典里面有个bool值判断是否展开section,也就是是否添加cell进section里面。添加进去的时候tableview自带了动画所以看起来就跟上面一样了。删除同理,只是把cell移除了而已。逻辑真的很简单。因为最近很忙,就直接把项目的代码贴上了。没有注释的地方也请多多包涵。

    [super viewDidLoad];
        //
        [self setEdgesForExtendedLayout:UIRectEdgeNone];//避免布局上移
        
        // Uncomment the following line to preserve selection between presentations.
        // self.clearsSelectionOnViewWillAppear = NO;
        
        // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
        // self.navigationItem.rightBarButtonItem = self.editButtonItem;
        
        //    _dataSource = @{@"面试": @[@"自我介绍", @"如何回答面试官的问题"] ,
        //                    @"薪资": @[@"谈钱牢记四句话", @"面试获高薪资的实战技巧"],
        //                    @"简历": @[@"HR是这样看简历的"]};
        
        self.view.backgroundColor = [UIColor whiteColor];
        self.tableView.backgroundColor = [UIColor whiteColor];
        
        _dataSource = [[NSMutableArray alloc] init];
        
        
        //初始化一条数
        NSDictionary * oraldic1 = @{@"title": @"自我介绍"};
        NSDictionary * oraldic2 = @{@"title": @"如何回答面试官的问题"};
        
        NSArray * oralarray = @[oraldic1, oraldic2];
        
        NSMutableDictionary * dictionary = [[NSMutableDictionary alloc] init];
        [dictionary setObject:oralarray forKey:@"detail"];
        [dictionary setObject:@(NO) forKey:@"isFold"];
        [dictionary setObject:@"面试" forKey:@"title"];
        
        //将数据加入数据源中
        [_dataSource addObject:dictionary];
        
        //初始化第二条数据
        NSDictionary * saldic1 = @{@"title": @"谈钱牢记四句话"};
        NSDictionary * saldic2 = @{@"title": @"面试获高薪资的实战技巧"};
        
        NSArray * salarray = @[saldic1, saldic2];
        NSMutableDictionary * salDictionary = [[NSMutableDictionary alloc] init];
        [salDictionary setObject:salarray forKey:@"detail"];
        [salDictionary setObject:@(NO) forKey:@"isFold"];
        [salDictionary setObject:@"薪资" forKey:@"title"];
        
        [_dataSource addObject:salDictionary];
        
           NSDictionary *dic3=@{@"title":@"HR时这样看简历的"};
          NSArray *arr=@[dic3];
        NSMutableDictionary *saldic=[[NSMutableDictionary alloc]init];
        [saldic setObject:arr forKey:@"detail"];
        [saldic setObject:@(NO) forKey:@"isFold"];
        [saldic setObject:@"简历" forKey: @"title"];
       [_dataSource addObject:saldic];
       
        
        //配置tableview
        self.tableView.rowHeight = 40;
        self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
        
        //添加刷新功能
        self.refreshControl = [[UIRefreshControl alloc] init];
        self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"下拉刷新"];
        self.refreshControl.tintColor = [UIColor redColor];
        [self.refreshControl addTarget:self action:@selector(doRefreshProcess) forControlEvents:UIControlEventValueChanged];
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    #pragma mark - Table view data source
    
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        // Return the number of sections.
        
        
        return [_dataSource count];
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        // Return the number of rows in the section.
        
        //得到header状态
        BOOL flag = [_dataSource[section][@"isFold"] boolValue];
        return flag ? [_dataSource[section][@"detail"] count] : 0;
    }
    
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        
        static NSString * identify = @"reuseIdentifier";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identify];
        if (!cell) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identify];
        }
        NSString * key = _dataSource[indexPath.section][@"detail"][indexPath.row][@"title"];
        
        cell.textLabel.text = key;
        
        return cell;
    }
    
    //- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
    //{
    //    return _dataSource[section][@"title"];
    //}
    
    //创建tableview 头
    - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
    {
        NSString *sectionIdentifier = @"mySection";
        UITableViewHeaderFooterView *headerView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:sectionIdentifier];
        headerView.userInteractionEnabled = YES;
        if (!headerView) {
            //大标题label
            headerView = [[UITableViewHeaderFooterView alloc]initWithReuseIdentifier:sectionIdentifier];
            headerView.contentView.backgroundColor = [UIColor whiteColor];
            UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 0, 300, 50)];
            textLabel.tag = 201;
            textLabel.textColor = [UIColor blackColor];
            textLabel.backgroundColor = [UIColor whiteColor];
            textLabel.font = [UIFont boldSystemFontOfSize:20];
            [headerView.contentView addSubview:textLabel];
            
            UILabel *lineLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 45, 375, 1)];
            lineLabel.backgroundColor = [UIColor colorWithWhite:0.9 alpha:1.0];
            [headerView.contentView addSubview:lineLabel];
            
            //展开按钮
            UIButton *openBtn = [[UIButton alloc] initWithFrame:CGRectMake(330, 5, 40, 40)];
            openBtn.tag = 202;
            openBtn.backgroundColor = [UIColor redColor];
            [openBtn.titleLabel setFont:[UIFont systemFontOfSize:20]];
            [openBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
            [openBtn setImage:[UIImage imageNamed:@"inter_open"] forState:UIControlStateNormal];
            [openBtn setImage:[UIImage imageNamed:@"inter_close"] forState:UIControlStateSelected];
            [openBtn addTarget:self action:@selector(doFoldAndUnfold:) forControlEvents:UIControlEventTouchUpInside];
            [headerView.contentView addSubview:openBtn];
        }
        
        UILabel *textLabel = (UILabel *)[headerView viewWithTag:201];
        textLabel.text = _dataSource[section][@"title"];
        UIButton *sectionBtn = (UIButton *)[headerView viewWithTag:202];
        //得到展开状态
        BOOL flag = [_dataSource[section][@"isFold"] boolValue];
        sectionBtn.selected = flag ? YES : NO;
        sectionBtn.tag = 300 + section;//重新设定tag值
        
        return headerView;
    }
    
    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
    {
        return 50;
    }
    
    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        LMdetailController *detail=[[LMdetailController alloc]init];
        [self.navigationController pushViewController:detail animated:YES];
    }
    
    - (void)doFoldAndUnfold:(UIButton *)sender
    {
        //修改按钮点击状态
        sender.selected = !sender.selected;
        
        NSInteger section = sender.tag - 300;//得到哪组
        //得到数据
        //首先确定展开之后多少行
        NSMutableArray * indexArray = [[NSMutableArray alloc] init];
        NSInteger count = [_dataSource[section][@"detail"] count];
        for (int i = 0; i < count; i ++) {
            NSIndexPath * path = [NSIndexPath indexPathForRow:i inSection:section];
            [indexArray addObject:path];
        }
        
        //同步数据源中的展开状态
        [_dataSource[section] setObject:@(sender.selected) forKey:@"isFold"];
        
        //开始展开动画
        if (sender.selected) {
            [self.tableView insertRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationTop];
        } else {
            [self.tableView deleteRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationTop];
        }
        
    }
    
    - (void)doRefreshProcess
    {
        [self.refreshControl beginRefreshing];
        self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"刷新中..."];
        NSLog(@"开始刷新");
        
        //模拟网络请求延时处理
        [self performSelector:@selector(refreshUserInterface) withObject:nil afterDelay:1.0];
    }
    
    - (void)refreshUserInterface
    {
        
        [self.refreshControl endRefreshing];
        self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"下拉刷新"];
        NSLog(@"结束");
        //重新刷新tableview
        [self.tableView reloadData];
    }
  • 相关阅读:
    推荐一个golang的json库
    TinyMind 多标签图像分类竞赛 之路
    动态环境下的slam问题如何解决?
    ubuntu16.04下安装opencv3.4.1及其扩展模块
    Ubuntu 16.04 编译OpenCV 问题解决stdlib.h: No such file or directory
    linux下升级gcc版本(gcc-7)
    基于LSD的直线提取算法
    PL-SLAM
    用U盘制作并安装WIN10 64位原版系统的详细教程(该方法应该适用于任何一版的原版操作系统)
    Win10正式版U盘安装教程
  • 原文地址:https://www.cnblogs.com/xiaomingtongxue/p/4601218.html
Copyright © 2011-2022 走看看