UITableView анимированные строки, переупорядочивание при сортировке - PullRequest
15 голосов
/ 22 февраля 2011

У меня есть таблица, которую пользователи могут сортировать двумя разными способами. Когда пользователи переключаются между этими двумя режимами сортировки, я хочу, чтобы пересортировка была анимированной. И хотя методы UITableView предоставляют анимационную справку для вставки, удаления и перезагрузки строк, я не вижу ничего, что позволяло бы мне анимировать движение строк.

Я что-то упустил?

Если предположить, что нет, у кого-нибудь есть пример кода, как это сделать?

Спасибо.

Ответы [ 3 ]

34 голосов
/ 11 декабря 2012

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

Мой TableView получает данные из массива с именем _objects.В моем методе сортировки я начинаю с создания другого массива, который является точной копией массива данных:

    NSArray *objectsBeforeSort = [NSArray arrayWithArray:_objects];

Затем я сортирую массив данных, _objects, используя дескрипторы сортировки, которые я уже создал,После вызова соответствующего метода сортировки в моем массиве, я использую это для анимации обновления таблицы:

[self.tableView beginUpdates];

for (int i = 0; i < _objects.count; i++)
{
    // newRow will get the new row of an object.  i is the old row.
    int newRow = [_objects indexOfObject:objectsBeforeSort[i]];
    [self.tableView moveRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0] toIndexPath:[NSIndexPath indexPathForRow:newRow inSection:0]];
}


[self.tableView endUpdates];

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

1 голос
/ 05 января 2012

Вы пытались использовать moveRowAtIndexPath: toIndexPath: внутри блока beginUpdates-endUpdates?Похоже, это то, что разработчики в настоящее время рекомендуют.Если это не работает само по себе, вы также можете попробовать обернуть его в блок [UIView animateWithDuration: animations:].

Ссылка на документацию АЦП для UITableView: https://developer.apple.com/library/ios/#documentation/UIKit/Reference/UITableView_Class/Reference/Reference.html#//apple_ref/doc/c_ref/UITableView

0 голосов
/ 04 февраля 2019

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

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

  • Сортировка выполняется в новый массив.Требования к памяти удваиваются.

  • Алгоритм неэффективен.Для каждого значения в отсортированном массиве исходный массив сканируется на предмет источника значения.

  • Даже при эффективном алгоритме, кто хочет видеть 10000 анимированных строк?Создание 10000 представлений, даже 500 представлений, было бы нежелательным.

При этом, если бы это было необходимо сделать, лучшим решением было бы создание собственной функции сортировки слиянием, которая сортируетили возьмите реализацию сортировки из репозиториев Swift.Создайте отдельный класс, который отслеживает движение каждого индекса в массиве.Наконец, только анимируйте видимые ряды плюс охват.Табличное представление имеет эту информацию.

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

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