2014-04-06 3 views
0

У меня есть UITableView с картами. Каждый раз, когда я хочу добавить новую карту после нажатия кнопки рисования, я хочу, чтобы она была перемещена из центра представления в место в таблице, она должна быть размещена с некоторой базовой анимацией. Мне удалось получить назначение новой нарисованной карты с этим кодом:Tableview reloadData и получение CGRect новой ячейки

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

Однако, чтобы определить cellRectInTableDrawnCard мне нужно перезагрузить playerCardsTable с reloadData, но это показывает нарисованную карту уже. Это всего лишь часть секунды, потому что я помещаю новую карту в таблицу с анимацией, которая срабатывает сразу после reloadData. Выполнение перезагрузки после анимации не является вариантом, потому что у меня тогда нет drawnCardIndexPath.

Есть ли способ, которым я могу получить прямоугольник без перезагрузки стола? Или еще, есть ли способ скрыть новую ячейку после reloadData и показать ее после завершения анимации?

Спасибо!

ответ

0

Возможно, вы захотите вставить строку и заполнить ее по отдельности и не выполнять полную перезагрузку таблицы.

Фрагмент кода показывает кнопку, которая использует insertRowsAtIndexPaths: indexPathArray, чтобы добавить новую строку, которая дает вам ячейку rect для создания анимации. Когда вы закончите с анимацией, просто используйте reloadRowsAtIndexPaths, чтобы заполнить значение ячейки (покажите, что вы - карта, я бы догадался).

Используйте bool для принятия решения в cellForRowAtIndexPath, когда вы должны отображать новую карту (в основном после вызова reloadRowsAtIndexPaths).

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

Большое спасибо! Я использовал ваш пример и немного подгонял его, чтобы соответствовать моим пожеланиям, но он указал мне в правильном направлении. – Niels

Смежные вопросы