在UITableVIew中插入新部分的动画

时间:2012-02-28 12:40:43

标签: ios uitableview animation

我的视图中有这个按钮,当我按下它时,我在表格视图中插入一个新的部分(我的逻辑状态

-(NSInteger) numberOfSectionsInTableView:(UITableView*)tableView
{
    if (slide==TRUE) return 2;
    return 1;
}

还在我的-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath。我的部分是按照它应该添加的,但我已经读过某个地方可以动画,因为当我按下我的按钮时,该部分被添加但没有动画。我想我应该使用这个-(void)insertSections:(NSIndexSet*)sections withRowanimation(UITableViewRowAnimation) animation,但我还没有在网上找到一个合适的例子。

3 个答案:

答案 0 :(得分:31)

使用以下API(强调最后两个),使用动画将行和节操作到UITableView非常简单:

更新数据模型

您应该在beginUpdatesendUpdates方法之间的任何位置更新数据模型。如果您在插入或删除方法之前或之后更新数据模型,只要在beginUpdatesendUpdates方法之间进行更新就无关紧要。

不要为要插入的新部分插入行

使用insertSections:withRowAnimation:方法添加新版块时,您无需调用insertRowsAtIndexPaths:withRowAnimation:即可向其中添加行。 insertRowsAtIndexPaths:withRowAnimation:方法仅用于为现有的部分更改设置动画。同样,使用deleteRowsAtIndexPaths:withRowAnimation:删除部分时,您无需致电deleteSections:withRowAnimation:

关于删除和插入:

我通常在单独的beginUpdates: endUpdates次调用中执行这些操作,但您可以同时插入和删除。请注意,UITableView将首先尝试删除行/部分,然后尝试插入,无论您在代码中执行此操作的顺序

讨论 deleteRowsAtIndexPaths:withRowAnimation:

的一部分
  

注意在动画中调用此方法时的行为   由beginUpdates和endUpdates方法定义的块。 UITableView的   延迟任何行或部分的插入,直到它处理完毕   行或节的删除。无论订购如何,这都会发生   插入和删除方法调用。这与插入不同   或删除操作可能影响的可变数组中的项目   用于连续插入或删除的数组索引   操作。有关此主题的更多信息,请参阅“批量插入和删除”   “表格视图编程指南”中的“行和章节”。

插入部分的示例:

int indexOfNewSection = 4; // TODO: change to meaningful value
[self.tableview beginUpdates];
[self.tableview insertSections:[NSIndexSet indexSetWithIndex:indexOfNewSection]
              withRowAnimation:UITableViewRowAnimationAutomatic];

// Update data model
[self.sections insertObject:sectionObj atIndex:indexOfNewSection];

[self.tableview endUpdates];

答案 1 :(得分:18)

UITableViewRowAnimation是在UITableView.h顶部声明的枚举。您也可以在UITableView reference中查看它。它很小,所以我只是粘贴它!

typedef enum {
    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
} UITableViewRowAnimation;

基本上它告诉表格视图你想要在哪个方向上动画输入/输出行/部分。一个小小的实验将证明每个人的效果。

例如,使用UITableViewRowAnimationTop插入一行将触发一个动画,该动画会在表视图中从紧邻其最终目标位置的空间进入表视图中的行。

所以你的插入可能如下:

-(void)sliderValueChanged:(id)slider {
   slide = slider.on;

   [tableView beginUpdates];

   if (slider.on) {
      [tableView insertSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationTop];
      // TODO: update data model by inserting new section
   } else {
      [tableView deleteSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationTop];
      // TODO: update data model by removing approprite section
   }

   [tableView endUpdates];
}

并且您必须确保您的委托和数据源提供与插入节/行的断言一致的信息。从您的问题来看,您似乎已经这样做了。

编辑:

我不你必须致电reloadDataUITableView要求您的数据模型反映您使用插入/删除方法所做的更改。因此,例如,如果在调用insertSections:withRowAnimation:(用于插入单个部分)之前,numberOfSectionsInTableView:方法返回1,那么在调用之后,必须< / em> return 2.否则抛出异常。正是这种一致性强制允许您(再次,我认为)避免调用reloadData - 整个beginUpdates: {{1}正在重新加载必要的数据事务,以及您在该事务期间对模型所做的任何更新必须与您的插入/删除调用一对一匹配。

清除泥土?

更新

如果您正在编写显式动画,那么我会说您可以在“完成处理程序”中执行此操作(或者直接针对该问题直接编写动画),但这不适用于您。我认为你可以在视图中用自己的方法包装按钮呈现代码,然后设置一个计时器,在很短的时间后调用它,比如说.2秒(你必须尝试看看看起来不错的东西) 。 e.g。

endUpdates:

这应该可以解决问题。

答案 2 :(得分:0)

- (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation

这个方法所指出的肯定会有所作为。

可能你可以试试这个:

[self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];

直接写出我的想法..希望这会有所帮助...

请注意:

  1. 可以使用任何UITableViewRowAnimation
  2. 上述代码中的
  3. sectionIndex是NSInteger。可能在你的情况下1。