我有tableView
,其中填充了一些NSMutableArray
。
后来当我对数组进行排序时,我希望表格视图能够将每一行缓慢移动到新的位置,慢慢地我的意思是大约0.3秒,所以你可以看到开关。
我试过这些(有各种动画(上,左,淡出等):
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationTop];
它似乎不像我在这里描述的那样,但有些不清楚重装。 我实际上希望看到第4行一直到第2行,当它替换行的方式向上时。 有可能吗?
答案 0 :(得分:0)
您可以创建UITableView
类别,并调用reloadDataAnimated:YES
,这会在重新加载表格数据时添加淡入淡出效果:
#import <QuartzCore/QuartzCore.h>
@implementation UITableView (Animated)
- (void)reloadDataAnimated:(BOOL)animated
{
[self reloadData];
if (animated)
{
CATransition *animation = [CATransition animation];
[animation setType:kCATransitionFade];
[animation setSubtype:kCATransitionFromBottom];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[animation setFillMode:kCAFillModeBoth];
[animation setDuration:.3];
[[self layer] addAnimation:animation forKey:@"UITableViewReloadDataAnimationKey"];
}
}
@end
答案 1 :(得分:0)
使用 -
(void)moveRowAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath
方法;
所以,如果你想从4变为2,首先从4变为3,然后从3变为2.它将起作用。
答案 2 :(得分:0)
您需要明确告诉tableview哪一行应移动到哪里。我使用下面的代码,这对我很有用。 “ObjectMap”是我自己的类,在这种情况下将对象映射到数字。有点像NSDictionary,但使用对象指针进行比较。
NSArray *originalList = ...
ObjectMap *map = [ObjectMap objectMap];
NSUInteger index = 0;
for (Waypoint *waypoint in originalList) {
[map setObject:[NSNumber numberWithInteger:index++] forObjectKey:waypoint];
}
NSArray *sortedList = ... // sorted version of the originalList
// do the animations
[CATransaction begin];
[CATransaction setCompletionBlock:^{
[theTableView reloadData];
}];
[theTableView beginUpdates];
index = 0;
for (Waypoint *waypoint in sortedList) {
NSNumber *originalIndex = [map objectForKey:waypoint];
[theTableView moveRowAtIndexPath:[NSIndexPath indexPathForRow:[originalIndex integerValue] inSection:0]
toIndexPath:[NSIndexPath indexPathForRow:index++ inSection:0]];
}
[theTableView endUpdates];
[CATransaction commit];