在对行进行排序时,动态查看表格

时间:2014-01-13 14:17:53

标签: ios objective-c uitableview

我有tableView,其中填充了一些NSMutableArray。 后来当我对数组进行排序时,我希望表格视图能够将每一行缓慢移动到新的位置,慢慢地我的意思是大约0.3秒,所以你可以看到开关。

我试过这些(有各种动画(上,左,淡出等):

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationTop];

它似乎不像我在这里描述的那样,但有些不清楚重装。 我实际上希望看到第4行一直到第2行,当它替换行的方式向上时。 有可能吗?

3 个答案:

答案 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];