2014-01-13 47 views
0

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

我尝试了这些(含各种动画(顶部,左,褪色等):

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

和它不是好像我在这里所描述的,但有些重装不清楚 其实我。希望看到的第4排走一路向上是第2行,当它与它的方式行更换地方。 这可能吗?

+0

请完全标记,因为Objective-C也适用于OSX。我标记了'ios'和'uitableview',为此我必须阅读完整的问题,最后在滚动到右后我才知道你想**'ios' ** –

回答

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]; 
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 
+0

他希望在单元格(UITableViewCells)上发生动画而不是在tableView上。 – santhu

0

使用 -

(void)moveRowAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath

方法;
所以,如果你想从4移动到2,首先从4移动到3然后3移动到2,它会工作。