Анимация высоты UITableViewCell при выделении

Возможный дубликат:
Можете ли вы анимировать изменение высоты UITableViewCell, если оно выбрано?

Я много гуглил, пытаясь найти правильный способ сделать это, и пока что я в растерянности.

Я создал подкласс UITableViewCell с моим собственным представлением, и я пытаюсь анимировать высоту UITableViewCell, чтобы она расширялась, когда она выбрана, и сокращалась при ее повторном выборе. Эта таблица может содержать тысячи строк, поэтому я не хочу переопределять tableView heightForRowAtIndexPath. В идеале я хотел бы иметь возможность расширять более одной ячейки за раз, но это не так критично. Как лучше всего это сделать?

Спасибо, Джастин


person Justin    schedule 14.12.2009    source источник


Ответы (1)


Нет другого механизма для указания высоты ячейки, кроме heightForRowAtIndexPath. Если вы должным образом не учитываете расширенную ячейку в этом методе, вы обнаружите, что другие ячейки либо проходят над ней, либо спрятаны под ней. Из тупого кода, где я забыл настроить heightForRowAtIndexPath, я уверен, что другие ваши ячейки будут отображаться поверх него.

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

Что вы можете сделать, так это сохранить путь индекса расширенной ячейки, когда пользователь касается данной ячейки. Тогда heightForRowAtIndexPath может выглядеть так:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath
{

if ([indexPath isEqual:lastSelectedIndexPath])
{
    return 80;
}

else {
    return 44;
}

}

Если вам действительно нужен множественный выбор, вы можете сохранить соответствующие пути индекса к массиву и проверить их следующим образом:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath
{

CGFloat cellHeight = 44;

for (NSIndexPath *expandedIndexPath in expandedIndexPathsArray)
{
    if ([indexPath compare:expandedIndexPath] == NSOrderedSame)
    {
        cellHeight = 80;
        break;
    }
}

return cellHeight;

}

Чтобы анимация выглядела правильно, потребуется определенная работа. Я некоторое время играл с этой конкретной идеей пользовательского интерфейса и никогда не мог заставить себя сесть и действительно воплотить ее в жизнь. Одна вещь, которую вы могли бы сделать, - это отобразить фиктивное представление, которое анимируется, пока вы обновляете табличное представление за ним.

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPathswithRowAnimation:(UITableViewRowAnimation)animation

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

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

Это круто, но если вы заставите его работать, держу пари, это будет довольно круто. Удачи.

person Danilo Campos    schedule 14.12.2009
comment
Спасибо, Данило, ты поставил меня на правильный путь. В итоге я заставил его работать, используя reloadRowsAtIndexPaths в didSelectRowAtIndexPath. Я проверяю, расширена ли ячейка, и устанавливаю соответствующую высоту в heightForRowAtIndexPath, как вы упомянули. Еще раз спасибо! - person Justin; 15.12.2009
comment
Очень круто! Рад помочь вам подтолкнуть. Надеюсь, это сработает. Может быть, я наконец-то попробую на днях. - person Danilo Campos; 15.12.2009
comment
[indexPath compare:expandedIndexPath] == NSOrderedSame следует записать как [indexPath isEqual:expandedIndexPath] - person user102008; 12.01.2011