2009-12-14 6 views
5

Можно создать дубликат:
Can you animate a height change on a UITableViewCell when selected?высота Animate UITableViewCell по выбору

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

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

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

ответ

6

Там нет другого механизма для определения высоты ячейки, чем 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; 

} 

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

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

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

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

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

+1

Спасибо Данило, ты меня начал по правильному пути. Я закончил работу с использованием reloadRowsAtIndexPaths в файле didSelectRowAtIndexPath. Я проверяю, расширяется ли ячейка и задает соответствующую высоту в heightForRowAtIndexPath, как и вы упомянули. Еще раз спасибо! – Justin

+1

Слишком круто! Рад дать вам полезный толчок. Надеюсь, это сработает. Может быть, я, наконец, попробую себя на днях. –

+1

'[indexPath compare: expandIndexPath] == NSOrderedSame' должно быть записано как' [indexPath isEqual: expandIndexPath] ' – user102008

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