最新解决方案 (2017-12-12)
添加Swift 4.0版本的 animate 方法。然后应该以与以下解决方案相同的方式实现它:
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)
}
}
}
更新的解决方案 (2015-09-05)
添加 Swift 2.0 版本的 animate 方法。然后应该以与以下解决方案相同的方式实现它:
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)
}
}
}
新解决方案 (2014-09-28)
我对解决方案进行了一些修改,以使实现更容易并使其与 iOS8 一起使用。您需要做的就是animate
在 TableViewController 中添加此方法,并在您希望它动画时调用它(例如,在您的 reload 方法中,但您可以随时调用它):
- (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)];
}];
}];
}
再次,改变你喜欢的动画。此特定代码将以较慢的速度从右侧为单元格设置动画。
旧解决方案 (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];
}