如何在没有剪切行/子视图的情况下调整tableView的大小调整动画?

时间:2009-10-13 06:25:16

标签: objective-c cocoa-touch uitableview uikit core-animation

编辑:我最初就一般视图调整大小问过这个问题,但我现在意识到这是tableViews更具体的东西。

假设tableView最初的帧为(0 0,320 460),即它填满了整个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,上面的动画代码将导致这一系列事件:

  1. tableView立即删除底部的5行。请注意,它只删除行 - tableView的背景仍然延伸到底部。
  2. tableView按预期动画显示表格其余部分的高度变化。
  3. 这不是我要找的行为。 tableView不应立即剪切底部的5行,而应将其行保持在原位,而表格的下边缘只是向上动画。

    根据我所看到的行为,似乎tableView在发现其边界将发生变化后立即获得某种消息来刷新其行。有人能否对这种行为有所了解以及如何避免这种行为?

2 个答案:

答案 0 :(得分:1)

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

我不确定只是更改代码来修改框架而不是边界将解决问题,但我建议从那里开始。如果这没有解决它,那么问题可能是tableview立即删除了对新帧不可见的行,所以如果是这样的话,唯一的解决办法就是自己做动画。设置一个简单的NSTimer驱动的例程,随着时间的推移慢慢改变帧大小/位置,从而创建你想要的幻觉,尽管tableview的优化或与Core Animation的交互。

答案 1 :(得分:0)

您是否尝试更改动画块中的边界中心。

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