带有动画的UITableview reloaddata


76

我有一个UITableView是从数组和下拉列表填充的。
如果我选择下拉列表的任何行,则将使用新值插入数组,并且应该重新加载tableview。

如何用新的数组内容为tableview设置动画?

像我这样的动画要逐行显示。我尝试过这种方法

- (void)reloadRowsAtIndexPaths:(NSArray )indexPaths withRowAnimation:(UITableViewRowAnimation)animation { 
NSIndexPath rowToReload = [NSIndexPath indexPathForRow:[names count] inSection:0];
 NSArray* rowsToReload = [NSArray arrayWithObjects:rowToReload, nil]; 
[tableDetails reloadRowsAtIndexPaths:rowsToReload withRowAnimation:UITableViewRowAnimationNone];
 }

什么样的动画?你有什么尝试做到这一点?
CRDave

像我这样的动画要一排一排地显示。我尝试了这种方法-(void)reloadRowsAtIndexPaths:(NSArray )indexPaths withRowAnimation:(UITableViewRowAnimation)animation {NSIndexPath rowToReload = [NSIndexPath indexPathForRow:[names count] inSection:0]; NSArray * rowsToReload = [NSArray arrayWithObjects:rowToReload,nil]; [tableDetails reloadRowsAtIndexPaths:rowsToReload withRowAnimation:UITableViewRowAnimationNone]; }
Naveen Pathiyil 2013年

1
将这段代码放在您的问题中,以便有人可以更好地帮助您。
CRDave

Answers:


116

要添加正确的答案,如果要重新加载您的所有部分,UITableView则需要执行以下操作:

对象

NSRange range = NSMakeRange(0, [self numberOfSectionsInTableView:self.tableView]);
NSIndexSet *sections = [NSIndexSet indexSetWithIndexesInRange:range];
[self.tableView reloadSections:sections withRowAnimation:UITableViewRowAnimationAutomatic];

迅速

let range = NSMakeRange(0, self.tableView.numberOfSections)  
let sections = NSIndexSet(indexesIn: range)               
self.tableView.reloadSections(sections as IndexSet, with: .automatic) 

这将使用动画重新加载表格视图中的所有内容。如同一位老板。


14
假定部分的数量没有改变。我通过此测试获得了安全性,[self.tableView numberOfSections] == [self numberOfSectionsInTableView:self.tableView]我只是打电话给它[self.tableView reloadData]
Axel Guilmin 2014年

是的,这是一种彻底的处理方法。
蒂姆·温莎·布朗

@AxelGuilmin你说的很对,否则会崩溃!
Bob de Graaf

Swift 3-让范围= NSMakeRange(0,self.tableView.numberOfSections)让部分= NSIndexSet(indexesIn:range)self.tableView.reloadSections(部分为IndexSet,带有:.automatic)
Cristian Cardoso

3
@TimWindsorBrown如何使用新数据“与原始数组中的不同数据”重新加载表视图
Mohammad Eliass Alhusain

66

斯威夫特5:

UIView.transition(with: tableView, duration: 1.0, options: .transitionCrossDissolve, animations: {self.tableView.reloadData()}, completion: nil)

迅捷3

UIView.transition(with: myTableView, duration: 1.0, options: .transitionCrossDissolve, animations: {self.myTableView.reloadData()}, completion: nil)

迅捷2

UIView.transitionWithView(myTableView, duration: 1.0, options: .TransitionCrossDissolve, animations: {self.myTableView.reloadData()}, completion: nil)

我在Swift中就这么做了


2
这是最好的解决方案,因为它允许在调用之前和之后重新加载具有不同行数的节
Enrico Cupellini

53

使用这种方法

[_tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];

7
如果您在重新加载过程中有多个分区或正在更改多个分区,则无法正常运行
Alexey F

2
@AlexeyF,然后将它们全部插入该NSIndexSet中,并调用上面的方法。如果您做不到,则您的代码设计有问题。
帕特里克·巴索

此外,如果你想保留部分头,但没有行..它没有给出正确的效果
萨米特格拉

22

首先,您要告诉tableView期望更新beginUpdates。然后更新相关部分(如果tableView只有一个部分,则只需将零传递为部分编号)。在这里指定动画-您可以在其中播放动画以获得所需的效果。之后,您调用endUpdatestableView。UITableViewRowAnimation的typedef指定:

typedef enum {
   UITableViewRowAnimationFade,
   UITableViewRowAnimationRight,
   UITableViewRowAnimationLeft,
   UITableViewRowAnimationTop,
   UITableViewRowAnimationBottom,
   UITableViewRowAnimationNone,
   UITableViewRowAnimationMiddle,
   UITableViewRowAnimationAutomatic = 100
} UITableViewRowAnimation;

随便看看您想要哪一个。即使选择UITableViewRowAnimationNone有时也会有很好的效果。表更新代码如下:

    [self.tableView beginUpdates];
    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
    [self.tableView endUpdates];

20

在Swift 3中,您只需将以下内容添加extensionUITableView

extension UITableView {
    func reloadData(with animation: UITableView.RowAnimation) {
        reloadSections(IndexSet(integersIn: 0..<numberOfSections), with: animation)
    }
}

3
这是解决我问题的好方法。谢谢芽!
Frizzo

1
很好的解决方案。对于使用swift 4的用户,UITableViewRowAnimation已重命名为UITableView.RowAnimation。
亚当·维尔

7

您可以使用reloadSections:withRowAnimation:功能。检查UITableView类参考

使用已经回答您问题的Animation来检查此reloadData


但是我必须在哪里放置代码?[tableDetails reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade]吗?
Naveen Pathiyil 2013年

选择下拉菜单后,您可以调用一个方法,将此代码放在此处。
arthankamal

从某种意义上讲,它是uitableview下拉列表,仅在索引路径处调用didselect行,然后用新内容填充数组,然后将其称为[tableview relaoaddata]。
Naveen Pathiyil 2013年

然后在您的didselectrow
arthankamal 2013年

3

tableView支持以下方法进行动画处理:

- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation NS_AVAILABLE_IOS(3_0);

用法:

//Reload tableView with animation
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationRight]; 

可用的动画类型有:

typedef NS_ENUM(NSInteger, UITableViewRowAnimation) {
UITableViewRowAnimationFade,
UITableViewRowAnimationRight,           // slide in from right (or out to right)
UITableViewRowAnimationLeft,
UITableViewRowAnimationTop,
UITableViewRowAnimationBottom,
UITableViewRowAnimationNone,            // available in iOS 3.0
UITableViewRowAnimationMiddle,          // available in iOS 3.2.  attempts to keep cell centered in the space it will/did occupy
UITableViewRowAnimationAutomatic = 100  // available in iOS 5.0.  chooses an appropriate animation style for you    };

希望这会有所帮助!


3

我已经尝试过了,我的动画效果TableAnimated流畅

//将此代码放在要重新加载表格视图的位置

dispatch_async(dispatch_get_main_queue(), ^{
    [UIView transitionWithView:<"TableName"> 
                      duration:0.1f 
                       options:UIViewAnimationOptionTransitionFlipFromRight 
                    animations:^(void) {
                        [<"TableName"> reloadData];
                    } completion:NULL];        
});

很棒的主意,解决了许多问题(例如,在使用其他方法时,需要避免最后一行被删除时崩溃等)。一种将Jump-reloadData转换为平滑reloadData的狡猾方法。加500!
杰夫

2

尝试在过渡时进行动画处理在重新加载UITableView时更改视图

[UIView transitionWithView:_yourTableView 
                  duration:0.40f 
                   options:UIViewAnimationOptionTransitionCrossDissolve 
                animations:^(void) {[_yourTableView reloadData];}  
                completion:nil];

0

斯威夫特5:

let section = 0
tableView.reloadSections([section], with: .automatic)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.