6

我在为自定义 UITableView 部分标题设置动画时遇到问题。
目标是创建可折叠的部分。
当我第一次点击自定义标题时,它会按预期设置动画,但是之后每次都会在原始位置留下一个副本并为另一个设置动画。

图片示例:

替代文字 替代文字
我的自定义标题:

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
       UIView* customView = [[[UIView alloc]initWithFrame:CGRectMake(10.0, 0.0, 300.0, 44.0)]autorelease];
       customView.backgroundColor = [UIColor lightGrayColor];

       UILabel * headerLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];
            headerLabel.backgroundColor = [UIColor clearColor];
            headerLabel.opaque = NO;
            headerLabel.textColor = [UIColor darkGrayColor];
            headerLabel.font = [UIFont boldSystemFontOfSize:16];
            headerLabel.frame = CGRectMake(10, 7, 260.0, 44.0);
            headerLabel.textAlignment = UITextAlignmentCenter;
            NSDictionary *dictionary = [self.data objectAtIndex:section];
            headerLabel.text = [dictionary objectForKey:@"Title"];

            [customView addSubview:headerLabel];


            // add button to right corner of section
        UIButton* headerButton = [[UIButton alloc] initWithFrame:CGRectMake(10, 0, 320, 44)];
            headerButton.center = CGPointMake( 160.0, 22.0);
            headerButton.backgroundColor = [UIColor clearColor];
            headerButton.tag = section;
            [headerButton   addTarget:self action:@selector(expandSection:) forControlEvents:UIControlEventTouchUpInside];

            [customView addSubview:headerButton];

            return customView;
}

我的动画方法:

- (void) expandSection:(id)sender {

    if (expandedSection == [sender tag]) {
        expandedSection = -1;
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
    }else if (expandedSection == -1){
        expandedSection = [sender tag];
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
    }else{
        [self.tableView beginUpdates];  
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:expandedSection] withRowAnimation:UITableViewRowAnimationNone];
        expandedSection = [sender tag];
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
        [self.tableView endUpdates]; 

    }
    //[self.tableView reloadData];
}

我不确定发生了什么,但这些实例表明我需要处理一些事情。我已经尝试了一些事情,但我无法弄清楚这一点。任何对此有帮助的人都会很棒!

编辑:我认为问题在于 reloadSections 导致自定义视图实例化。我无法释放视图,因为我需要它作为参考来更新动画。关于我能做些什么来解决这个问题的任何想法?

4

2 回答 2

8

找到解决方案。

每次更改之前都需要重新加载表。这样,表在进行任何更改之前处于最新状态。

添加 [self.tableView reloadData]; 作为“expandSection”方法中的第一个条目。

代码:

- (void) expandSection:(id)sender {

  [self.tableView reloadData];

    if (expandedSection == [sender tag]) {
        expandedSection = -1;
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
    }else if (expandedSection == -1){
        expandedSection = [sender tag];
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
    }else{
        [self.tableView beginUpdates];  
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:expandedSection] withRowAnimation:UITableViewRowAnimationNone];
        expandedSection = [sender tag];
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
        [self.tableView endUpdates]; 

    }
    //[self.tableView reloadData];
}
于 2010-02-28T06:05:49.940 回答
4

我有一个类似的问题,这是由使用动态高度单元引起的。我有一个可扩展的自定义标题视图,当我更新 tableView 以插入和删除该部分的关联行(意味着它们正在扩展,分别折叠)时,作为子类的部分标题UITableViewHeaderFooterView没有被回收。所以基本上一个新的被分配并添加到旧的导致重叠的视图。单元格标识符已正确设置,因此必须是其他内容。当我删除tableView.sectionHeaderHeight = UITableViewAutomaticDimension并实现视图时func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat,视图被正确回收,每个部分只显示一个标题视图。

我原来实际工作的另一个解决方案是使用UITableViewCell而不是UITableViewHeaderFooterView当您返回时func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?return cell.contenView这将起作用,因为该方法需要返回 UIView 并且由于contentViewUITableViewCell 是 UIView 它工作得很好。背后的思路是通过 UITableViewCell 使用 UITableView 的回收机制,配置好后直接返回它的内容。

结论。这个问题很可能是由UITableViewHeaderFooterViewwhen 与 self sizing tableView 单元格一起使用而UITableViewAutomaticDimension不是手动计算单元格高度引起的。

于 2017-04-18T18:44:30.557 回答