Можете ли вы настраивать анимацию для встраиваемых ячеек UITableView?

У меня есть UITableView, который заполняется NSFetchedResultsController.

При начальной загрузке таблицы я хотел бы, чтобы ячейки были анимированы, но я хотел бы сделать немного больше пользовательской анимации, чем

[tableView insertRowsAtIndexPaths:withRowAnimation:]; 

Позволяет. В частности, я хотел бы замедлить анимацию и заставить их летать со стороны определенным образом. Я не смог достичь этого с помощью констант UITableViewRowAnimation. Есть ли способ использовать Core Animation для выполнения именно того, что я хочу, или мне нужно придерживаться анимации UIKit в этом конкретном экземпляре?

Спасибо за любую помощь!

Joel

НОВОЕ РЕШЕНИЕ (2017-12-12)

Добавление версии метода анимации Swift 4.0 . Затем он должен быть реализован так же, как и решение ниже:

 func animate() { for cell in self.tableView.visibleCells { cell.frame = CGRect(x: self.tableView.frame.size.width, y: cell.frame.origin.y, width: cell.frame.size.width, height: cell.frame.size.height) UIView.animate(withDuration: 1.0) { cell.frame = CGRect(x: 0, y: cell.frame.origin.y, width: cell.frame.size.width, height: cell.frame.size.height) } } } 

NEWER SOLUTION (2015-09-05)

Добавление версии метода анимации Swift 2.0. Затем он должен быть реализован так же, как и решение ниже:

 func animate() { for cell in self.tableView.visibleCells { cell.frame = CGRectMake(320, cell.frame.origin.y, cell.frame.size.width, cell.frame.size.height) UIView.animateWithDuration(1.0) { cell.frame = CGRectMake(0, cell.frame.origin.y, cell.frame.size.width, cell.frame.size.height) } } } 

NEW SOLUTION (2014-09-28)

Я немного переработал решение, чтобы сделать реализацию более простой и заставить ее работать с iOS8. Все, что вам нужно сделать, это добавить этот метод animate в свой TableViewController и вызвать его всякий раз, когда вы хотите его оживить (например, в вашем методе перезагрузки, но вы можете его вызвать в любое время):

 - (void)animate { [[self.tableView visibleCells] enumerateObjectsUsingBlock:^(UITableViewCell *cell, NSUInteger idx, BOOL *stop) { [cell setFrame:CGRectMake(320, cell.frame.origin.y, cell.frame.size.width, cell.frame.size.height)]; [UIView animateWithDuration:1 animations:^{ [cell setFrame:CGRectMake(0, cell.frame.origin.y, cell.frame.size.width, cell.frame.size.height)]; }]; }]; } 

Снова измените анимацию, как вам нравится. Этот конкретный код будет анимировать ячейки справа с медленной скоростью.

OLD SOLUTION (2013-06-06)

Вы можете сделать это, реализовав свой собственный UITableView и переопределив метод insertRowsAtIndexPaths. Вот пример того, как это могло бы выглядеть, когда клетки будут сдвигаться с правой стороны, очень медленно (1 секунда анимации):

 - (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation { for (NSIndexPath *indexPath in indexPaths) { UITableViewCell *cell = [self cellForRowAtIndexPath:indexPath]; [cell setFrame:CGRectMake(320, cell.frame.origin.y, cell.frame.size.width, cell.frame.size.height)]; [UIView beginAnimations:NULL context:nil]; [UIView setAnimationDuration:1]; [cell setFrame:CGRectMake(0, cell.frame.origin.y, cell.frame.size.width, cell.frame.size.height)]; [UIView commitAnimations]; } } 

Вы можете поиграть с анимацией самостоятельно. Этот метод автоматически не будет вызываться табличным представлением, поэтому вам необходимо переопределить метод reloadData в делегате представления таблиц и вызвать этот метод самостоятельно.

КОММЕНТАРИЙ

Метод reloadData должен выглядеть примерно так:

 - (void)reloadData { [super reloadData]; NSMutableArray *indexPaths = [[NSMutableArray alloc] init]; for (int i = 0; i < [_data count]; i++) [indexPaths addObject:[NSIndexPath indexPathForRow:i inSection:0]]; [self insertRowsAtIndexPaths:indexPaths withRowAnimation:0]; } 

Ответ materik не работал для меня с iOS 7.1 SDK, у меня было ноль после вызова [self cellForRowAtIndexPath:indexPath];

Вот мой код в подclassе UITableView :

 - (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation { [super insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone]; [self endUpdates]; // Populates UITableView with data [self beginUpdates]; for (NSIndexPath *indexPath in indexPaths) { __block UITableViewCell *cell = [super cellForRowAtIndexPath:indexPath]; if (cell) { // If indexPath isn't visible we'll get nil here // Custom animation CGRect frame = cell.frame; frame.origin.x = cell.frame.size.width; cell.frame = frame; frame.origin.x = 0; void (^animationsBlock)() = ^{ cell.frame = frame; }; if ([[UIView class] respondsToSelector: @selector(animateWithDuration:delay:usingSpringWithDamping: initialSpringVelocity:options:animations:completion:)]) { [UIView animateWithDuration:0.3 delay:0 usingSpringWithDamping:0.5 initialSpringVelocity:0 options:0 animations:animationsBlock completion:NULL]; } else { [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:animationsBlock completion:NULL]; } } } } 

Использовать это:

 -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{ [cell setFrame:CGRectMake(320, cell.frame.origin.y, cell.frame.size.width, cell.frame.size.height)]; [UIView animateWithDuration:2 animations:^{ [cell setFrame:CGRectMake(100, cell.frame.origin.y, cell.frame.size.width, cell.frame.size.height)]; }]; } 

Swift 3.0 версия ответа Маттиаса Эрикссона

 func animate() { for cell in tblView.visibleCells { cell.frame = CGRect(x:320, y:cell.frame.origin.y, width:cell.frame.size.width, height:cell.frame.size.height) UIView.animate(withDuration: 1.0) { cell.frame = CGRect(x:0, y:cell.frame.origin.y, width:cell.frame.size.width, height:cell.frame.size.height) } } } 
  • Как правильно представить popover из UITableViewCell с помощью UIPopoverArrowDirectionRight или UIPopoverArrowDirectionLeft
  • NSMutableArray - заставить массив удерживать только определенный тип объекта
  • Формат NSDate, выводящий неверную дату
  • iPhone: конвертировать строку даты в относительную отметку времени
  • NSTimeZone: в чем разница между localTimeZone и systemTimeZone?
  • iPhone Facebook Загрузка видео
  • Добавить анимированное изображение Gif в Iphone UIImageView
  • Как я могу перебирать все подпункты UIView, а также их подзоны и их подпрограммы
  • UIPageViewController не возвращает никаких распознавателей жестов в iOS 6
  • Анимированный gif не работает в наложении MKMapView с использованием MKOverlayRenderer
  • API, чтобы определить, работает ли на iPhone или iPad
  • Interesting Posts

    Вентилятор входит в нижнюю или верхнюю часть блока питания?

    От многих до многих сопоставление с дополнительными полями в Fluent API

    gem на windowsх

    Excel: если значение дублирующейся ячейки найдено в другом столбце, выделите зеленый цвет

    Как взять хороший аварийный дамп для .NET?

    Конфигурирование ObjectMapper весной

    почему 1 >> 32 == 1?

    Нет Интернета через веб-браузер, но Skype по-прежнему работает

    Как создать пользовательскую 3d-модель в JavaFX 8?

    почему мой метод сравнения исключает исключение – метод сравнения нарушает общий контракт!

    Является ли перегрузка метода рассмотренным polymorphismом?

    Android, как я могу получить список всех файлов в папке?

    Где я должен хранить специальные настройки приложения?

    Невозможно создать постоянное значение типа В этом контексте поддерживаются только примитивные типы или типы перечислений

    MediaRecorder и VideoSource.SURFACE, остановка не удалось: -1007 (серьезная ошибка Android)

    Давайте будем гением компьютера.