Tableview reloadData并获取新单元格的CGRect

时间:2014-04-06 11:28:11

标签: ios uitableview

我有卡UITableView。每次我想在按下绘图按钮后添加新卡片时,我希望它从视图中心移动到表格中的位置,它应该放置一些基本动画。我已设法使用以下代码获取新绘制卡片的目的地:

cellRectInTableDrawnCard = [[self playerCardsTable] rectForRowAtIndexPath:drawnCardIndexPath];
cellInSuperviewDrawnCard = [[self playerCardsTable]  convertRect:cellRectInTableDrawnCard toView:[[self playerCardsTable] superview]];

但是,要确定cellRectInTableDrawnCard我需要使用playerCardsTable重新加载reloadData,但这会显示已提取的卡片。它只是几分之一秒,因为我将新卡放在表中,动画在reloadData之后触发。动画后不能重新加载,因为我没有drawnCardIndexPath

有没有办法在没有重新加载tableview的情况下获取rect?或者,有没有办法可以在reloadData之后隐藏新单元格并在动画完成后显示它?

谢谢!

1 个答案:

答案 0 :(得分:0)

您可能希望插入行并单独填充它,而不是执行完整的表重新加载。

代码片段显示了一个使用insertRowsAtIndexPaths:indexPathArray的按钮来添加一个新行,它为您提供动画内容的单元格。 当你完成动画时,只需使用reloadRowsAtIndexPaths来填充单元格值(显示你的卡片,我猜)。

当你应该显示新卡时(在你调用reloadRowsAtIndexPaths之后),使用bool来决定cellForRowAtIndexPath。

- (IBAction)butAddCardToHandAction:(id)sender {
    // Add a blank record to the array
    NSString *strCard = @"New Card";
    _showCard = NO;
    [_arrayHandCards addObject:strCard];

    // create the index path where you want to add the card
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:(_arrayHandCards.count - 1) inSection:0];
    NSArray *indexPathArray = [NSArray arrayWithObjects:indexPath,nil];

    // Update the table
    [self.tableView beginUpdates];
    [self.tableView insertRowsAtIndexPaths:indexPathArray withRowAnimation:UITableViewRowAnimationNone];
    [self.tableView endUpdates];
    // Ok - you got a blank record in the table, get the cell rect.
    CGRect cellRectInTableDrawnCard = [[self tableView] rectForRowAtIndexPath:indexPath];
    NSLog(@"My new rect has y position : %f",cellRectInTableDrawnCard.origin.y);
     //Do the animation you need to do and when finished populate the selected cell


    _showCard = YES;
    [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
}

控制单元格中显示的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    // Set up the cell and use boolean to decide what to show
    NSString *strToDisplayInCell;
    if (!_showCard)
    {
        strToDisplayInCell = @"";
    }
    else
    {
        NSString *strToDisplayInCell = [_arrayHandCards objectAtIndex:indexPath.row];
        cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:15];
        cell.textLabel.text = strToDisplayInCell;
    }
    return cell;
}