从insertRowsAtIndexPaths上剪切防止UITableView超出单元格绑定视图:

时间:2014-07-31 23:17:43

标签: ios uitableview animation insert clip

视频显示当插入新单元格时,具有延伸到单元格区域外的视图的单元格会暂时被截断:

https://dl.dropboxusercontent.com/u/22105205/CellClipping.mov

这个简单项目清楚地显示了问题,可以用于快速原型制作:

https://github.com/AndresCanella/iOSInsertCellClippingExample.git

  • 此裁剪仅在表发生变异时发生。
  • 细胞清晰。
  • 细胞在未发生变异时正确显示。

可能是某种优化,只使用单元格区域内的pix进行动画制作?

一切都设置正确,稳定,并按预期工作,我们甚至没有使用此示例中的特定单元格数据:

[tableView beginUpdates];
self.cells++;
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight];
[tableView endUpdates];

更新

来自DTS的回应:

我担心在调用“insertRowsAtIndexPaths”时,无论您使用何种“UITableViewRowAnimation”,都无法直接影响插入动画行为。细胞内容通常不像那样重叠。在执行每个单元格的动画块时,UITableView只是尊重单元格的边界(不是它的扩展或重叠内容)。

我的评论:

DTS告诉我,事情可以做很多次,而且我总能找到解决方法。所以现在我正在寻找一个解决方案。

Apple Bug报告#17986466

3 个答案:

答案 0 :(得分:0)

在我看来,您希望不被裁剪的视图超出了单元格本身的界限。对我而言,这说明这些应该是表格视图的子视图而不是单元格。

如果情况确实如此,您可能希望使用普通的UIScrollView而不是UITableView,并为下方插入的视图设置动画。

答案 1 :(得分:0)

根据我的经验,您应该尝试使单元格保持非透明/透明背景,并设置为剪辑子视图,如果您想避免奇怪的布局和动画故障。

单元格查看层次结构的方式是在表格视图中设置的,动画的制作方式是Apple实施的内部方式,在将来的版本中容易发生变化,恕不另行通知。


表视图擅长显示大量行和重用视图,这些内容可能是您的视图未真正使用的。如果您所需的布局不需要多个可滚动内容的屏幕,您可能应该尝试创建自己的基于UIScrollView的自定义视图,或搜索众多开源库中的一个。您可以完全控制动画并添加自定义行为。

答案 2 :(得分:0)

我知道这是一个完整的黑客 - 但它确实修复了剪辑。

对于粒状动画 - 请查看PRTWeen。 https://github.com/jdp-global/MWDatePicker

我猜您考虑在当前单元格和之前的单元格上切换2个透明背景图像(红色和绿色)(640px x100px)?它可以在插入时使用淡入淡出动画。

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    self.cells++;
    [self.tb reloadData];

    [self performSelector:@selector(fancyAnimate:) withObject:indexPath afterDelay:0];


}
-(void)fancyAnimate:(NSIndexPath*)path{
    NSIndexPath *idx = [NSIndexPath indexPathForRow:path.row inSection:path.section] ;

    UITableViewCell *cell = (UITableViewCell*)[self.tb cellForRowAtIndexPath:idx];
    CGRect frame = cell.frame;
    frame.origin.x = 320;
    cell.frame = frame;

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.25];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    frame.origin.x = 0;
    cell.frame = frame;
    [UIView commitAnimations];


}