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 - reloadData
on UITableView
? Data source is on UIFetchedResultsController
so 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 - reloadData
after NSFetchedResultsController
refetch.
编辑:我想- 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 NSFetchedResultsControllerDelegate
contains 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 UITableView
category method based on solution from this link.
我UITableView
根据此链接中的解决方案创建了一个 类别方法。
It should reload all the table sections. You can play with UITableViewRowAnimation
options 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")
}