Анимированная перезагрузкаДата в UITableView
Как бы вы аниме - reloadData
on UITableView
? Источник данных находится на UIFetchedResultsController
, поэтому я не могу играть с – insertSections:withRowAnimation:
, – deleteSections:withRowAnimation:
, завернутым в – beginUpdates
, – endUpdates
.
EDIT:
Я хочу вызвать - reloadData
после NSFetchedResultsController
refetch.
Ответы
Ответ 1
Я использовал метод категории.
- (void)reloadData:(BOOL)animated
{
[self reloadData];
if (animated) {
CATransition *animation = [CATransition animation];
[animation setType:kCATransitionPush];
[animation setSubtype:kCATransitionFromBottom];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[animation setFillMode:kCAFillModeBoth];
[animation setDuration:.3];
[[self layer] addAnimation:animation forKey:@"UITableViewReloadDataAnimationKey"];
}
}
Ответ 2
Вы можете сделать базовую анимацию reLoadData, используя:
// Reload table with a slight animation
[UIView transitionWithView:tableViewReference
duration:0.5f
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^(void) {
[tableViewReference reloadData];
} completion:NULL];
Ответ 3
Вы можете просто вызывать эти строки, когда хотите перезагрузить всю таблицу анимацией:
NSRange range = NSMakeRange(0, [self numberOfSectionsInTableView:self.tableView]);
NSIndexSet *sections = [NSIndexSet indexSetWithIndexesInRange:range];
[self.tableView reloadSections:sections withRowAnimation:UITableViewRowAnimationFade];
Ответ 4
Вы не можете анимировать reloadData
. Вам нужно будет использовать методы табличного представления insert...
, delete...
, move...
и reloadRows...
, чтобы сделать его анимированным.
Это довольно просто при использовании NSFetchedResultsController
. Документация для NSFetchedResultsControllerDelegate
содержит набор примеров методов, которые вам нужно только адаптировать к вашему собственному коду:
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
[self.tableView beginUpdates];
}
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {
switch(type) {
case NSFetchedResultsChangeInsert:
[self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex]
withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex]
withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath {
UITableView *tableView = self.tableView;
switch(type) {
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[self configureCell:[tableView cellForRowAtIndexPath:indexPath]
atIndexPath:indexPath];
break;
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
[self.tableView endUpdates];
}
Ответ 5
Я создал метод категории UITableView
, основанный на решении от этой ссылки.
Он должен перезагрузить все разделы таблицы. Вы можете играть с параметрами UITableViewRowAnimation
для различных эффектов анимации.
- (void)reloadData:(BOOL)animated
{
[self reloadData];
if (animated)
{
[self reloadSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.numberOfSections)] withRowAnimation:UITableViewRowAnimationBottom];
}
}
Ответ 6
typedef enum {
UITableViewRowAnimationFade,
UITableViewRowAnimationRight,
UITableViewRowAnimationLeft,
UITableViewRowAnimationTop,
UITableViewRowAnimationBottom,
UITableViewRowAnimationNone,
UITableViewRowAnimationMiddle,
UITableViewRowAnimationAutomatic = 100
} UITableViewRowAnimation;
и метод:
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];
Ответ 7
Возможно, вы захотите использовать:
Objective-C
/* Animate the table view reload */
[UIView transitionWithView:self.tableView
duration:0.35f
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^(void)
{
[self.tableView reloadData];
}
completion:nil];
Swift
UIView.transitionWithView(tableView,
duration:0.35,
options:.TransitionCrossDissolve,
animations:
{ () -> Void in
self.tableView.reloadData()
},
completion: nil);
Параметры анимации:
TransitionNone
TransitionFlipFromLeft
TransitionFlipFromRight
TransitionCurlUp
TransitionCurlDown
TransitionCrossDissolve
TransitionFlipFromTop
TransitionFlipFromBottom
Ссылка