Больше контроля над обновлением UITableView и UITableViewCell - PullRequest
0 голосов
/ 12 июня 2011

Я пытаюсь реализовать расширение 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и путь, но я не могу воспроизвести его.

Надеюсь, кто-нибудь может помочь мне в правильном направлении, спасибо:)

Ответы [ 2 ]

0 голосов
/ 03 сентября 2011

Лучший способ сделать это - добавить фиктивную ячейку ниже ячейки, которая была нажата.Я объясняю это очень здесь .

В основном:

  1. Отслеживайте, какие ячейки были нажаты в вашем didSelectRowAtIndexPath и обновляйте его соответствующим образом.Какой из них нужно удалить?Где будет новая фиктивная ячейка?
  2. Верните правильный счет, когда присутствует фиктивная ячейка.
  3. Учитывайте тот факт, что фиктивная ячейка не является частью вашей модели.Смещение indexPath.
0 голосов
/ 12 июня 2011

Я не совсем уверен, что точно понял ваш вопрос :) Но вы можете использовать Key Value Observer (KVO), чтобы проверить, когда вам нужно воспроизвести анимацию, а затем вызвать метод перезагрузки таблицы.

- (void)reloadTable
{

if (self.isViewLoaded) {
    [self.tableView reloadData];
}

}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
[self reloadTable]; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...