UITableViewCell анимация при прокрутке - PullRequest
4 голосов
/ 26 ноября 2010

Я реализовал Cocoa с примером от Love для выбора нескольких строк , который включает создание пользовательского UITableViewCell, который запускает анимацию в layoutSubviews для отображения флажков слева от каждой строки, например так:

- (void)layoutSubviews
{
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationBeginsFromCurrentState:YES];

    [super layoutSubviews];

    if (((UITableView *)self.superview).isEditing)
    {
        CGRect contentFrame = self.contentView.frame;
        contentFrame.origin.x = EDITING_HORIZONTAL_OFFSET;
        self.contentView.frame = contentFrame;
    }
    else
    {
        CGRect contentFrame = self.contentView.frame;
        contentFrame.origin.x = 0;
        self.contentView.frame = contentFrame;
    }

    [UIView commitAnimations];
}

Это работает нормально, и для всех целей и задач мой UITableView работает как надо. Однако я сталкиваюсь с небольшой эстетической проблемой: при прокрутке строк UITableView, которые ранее не отображались, запускается их скользящая анимация, что означает, что анимация смещается для определенных строк по мере их появления.

Это понятно, учитывая, что для setAnimationBeginsFromCurrentState задано значение YES, а строки, расположенные ниже в UITableView, еще не обновили свою позицию кадра. Чтобы решить эту проблему, я попытался использовать willDisplayCell для переопределения анимации для ячеек, которые становятся видимыми, когда UITableView находится в режиме редактирования. По сути, минуя анимацию и немедленно обновляя фрейм строк, чтобы она выглядела так, как будто ячейка уже анимирована, как здесь:

/*
 Since we animate the editing transitions, we need to ensure that all animations are cancelled
 when a cell is scheduled to appear, so that things happen instantly.
 */
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    [cell.contentView.layer removeAllAnimations];   

    if(tableView.isEditing) {
        CGRect contentFrame = cell.contentView.frame;
        contentFrame.origin.x = EDITING_HORIZONTAL_OFFSET;
        cell.contentView.frame = contentFrame;
    } else {
        CGRect contentFrame = cell.contentView.frame;
        contentFrame.origin.x = 0;
        cell.contentView.frame = contentFrame;
    }
}

К сожалению, это, похоже, не имеет никакого эффекта. У кого-нибудь есть идеи относительно того, как я могу решить эту проблему?

1 Ответ

1 голос
/ 03 ноября 2011

Не уверен, что вам все еще нужен ответ на этот вопрос, но я столкнулся с точно такой же проблемой, поэтому подумал, что поделюсь своим решением. Я реализовал Multi-Selection так же, как это было описано в блоге «Какао с любовью», который вы упомянули.

В методе cellAtIndexPath DataSource, когда я создаю новую ячейку (если ячейка уже не находится в очереди многократно используемых ячеек), я проверяю, находится ли tableView в режиме редактирования, и задаю ли я свойство для ячейки (я создал свою собственную ячейку со свойством EnableAnimation) в false, чтобы при получении обратного вызова SetEditing он не анимировал ячейку, а просто устанавливал кадр. В конструкторе класса Cell я устанавливаю EnableAnimation в true, когда вызывается обратный вызов SetEditing, я устанавливаю EnableAnimation для передаваемого аргумента animate. Надеюсь, это поможет.

...