自定义UITableViewCell背景,何时重新加载等

时间:2012-04-19 00:25:05

标签: iphone objective-c ios uitableview

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

如果插入或删除了部分的最后一行,我需要能够重新加载单元格背景视图角。如何在不调用[tableview reloadData]甚至reloadCellsAtIndexPaths的情况下执行此操作?这两个功能都搞乱了插入和删除单元格的动画。有什么地方我可以把这个背景角定义在适当的时候调用吗?默认分组tableview如何执行此操作?

对不起,如果不清楚的话。要求澄清,我将编辑。谢谢! :)

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];
        }
    }

3 个答案:

答案 0 :(得分:0)

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

- (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;
        }
}

希望这有帮助!

答案 1 :(得分:0)

我认为这就是你要找的东西。在更改模型后,请致电:

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

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

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

答案 2 :(得分: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)];