Я реализовал 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;
}
}
К сожалению, это, похоже, не имеет никакого эффекта. У кого-нибудь есть идеи относительно того, как я могу решить эту проблему?