ios UITableView 上的动画 reloadData
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/7547934/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Animated reloadData on UITableView
提问by user500
How would you anime - reloadDataon UITableView? Data source is on UIFetchedResultsControllerso I can't play with – insertSections:withRowAnimation:, – deleteSections:withRowAnimation:wrapped in – beginUpdates, – endUpdates.
你将如何动画- reloadData上UITableView?数据源已打开,UIFetchedResultsController因此我无法使用– insertSections:withRowAnimation:,– deleteSections:withRowAnimation:包裹在– beginUpdates, 中– endUpdates。
EDIT:
I want to call - reloadDataafter NSFetchedResultsControllerrefetch.
编辑:我想- reloadData在NSFetchedResultsController重新获取后调用。
回答by user500
I did category method.
我做了分类方法。
- (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"];
}
}
回答by Vincent
You can make a basic animation of reLoadData using:
您可以使用以下方法制作 reLoadData 的基本动画:
// Reload table with a slight animation
[UIView transitionWithView:tableViewReference
duration:0.5f
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^(void) {
[tableViewReference reloadData];
} completion:NULL];
回答by barrast
You can simply call this lines when you want to reload the entire table with an animation:
当您想用动画重新加载整个表格时,您可以简单地调用此行:
NSRange range = NSMakeRange(0, [self numberOfSectionsInTableView:self.tableView]);
NSIndexSet *sections = [NSIndexSet indexSetWithIndexesInRange:range];
[self.tableView reloadSections:sections withRowAnimation:UITableViewRowAnimationFade];
回答by Ole Begemann
You cannot animate reloadData. You will have to use the table view's insert..., delete..., move...and reloadRows...methods to make it animate.
你不能制作动画reloadData。你将不得不使用表视图的insert...,delete...,move...和reloadRows...方法,从而使它动画。
This is pretty straightforward when using an NSFetchedResultsController. The documentation for NSFetchedResultsControllerDelegatecontains a set of sample methods that you just have to adapt to your own code:
使用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];
}
回答by Despotovic
I created a UITableViewcategory method based on solution from this link.
我UITableView根据此链接中的解决方案创建了一个 类别方法。
It should reload all the table sections. You can play with UITableViewRowAnimationoptions for different animation effects.
它应该重新加载所有表格部分。您可以使用UITableViewRowAnimation不同动画效果的选项。
- (void)reloadData:(BOOL)animated
{
[self reloadData];
if (animated)
{
[self reloadSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.numberOfSections)] withRowAnimation:UITableViewRowAnimationBottom];
}
}
回答by Robert Varga
typedef enum {
UITableViewRowAnimationFade,
UITableViewRowAnimationRight,
UITableViewRowAnimationLeft,
UITableViewRowAnimationTop,
UITableViewRowAnimationBottom,
UITableViewRowAnimationNone,
UITableViewRowAnimationMiddle,
UITableViewRowAnimationAutomatic = 100
} UITableViewRowAnimation;
and the method:
和方法:
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];
回答by Zaid Pathan
You might want to use:
您可能想要使用:
Objective-C
目标-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);
Animation options:
动画选项:
TransitionNone
TransitionFlipFromLeft
TransitionFlipFromRight
TransitionCurlUp
TransitionCurlDown
TransitionCrossDissolve
TransitionFlipFromTop
TransitionFlipFromBottom
TransitionNone
TransitionFlipFromLeft
TransitionFlipFromRight
TransitionCurlUp
TransitionCurlDown
TransitionCrossDissolve
TransitionFlipFromTop
TransitionFlipFromBottom
回答by Nurtugan Nuraly
Swift 5.1 version of answer @user500(https://stackoverflow.com/users/620297/user500)
Swift 5.1 版本的答案@user500( https://stackoverflow.com/users/620297/user500)
func reloadData(_ animated: Bool) {
reloadData()
guard animated else { return }
let animation = CATransition()
animation.type = .push
animation.subtype = .fromBottom
animation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
animation.fillMode = .both
animation.duration = 0.3
layer.add(animation, forKey: "UITableViewReloadDataAnimationKey")
}

