2

我已经使用 cellForRowAtIndexPath 中的以下代码设置了自定义分组表视图样式。每个单元格都有一个新的背景视图,并且它的角根据其在该部分中的位置进行了圆角处理。我在整个应用程序中使用这种风格,在各种视图中我使用动画来添加和删除行。(使用 [tableview insertRowsAtIndexPaths:] 等)。

如果插入或删除部分的最后一行,我需要能够重新加载单元格背景视图角。我怎样才能做到这一点而不调用 [tableview reloadData] 甚至 reloadCellsAtIndexPaths?这两个函数都会弄乱插入和删除单元格的动画。有没有什么地方可以放置这个在适当的时间被调用的背景角定义?默认的分组表视图是如何做到这一点的?

对不起,如果这不清楚。要求澄清,我会编辑。谢谢!:)

UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:[self styleForCellAtIndexPath:indexPath] 
                                       reuseIdentifier:cellIdentifier] autorelease];

        // Theme the cell
            TableCellBackgroundView *backgroundView = [[TableCellBackgroundView alloc] initWithFrame:cell.frame];
            TableCellBackgroundView *selectedBackgroundView = [[TableCellBackgroundView alloc] initWithFrame:cell.frame];
            selectedBackgroundView.selectedStyle = YES;
            // top row, without header
            BOOL header = [self tableView:aTableView heightForHeaderInSection:indexPath.section]!=0;
            if (indexPath.row == 0 && (!header || tableTheme==kTableThemeSimple)) {
                backgroundView.topRadius = 6;
                selectedBackgroundView.topRadius = 6;
            }
            // bottom row
            if (indexPath.row == [self tableView:aTableView numberOfRowsInSection:indexPath.section]-1) {
                backgroundView.bottomRadius = 6;
                selectedBackgroundView.bottomRadius = 6;
            }
            cell.backgroundView = backgroundView;
            cell.selectedBackgroundView = selectedBackgroundView;
            cell.contentView.backgroundColor = [UIColor clearColor];
            cell.backgroundColor = [UIColor clearColor];
        }
    }
4

3 回答 3

0

对我有用的解决方案是:

  1. 在 tableView:willDisplayCell:forRowAtIndexPath 中设置背景:
  2. 创建一个名为 reloadBackgroundForRowAtIndexPath 的便捷方法,该方法手动调用 willDisplayCell
  3. 当我添加一行时,延迟后调用便捷方法以允许表格动画完成

    - (void)reloadBackgroundForRowAtIndexPath:(NSIndexPath*)indexPathToReload {
        [self tableView:self.tableView willDisplayCell:[self.tableView cellForRowAtIndexPath:indexPathToReload] forRowAtIndexPath:indexPathToReload];
    }
    
    - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
        // Logic to determine the background image
    }
    
    // elsewhere, update the table, then
    NSIndexPath *indexPathToFix = [NSIndexPath indexPathForRow:count-1 inSection:0];
    // If the new row is coming out, we want to update the background right away.  If the new row is going away, we want to wait to update until the animation is done.
    // I don't like hard-coding the animation length here, but I don't think I have a choice.
    [self performSelector:@selector(reloadBackgroundForRowAtIndexPath:)  withObject:indexPathToFix afterDelay:(self.tableView.isEditing ? 0.0 : 0.2)];
    
于 2012-07-31T16:25:10.377 回答
0

如果你有一个调用自定义动画的方法,当动画完成时,或者在显示新单元格之前,使用 UITableViewCell 的子类调用一个名为 - (void) fixCornersWithIndexPath 的方法: (NSIndexPath *) 索引路径。

- (void) customAnimationForCellAtIndexPath: (NSIndexPath *) path {
    //your animation things
    CustomCell *cell = [self.tableView cellForRowAtIndexPath: indexPath];
    [cell fixCornersWithIndexPath: path andRowCount: [self tableView:aTableView numberOfRowsInSection:indexPath.section]];
}

然后修复角落应该是这样的:

- (void) fixCornersWithIndexPath: (NSIndexPath *) indexPath andRowCount: (NSInteger *) rowCount {
      if (indexPath.row == 0 && (!header || tableTheme==kTableThemeSimple)) {
            self.backgroundView.topRadius = 6;
            self.selectedBackgroundView.topRadius = 6;
        }
        // bottom row
        if (indexPath.row == rowCount-1) {
            self.backgroundView.bottomRadius = 6;
            self.selectedBackgroundView.bottomRadius = 6;
        }
}

希望这可以帮助!

于 2012-04-19T00:38:10.287 回答
0

我想这就是你要找的。更改模型后,请致电:

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation

这将导致调用您的 cellAtIndexPath 方法。发送一个包含过期行的单个索引路径的数组(我猜对于圆角问题,这是删除一行后的最后一行,或者是新添加的最后一行之前的行)。

您可以在开始/结束更新之间将其与其他更新方法一起调用。

于 2012-04-19T00:52:51.137 回答