Обратный вызов UITableView после завершения анимации удаления строки - PullRequest
6 голосов
/ 18 мая 2011

У меня есть таблица с тенями над верхней и нижней ячейками (здесь используется решение Мэтта Галлахера: http://cocoawithlove.com/2009/08/adding-shadow-effects-to-uitableview.html). Они добавляются в метод layoutSubviews расширения класса UITableView.

Iдинамически добавлять и удалять ячейки под каждой основной ячейкой (они предоставляют дополнительные данные) - давайте назовем эти ячейки «подробности». За один раз открывается только одна ячейка. При удалении «ячейки подробностей» под последней основной ячейкой в ​​качестве анимацииначинается, тень перемещается вверх до последней ячейки (над ячейкой сведений), потому что методы layoutSubview считают, что последняя ячейка таблицы изменилась в момент начала анимации для deleteRowsAtIndexPaths (а не после окончания анимации).

Итак, по сути, мне нужен способ сохранить тень под ячейкой детали при удалении. Не уверен, что это лучший способ сделать это. Если UITableView больше не считает эту ячейку последнейячейка, то я не уверен, даже как получить ячейку (так как интерфейсTableView получает ячейку таким образом):

NSIndexPath *lastRow = [indexPathsForVisibleRows lastObject];
if ([lastRow section] == [self numberOfSections] - 1 &&
    [lastRow row] == [self numberOfRowsInSection:[lastRow section]] - 1)
 {
        //adds shadow below it here
     }

Таким образом, даже отлавливание начала анимации не очень полезно, если UITableView все еще думает, что основная ячейка над ячейкой detail - это lastObject.*

Спасибо за любые идеи.

Ответы [ 3 ]

4 голосов
/ 06 мая 2013

Попробуйте это

[CATransaction begin];

[tableView beginUpdates];

//...

[CATransaction setCompletionBlock: ^{
    // Code to be executed upon completion
}];

[tableView deleteRowsAtIndexPaths: indexPaths
                 withRowAnimation: UITableViewRowAnimationAutomatic];


[tableView endUpdates];

[CATransaction commit];
0 голосов
/ 13 августа 2015

Swift (идея та же самая, вы, конечно, можете использовать это в obj-c):

UIView.animateWithDuration(0.3, animations: { () -> Void in
    self.tableView.scrollToRowAtIndexPath(indexPathes, withRowAnimation: UITableViewRowAnimation.None)
}, completion: { (Bool) -> Void in
    // The logic you want to execute after the animation
})
0 голосов
/ 25 января 2013

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

Но если вы настаиваете, чтобы это продолжалось. перед удалением возьмите ссылку в своей переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...