Objective c 如何在不剪裁行/子视图的情况下设置表视图大小调整的动画?

Objective c 如何在不剪裁行/子视图的情况下设置表视图大小调整的动画?,objective-c,cocoa-touch,uitableview,uikit,core-animation,Objective C,Cocoa Touch,Uitableview,Uikit,Core Animation,编辑:我最初问这个关于一般视图大小调整的问题,但现在我意识到这是一个更具体的关于TableView的问题 假设一个tableView最初的框架是(0320460),也就是说,它填充了整个iPhone屏幕。为了调整tableView的高度并设置调整大小的动画,我将以下代码映射到一个按钮: [UIView beginAnimations:@"Animation" context:nil]; [UIView setAnimationDuration:3]; CGRect rect = self.ta

编辑:我最初问这个关于一般视图大小调整的问题,但现在我意识到这是一个更具体的关于TableView的问题

假设一个tableView最初的框架是(0320460),也就是说,它填充了整个iPhone屏幕。为了调整tableView的高度并设置调整大小的动画,我将以下代码映射到一个按钮:

[UIView beginAnimations:@"Animation" context:nil];
[UIView setAnimationDuration:3];

CGRect rect = self.table.bounds;
rect.size = CGSizeMake(320, 200);
self.table.bounds = rect;
self.table.center = CGPointMake(160, 100);

[UIView commitAnimations]; 
此代码将设置表格高度向下的动画,但是…在任何动画发生之前,表格将剪切掉所有不适合新边界的表格单元格。因此,给定一个最初适合10行的tableView,上面的动画代码将导致以下事件序列:

  • tableView会立即删除底部的5行。请注意,它只删除行-tableView的背景仍然延伸到底部
  • tableView按预期为表格的其余部分设置高度更改动画
  • 这不是我想要的行为。与立即剪切底部5行不同,tableView应该在表格底部边缘向上动画时保持其行的位置


    根据我看到的行为,似乎tableView在发现其边界将要更改后立即收到某种消息来刷新其行。有人能解释一下这种行为吗?我怎样才能避免它?

    您是否尝试过在动画块中更改边界和中心


    我不知道这个具体的案例,但我以前也做过类似的事情。框架、边界和中心之间的关系有时令人沮丧。

    视图的边界属性定义了视图的内部坐标空间。如果要更改视图的大小和/或位置,则只应更改视图的边框。从理论上讲,bounds属性可以定义一个完全任意的坐标空间,该空间与视图的封闭框架断开,而UIKit似乎就是为了支持这种区别而设计的。在实践中,我不认为我在UIKit中见过它是这样工作的(bounds.size始终与frame.size相同,bounds.origin始终为{0,0}),但这就是这里所做的区别,记住这一点很重要——特别是如果这种行为在将来发生变化的话


    我不确定仅仅改变代码来修改框架而不是边界就能解决问题,但我建议从这里开始。如果这不能解决问题,那么问题可能是tableview会立即删除新帧中不可见的行,如果是这样,唯一的解决方案可能是自己制作动画,方法是设置一个简单的NSTimer驱动例程,随着时间的推移慢慢改变帧的大小/位置,从而创建所需的幻觉,尽管tableview进行了优化或与核心动画交互。

    是的,尝试了这一点,其效果与仅更改帧相同(表格在设置动画之前将下半部分切掉)。我觉得这和scrollView的contentSize有关,但我还没弄明白。