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];
}
并且您必须确保您的委托和数据源提供的信息与您插入部分/行的断言一致。从您的问题来看,您似乎已经这样做了。
编辑:
我不认为你必须打电话给reloadData。 UITableView 要求您的数据模型反映您使用插入/删除方法所做的更改。因此,例如,如果在调用 insertSections:withRowAnimation:(使用它插入单个部分)之前,您的 numberOfSectionsInTableView: 方法返回 1,那么在调用之后,它必须返回2. 否则会引发异常。正是这种一致性的强制执行使您(再次,我认为)避免调用 reloadData - 整个 beginUpdates: endUpdates: 事务正在重新加载必要的数据,以及任何您在该事务期间对模型所做的更新必须与您的插入/删除调用一对一匹配。
一清二楚?
更新
如果您正在编写显式动画,那么我会说您可以在“完成处理程序”中进行(或者直接对动画进行编程),但在这里您无法使用。我认为您可以在视图中将按钮呈现代码包装在其自己的方法中,然后设置一个计时器以在短时间内调用它,例如 0.2 秒(您必须尝试看看什么看起来不错) .例如
[NSTimer scheduledTimerWithTimeInterval:.2 target:self selector:@selector(presentButton) userInfo:nil repeats:NO];
这应该可以解决问题。