Я пытаюсь реализовать расширение UITableViewCells
, где у меня есть полный контроль над анимацией перехода от свернутого к развернутому и обратно.У меня есть массив, cellDataList
, который содержит состояние моего UITableViewCells
, то есть height
, color
, data
, isExpanded
и т. Д.
Я реализую:
- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath == selectedIndex)
return expandedHeight;
return collapsedHeight;
}
и я реализую:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
/*
some logic that tests if the indexPath is already selected,
which will collapse the cell, if a previous cell needs to be collapsed before the
new expands etc.
*/
[tableView beginUpdates];
[tableView reloadRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationNone];
[tableView endUpdates];
}
Моя ячейка является пользовательской UITableViewCell
, где я создаю свой контент в drawRect:
В ячейке есть UIView
(фон), который служит в качестве пользовательскойфон для ячейки, это представление, которое я хотел бы
анимировать из свернутого в развернутое и обратно, а не просто установить фрейм за один «прыжок», как это происходит сейчас.
Я не могу понять, гдечтобы «перехватить» цепочку обновлений tableView, чтобы добиться этого.
Когда я выполняю [tableView beginUpdates] - [tableView endUpdates]
выше, он начинает немного запутывать происходящее.Я предполагаю, что
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
вызывается для обновления ячеек по указанным индексам.Это в свою очередь спросит heightForCellAtIndexPath
, какую высоту установить в ячейку.Если я установлю точку останова в моих пользовательских ячейках setFrame:
, я вижу, что вызывающий абонент
[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] ().
Это устанавливает новый кадр для ячейки, тогда я предполагаю, что [cell setNeedsDisplay]
вызывается как-то, чтобы ячейка могласделать для предоставленной рамки.[cell setNeedsDisplay]
в конце концов вызовет мой пользовательский drawRect:
и отобразит содержимое ячейки.Это работает, как и ожидалось, но я не могу понять, где и как я буду анимировать рамку для моего фона, также таким образом, чтобы это делалось только при нажатии, а не каждый раз, когда вызывается setFrame:
(во время прокрутки и т. Д.).Когда я делаю вышеописанное, tableView анимирует, чтобы освободить место для нового размера ячейки, именно эту анимацию я хотел бы «имитировать» с фоновым представлением в моей ячейке.
Я вижу этот эффект в приложениях, таких как Tweetbotи путь, но я не могу воспроизвести его.
Надеюсь, кто-нибудь может помочь мне в правильном направлении, спасибо:)